From d63adcb214c6bc2a72c5b5bb7bd30abc391138dd Mon Sep 17 00:00:00 2001
From: zhang <zc857179121@qq.com>
Date: 星期五, 03 十月 2025 15:31:37 +0800
Subject: [PATCH] 1

---
 src/main/java/com/zy/core/thread/SiemensCrnThread.java |  509 ++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 386 insertions(+), 123 deletions(-)

diff --git a/src/main/java/com/zy/core/thread/SiemensCrnThread.java b/src/main/java/com/zy/core/thread/SiemensCrnThread.java
index 9587987..4a93d3b 100644
--- a/src/main/java/com/zy/core/thread/SiemensCrnThread.java
+++ b/src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -16,7 +16,9 @@
 import com.zy.core.CrnThread;
 import com.zy.core.cache.MessageQueue;
 import com.zy.core.cache.OutputQueue;
-import com.zy.core.enums.*;
+import com.zy.core.enums.CrnStatusType;
+import com.zy.core.enums.CrnTaskModeType;
+import com.zy.core.enums.SlaveType;
 import com.zy.core.model.CrnSlave;
 import com.zy.core.model.Task;
 import com.zy.core.model.command.CrnCommand;
@@ -39,6 +41,7 @@
     private CrnSlave slave;
     private CrnProtocol crnProtocol;
     private boolean resetFlag = false;
+    private boolean resetFlagTwo = false;
 
     public boolean isRunning = true;
 
@@ -69,11 +72,16 @@
                     case 1:
                         readStatus();
                         break;
-                    // 鍐欏叆鏁版嵁
+                    // 鍐欏叆鏁版嵁 1鍙峰伐浣�
                     case 2:
-                        write((CrnCommand) task.getData());
+                        CrnCommand data = (CrnCommand) task.getData();
+                        if (data.getPltType() == null || data.getPltType() == 1) {
+                            write(data);
+                        } else if (data.getPltType() == 2) {
+                            write2(data);
+                        }
                         break;
-                    // 澶嶄綅
+                    // 澶嶄綅 1鍙峰伐浣�
                     case 3:
                         CrnCommand command = (CrnCommand) task.getData();
                         if (null == command) {
@@ -83,14 +91,33 @@
                         command.setTaskNo((short) 0); // 宸ヤ綔鍙�
                         command.setAckFinish((short) 1);  // 浠诲姟瀹屾垚纭浣�
                         command.setTaskMode(CrnTaskModeType.NONE); // 浠诲姟妯″紡
-                        command.setSourcePosX((short)0);     // 婧愬簱浣嶆帓
-                        command.setSourcePosY((short)0);     // 婧愬簱浣嶅垪
-                        command.setSourcePosZ((short)0);     // 婧愬簱浣嶅眰
-                        command.setDestinationPosX((short)0);     // 鐩爣搴撲綅鎺�
-                        command.setDestinationPosY((short)0);     // 鐩爣搴撲綅鍒�
-                        command.setDestinationPosZ((short)0);     // 鐩爣搴撲綅灞�
+                        command.setSourcePosX((short) 0);     // 婧愬簱浣嶆帓
+                        command.setSourcePosY((short) 0);     // 婧愬簱浣嶅垪
+                        command.setSourcePosZ((short) 0);     // 婧愬簱浣嶅眰
+                        command.setDestinationPosX((short) 0);     // 鐩爣搴撲綅鎺�
+                        command.setDestinationPosY((short) 0);     // 鐩爣搴撲綅鍒�
+                        command.setDestinationPosZ((short) 0);     // 鐩爣搴撲綅灞�
                         write(command);
                         break;
+                    // 澶嶄綅 2鍙峰伐浣�
+                    case 6:
+                        CrnCommand command2 = (CrnCommand) task.getData();
+                        if (null == command2) {
+                            command2 = new CrnCommand();
+                        }
+                        command2.setCrnNo(slave.getId()); // 鍫嗗灈鏈虹紪鍙�
+                        command2.setTaskNo((short) 0); // 宸ヤ綔鍙�
+                        command2.setAckFinish((short) 1);  // 浠诲姟瀹屾垚纭浣�
+                        command2.setTaskMode(CrnTaskModeType.NONE); // 浠诲姟妯″紡
+                        command2.setSourcePosX((short) 0);     // 婧愬簱浣嶆帓
+                        command2.setSourcePosY((short) 0);     // 婧愬簱浣嶅垪
+                        command2.setSourcePosZ((short) 0);     // 婧愬簱浣嶅眰
+                        command2.setDestinationPosX((short) 0);     // 鐩爣搴撲綅鎺�
+                        command2.setDestinationPosY((short) 0);     // 鐩爣搴撲綅鍒�
+                        command2.setDestinationPosZ((short) 0);     // 鐩爣搴撲綅灞�
+                        write2(command2);
+                        break;
+
                     default:
                         break;
                 }
@@ -111,14 +138,15 @@
         }
         crnProtocol.setMode((short) -1);
 //        crnProtocol.setTaskNo((short)0);
-        crnProtocol.setStatus((short)-1);
-        crnProtocol.setBay((short)0);
-        crnProtocol.setLevel((short)0);
+        crnProtocol.setStatus((short) -1);
+        crnProtocol.setStatusTwo((short) -1);
+        crnProtocol.setBay((short) 0);
+        crnProtocol.setLevel((short) 0);
         crnProtocol.setForkPos((short) -1);
         crnProtocol.setLiftPos((short) -1);
-        crnProtocol.setWalkPos((short)0);
-        crnProtocol.setLoaded((short)0);
-        crnProtocol.setAlarm((short)0);
+        crnProtocol.setWalkPos((short) 0);
+        crnProtocol.setLoaded((short) 0);
+        crnProtocol.setAlarm((short) 0);
         crnProtocol.setxSpeed((short) 0);
         crnProtocol.setySpeed((short) 0);
         crnProtocol.setzSpeed((short) 0);
@@ -135,13 +163,13 @@
         siemensNet.setRack(slave.getRack().byteValue());
         siemensNet.setSlot(slave.getSlot().byteValue());
         OperateResult connect = siemensNet.ConnectServer();
-        if(connect.IsSuccess){
+        if (connect.IsSuccess) {
             result = true;
-            OutputQueue.CRN.offer(MessageFormat.format( "銆恵0}銆戝爢鍨涙満plc杩炴帴鎴愬姛 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
-            News.info("SiemensCrn"+" - 1"+" - 鍫嗗灈鏈簆lc杩炴帴鎴愬姛 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
+            OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆戝爢鍨涙満plc杩炴帴鎴愬姛 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
+            News.info("SiemensCrn" + " - 1" + " - 鍫嗗灈鏈簆lc杩炴帴鎴愬姛 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
         } else {
             OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆戝爢鍨涙満plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
-            News.error("SiemensCrn"+" - 2"+" - 鍫嗗灈鏈簆lc杩炴帴澶辫触锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
+            News.error("SiemensCrn" + " - 2" + " - 鍫嗗灈鏈簆lc杩炴帴澶辫触锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
             initCrn();
         }
 //        siemensNet.ConnectClose();
@@ -151,7 +179,7 @@
     /**
      * 璇诲彇鐘舵��
      */
-    private void readStatus(){
+    private void readStatus() {
         try {
             OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 56);
             if (result.IsSuccess) {
@@ -165,34 +193,72 @@
                 crnProtocol.setBay(siemensNet.getByteTransform().TransInt16(result.Content, 6));
                 crnProtocol.setLevel(siemensNet.getByteTransform().TransInt16(result.Content, 8));
                 crnProtocol.setForkPos(siemensNet.getByteTransform().TransInt16(result.Content, 10));
-                crnProtocol.setLiftPos(siemensNet.getByteTransform().TransInt16(result.Content, 12));
-                crnProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 14));
-                crnProtocol.setLoaded(siemensNet.getByteTransform().TransInt16(result.Content, 16));
-                crnProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 18));
-                crnProtocol.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 20));
-                crnProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 22));
-                crnProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 24));
-                crnProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 26));
-                crnProtocol.setxSpeed(siemensNet.getByteTransform().TransSingle(result.Content, 28));
-                crnProtocol.setySpeed(siemensNet.getByteTransform().TransSingle(result.Content, 32));
-                crnProtocol.setzSpeed(siemensNet.getByteTransform().TransSingle(result.Content, 36));
-                crnProtocol.setxDistance(siemensNet.getByteTransform().TransSingle(result.Content, 40));
-                crnProtocol.setyDistance(siemensNet.getByteTransform().TransSingle(result.Content, 44));
-                crnProtocol.setxDuration(siemensNet.getByteTransform().TransSingle(result.Content, 48));
-                crnProtocol.setyDuration(siemensNet.getByteTransform().TransSingle(result.Content, 52));
+                crnProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 26));
+                crnProtocol.setWalkPosTwo(siemensNet.getByteTransform().TransInt16(result.Content, 28));
+                crnProtocol.setLiftPos(siemensNet.getByteTransform().TransInt16(result.Content, 30));
 
-                OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
+                crnProtocol.setLoaded(siemensNet.getByteTransform().TransInt16(result.Content, 12));
+                crnProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 32));
+
+
+
+                //crnProtocol.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 20));
+                //crnProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 22));
+                //crnProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 24));
+                //crnProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 26));
+                crnProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 34));
+                crnProtocol.setySpeed(siemensNet.getByteTransform().TransInt16(result.Content, 38));
+                crnProtocol.setzSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 42));
+                crnProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 46));
+                crnProtocol.setyDistance(siemensNet.getByteTransform().TransInt16(result.Content, 50));
+                crnProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 54));
+                crnProtocol.setyDuration(siemensNet.getByteTransform().TransInt16(result.Content, 58));
+
+                //2宸ヤ綅
+                crnProtocol.setTaskNoTwo(siemensNet.getByteTransform().TransInt16(result.Content, 14));
+                crnProtocol.setStatusTwo(siemensNet.getByteTransform().TransInt16(result.Content, 16));
+                crnProtocol.setBayTwo(siemensNet.getByteTransform().TransInt16(result.Content, 18));
+                crnProtocol.setLevelTwo(siemensNet.getByteTransform().TransInt16(result.Content, 20));
+                crnProtocol.setForkPosTwo(siemensNet.getByteTransform().TransInt16(result.Content, 22));
+                crnProtocol.setLoadedTwo(siemensNet.getByteTransform().TransInt16(result.Content, 24));
+
+
+                OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛", DateUtils.convert(new Date()), slave.getId()));
 
                 // 澶嶄綅淇″彿
                 if (!Cools.isEmpty(crnProtocol.getStatusType()) && crnProtocol.getStatusType().equals(CrnStatusType.WAITING)) {
+                    News.error("---绗竴姝ャ�乕鍫嗗灈鏈哄彿锛歿}, 宸ヤ綔鍙凤細{}, 杞借揣鍙颁俊鍙�:{}]==>> 鐘舵�佷负10锛岀瓑寰呯‘璁わ紒锛�",
+                            slave.getId(), crnProtocol.getTaskNo(), crnProtocol.getLoaded() == 1 ? "鏈夌墿" : "鏃犵墿");
                     if (resetFlag) {
-                        if(crnProtocol.getTaskNo()==9999){
+                        if (crnProtocol.getTaskNo() == 9999) {
                             backHpFlag = false;
                         }
+                        Short wrkNo = crnProtocol.getTaskNo();
                         CrnCommand crnCommand = new CrnCommand();
-                        crnCommand.setAckFinish((short)1);
+                        crnCommand.setAckFinish((short) 1);
                         if (write(crnCommand)) {
                             resetFlag = false;
+                            News.error("---绗簩姝ャ�乕鍫嗗灈鏈哄彿锛歿}, 宸ヤ綔鍙凤細{}]==>> 澶嶄綅resetFlag鏍囪鎴愬姛{}锛侊紒",
+                                    slave.getId(), wrkNo, resetFlag);
+                        }
+                    }
+                }
+
+                // 澶嶄綅淇″彿
+                if (!Cools.isEmpty(crnProtocol.getStatusType()) && crnProtocol.getStatusTypeTwo().equals(CrnStatusType.WAITING)) {
+                    News.error("---绗竴姝ャ�乕鍫嗗灈鏈哄彿锛歿}, 宸ヤ綔鍙凤細{}, 杞借揣鍙颁俊鍙�:{}]==>> 鐘舵�佷负10锛岀瓑寰呯‘璁わ紒锛�",
+                            slave.getId(), crnProtocol.getTaskNo(), crnProtocol.getLoaded() == 1 ? "鏈夌墿" : "鏃犵墿");
+                    if (resetFlagTwo) {
+                        if (crnProtocol.getTaskNo() == 9999) {
+                            backHpFlag = false;
+                        }
+                        Short wrkNo = crnProtocol.getTaskNo();
+                        CrnCommand crnCommand = new CrnCommand();
+                        crnCommand.setAckFinish((short) 1);
+                        if (write2(crnCommand)) {
+                            resetFlagTwo = false;
+                            News.error("---绗簩姝ャ�乕鍫嗗灈鏈哄彿锛歿}, 宸ヤ綔鍙凤細{}]==>> 澶嶄綅resetFlag鏍囪鎴愬姛{}锛侊紒",
+                                    slave.getId(), wrkNo, resetFlag);
                         }
                     }
                 }
@@ -202,21 +268,22 @@
                     BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class);
                     BasCrnp basCrnp = new BasCrnp();
                     basCrnp.setCrnNo(slave.getId());
-                    basCrnp.setCrnSts((int)crnProtocol.getMode());
-                    if (!basCrnpService.updateById(crnProtocol.toSqlModel(basCrnp))){
-                        News.error("SiemensCrn"+" - 3"+" - 鍫嗗灈鏈簆lc鏁版嵁搴撴洿鏂板け璐� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
+                    basCrnp.setCrnSts((int) crnProtocol.getMode());
+                    if (!basCrnpService.updateById(crnProtocol.toSqlModel(basCrnp))) {
+                        News.error("SiemensCrn" + " - 3" + " - 鍫嗗灈鏈簆lc鏁版嵁搴撴洿鏂板け璐� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
                     }
-                } catch (Exception ignore){}
+                } catch (Exception ignore) {
+                }
 
             } else {
                 initCrn();
                 OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆戣鍙栧爢鍨涙満plc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
-                News.error("SiemensCrn"+" - 4"+" - 璇诲彇鍫嗗灈鏈簆lc鐘舵�佷俊鎭け璐� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
+                News.error("SiemensCrn" + " - 4" + " - 璇诲彇鍫嗗灈鏈簆lc鐘舵�佷俊鎭け璐� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
             }
         } catch (Exception e) {
             e.printStackTrace();
             OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆戣鍙栧爢鍨涙満plc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
-            News.error("SiemensCrn"+" - 5"+" - 璇诲彇鍫嗗灈鏈簆lc鐘舵�佷俊鎭け璐� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+            News.error("SiemensCrn" + " - 5" + " - 璇诲彇鍫嗗灈鏈簆lc鐘舵�佷俊鎭け璐� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
             initCrn();
         }
     }
@@ -239,8 +306,8 @@
             return false;
         }
         // 鍚戝爢鍨涙満鍙戜换鍔″墠鐨勫爢鍨涙満鐘舵��
-        try{
-            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24);
+        try {
+            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 18);
             if (resultRead.IsSuccess) {
                 CrnCommand one = new CrnCommand();
                 one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
@@ -255,19 +322,19 @@
                         || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY())
                         || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX())
                         || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ())
-                ){
-                    News.error("涓嬪彂鍓嶏細[id:{}] >>>>> 鍐欏叆[{}],===>>鍥炶[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
+                ) {
+//                    News.error("涓嬪彂鍓嶏細[id:{}] >>>>> 鍐欏叆[{}],===>>鍥炶[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                 } else {
-                    News.info("涓嬪彂鍓嶏細[id:{}] >>>>> 鍐欏叆[{}],===>>鍥炶[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
+//                    News.info("涓嬪彂鍓嶏細[id:{}] >>>>> 鍐欏叆[{}],===>>鍥炶[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                 }
             }
-        }catch (Exception e){
+        } catch (Exception e) {
             News.error("鍫嗗灈鏈哄懡浠ゅ湴鍧�鍐欏叆鍚庡洖璇诲嚭閿�");
         }
 //        convertRow(command);
         command.setCrnNo(slave.getId());
 //        short[] array = new short[10];
-        short[] array = new short[10];
+        short[] array = new short[9];
         array[0] = command.getAckFinish(); // 浠诲姟瀹屾垚纭浣�
         array[1] = command.getTaskNo();  // 浠诲姟鍙�
         array[2] = command.getTaskMode();  // 妯″紡
@@ -277,65 +344,77 @@
         array[6] = command.getDestinationPosX();  // 鐩爣浣嶇疆鎺掑彿
         array[7] = command.getDestinationPosY(); // 鐩爣浣嶇疆鍒楀彿
         array[8] = command.getDestinationPosZ(); // 鐩爣浣嶇疆灞傚彿
-        array[9] = command.getCommand();
 //        array[10] = 0;   //澶囩敤1
 
-        boolean[] array2 = new boolean[1];
-        array2[0] = command.isTraySize();
-        OperateResult result = siemensNet.Write("DB100.0", array);
-        OperateResult result2 = siemensNet.Write("DB100.22", array2);
-        News.info("鍫嗗灈鏈哄懡浠や笅鍙慬id:{}] >>>>> {}", slave.getId(), array);
 
-        if(!result.IsSuccess || !result2.IsSuccess){
-            News.error("鍐欏叆鍫嗗灈鏈簆lc鏁版嵁澶辫触锛岄噸鏂版坊鍔犱换鍔″埌闃熷垪 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
-            MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command));
-            Thread.sleep(100);
-            readStatus();
-            return false;
-        }
+        OperateResult result = siemensNet.Write("DB100.0", array);
+        News.info("鍫嗗灈鏈哄懡浠や笅鍙慬id:{}] >>>>> {}", slave.getId(), array);
 
         //鍫嗗灈鏈轰换鍔″啓鍏ュ悗锛屽洖璇讳竴娆★紝鐪嬫槸鍚︽垚鍔�
         Thread.sleep(200);
-        try{
-            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24);
-            if (resultRead.IsSuccess) {
-                CrnCommand one = new CrnCommand();
-                one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
-                one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
-                one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
-                one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
-                one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
-                one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12));
-                one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
-                one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
-                one.setTraySize(siemensNet.getByteTransform().TransBool(resultRead.Content, 22));
-                if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode())
-                        || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY())
-                        || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX())
-                        || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ())
-                        || !command.isTraySize() == one.isTraySize()
-                ){
-                    try{
-                        News.error("鍫嗗灈鏈哄懡浠ゅ湴鍧�鍐欏叆鍚庡洖璇诲け璐id:{}] >>>>> 鍐欏叆[{}],===>>鍥炶[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
-                    }catch (Exception e){
-                        try{
-                            News.error("鏃ュ織鎵撳嵃澶辫触锛�===>>鍙傛暟one鎶ラ敊 [id:{}],{}", slave.getId(), JSON.toJSON(command),JSON.toJSON(resultRead));
-                        }catch (Exception e1){
-                            News.error("鏃ュ織鎵撳嵃澶辫触锛�===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
-                        }
-                    }
-                    News.error("鍫嗗灈鏈哄懡浠ゅ洖璇诲け璐ュ悗锛岄噸鏂版坊鍔犱换鍔″埌闃熷垪 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
-                    MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command));
+        int writeCount1 = 1;
+
+        do {
+            try {
+                if (!result.IsSuccess) {
+//                    if (!resetFlag){
+                    News.error("鍐欏叆鍫嗗灈鏈簆lc鏁版嵁澶辫触锛岄噸鏂颁笅鍙戜换鍔�  鍐欏叆鐩存帴澶辫触 ===>> [id:{}],{},[鍐欏叆娆℃暟:{}]", slave.getId(), JSON.toJSON(command), writeCount1);
+                    result = siemensNet.Write("DB100.0", array);
+
+//                    }
                     Thread.sleep(100);
-                    readStatus();
-                    return false;
-                } else {
-                    News.info("鍫嗗灈鏈哄懡浠ゅ湴鍧�鍐欏叆鍚庡洖璇绘垚鍔焄id:{}] >>>>> 鍐欏叆[{}],===>>鍥炶[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
+                    writeCount1++;
+                    continue;
                 }
+                OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 18);
+                if (resultRead.IsSuccess) {
+                    CrnCommand one = new CrnCommand();
+                    one.setAckFinish(siemensNet.getByteTransform().TransInt16(resultRead.Content, 0));
+                    one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
+                    one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
+                    one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
+                    one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
+                    one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
+                    one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12));
+                    one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
+                    one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
+                    if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode())
+                            || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY())
+                            || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX())
+                            || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ())
+                            || !command.getAckFinish().equals(one.getAckFinish())
+                    ) {
+                        try {
+                            News.error("鍫嗗灈鏈哄懡浠ゅ湴鍧�鍐欏叆鍚庡洖璇诲け璐�==>涓嶄竴鑷碵id:{}] >>>>> 鍐欏叆[{}],===>>鍥炶[{}]", slave.getId(), JSON.toJSON(command), JSON.toJSON(one));
+                        } catch (Exception e) {
+                            try {
+                                News.error("鏃ュ織鎵撳嵃澶辫触锛�===>>鍙傛暟one鎶ラ敊 [id:{}],{}", slave.getId(), JSON.toJSON(command), JSON.toJSON(resultRead));
+                            } catch (Exception e1) {
+                                News.error("鏃ュ織鎵撳嵃澶辫触锛�===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
+                            }
+                        }
+
+                        try {
+                            Thread.sleep(100);
+                        } catch (Exception e) {
+
+                        }
+//                        if (!resetFlag){
+                        News.error("鍐欏叆鍫嗗灈鏈簆lc鏁版嵁澶辫触锛岄噸鏂颁笅鍙戜换鍔�  鍥炶涓嶄竴鑷� ===>> [id:{}],{},[鍐欏叆娆℃暟:{}]", slave.getId(), JSON.toJSON(command), writeCount1);
+                        result = siemensNet.Write("DB100.0", array);
+//                        }
+                        writeCount1++;
+                        continue;
+                    } else {
+                        News.info("鍫嗗灈鏈哄懡浠ゅ湴鍧�鍐欏叆鍚庡洖璇绘垚鍔焄id:{}] >>>>> 鍐欏叆[{}],===>>鍥炶[{}]", slave.getId(), JSON.toJSON(command), JSON.toJSON(one));
+                        break;
+                    }
+                }
+            } catch (Exception e) {
+                News.error("鍫嗗灈鏈哄懡浠ゅ湴鍧�鍐欏叆鍚庡洖璇诲嚭閿�,寮傚父锛�" + e);
             }
-        }catch (Exception e){
-            News.error("鍫嗗灈鏈哄懡浠ゅ湴鍧�鍐欏叆鍚庡洖璇诲嚭閿�");
-        }
+            writeCount1++;
+        } while (writeCount1 < 6);
 
 
         if (command.getAckFinish() == 0) {
@@ -347,37 +426,30 @@
                 do {
                     writeCount2++;
                     short commandFinish = (short) 1;
-                    result = siemensNet.Write("DB100.18", commandFinish);
-                    if(result.IsSuccess){
+                    result = siemensNet.Write("DB100.38", commandFinish);
+                    if (result.IsSuccess) {
                         //鍫嗗灈鏈轰换鍔″啓鍏ュ悗锛屽洖璇讳竴娆★紝鐪嬫槸鍚︽垚鍔�
                         Thread.sleep(200);
-                        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.18", (short) 2);
+                        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.38", (short) 2);
                         if (resultRead.IsSuccess) {
-                            commandFinish=siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
-                            if (commandFinish != 1){
-                                News.error("鍫嗗灈鏈轰换鍔$‘璁や綅"+commandFinish+"鍐欏叆鏁版嵁涓庡洖璇绘暟鎹笉涓�鑷达紒"+"寰幆鎵ц娆℃暟:"+writeCount2+"娆�");
-                            }else{
+                            commandFinish = siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
+                            if (commandFinish != 1) {
+                                News.error("鍫嗗灈鏈轰换鍔$‘璁や綅" + commandFinish + "鍐欏叆鏁版嵁涓庡洖璇绘暟鎹笉涓�鑷达紒" + "寰幆鎵ц娆℃暟:" + writeCount2 + "娆�");
+                            } else {
                                 //浠诲姟鍛戒护鍐欏叆鎴愬姛
-                                News.info("鍫嗗灈鏈轰换鍔$‘璁や綅"+commandFinish+"鍥炶鎴愬姛锛�"+"寰幆鎵ц娆℃暟:"+writeCount2+"娆�");
+                                News.info("鍫嗗灈鏈轰换鍔$‘璁や綅" + commandFinish + "鍥炶鎴愬姛锛�" + "寰幆鎵ц娆℃暟:" + writeCount2 + "娆�");
                                 break;
                             }
-                        }else {
-                            News.error("鍫嗗灈鏈轰换鍔$‘璁や綅"+commandFinish+"鍥炶澶辫触锛�"+"寰幆鎵ц娆℃暟:"+writeCount2+"娆�");
+                        } else {
+                            News.error("鍫嗗灈鏈轰换鍔$‘璁や綅" + commandFinish + "鍥炶澶辫触锛�" + "寰幆鎵ц娆℃暟:" + writeCount2 + "娆�");
                         }
                     } else {
-                        News.error("鍫嗗灈鏈轰换鍔$‘璁や綅"+commandFinish+"鍐欏叆澶辫触锛�"+"寰幆鎵ц娆℃暟:"+writeCount2+"娆�");
+                        News.error("鍫嗗灈鏈轰换鍔$‘璁や綅" + commandFinish + "鍐欏叆澶辫触锛�" + "寰幆鎵ц娆℃暟:" + writeCount2 + "娆�");
                     }
-                }while (writeCount2<5);
+                } while (writeCount2 < 5);
             }
         }
 
-//        if (command.getAckFinish() == 0) {
-//            short commandFinish = 1;
-//            Thread.sleep(200L);
-//            result = siemensNet.Write("DB100.18", commandFinish);
-//            log.info("鍫嗗灈鏈篶ommandFinish涓嬪彂[id:{}] >>>>> {}", slave.getId(), commandFinish);
-////            result = siemensNet.Write("DB100.22", commandFinish);
-//        }
 
         try {
             // 鏃ュ織璁板綍
@@ -400,12 +472,203 @@
                     null    // 淇敼浜哄憳
             );
             bean.insert(basCrnOpt);
-        } catch (Exception ignore) {}
+        } catch (Exception ignore) {
+        }
 
         if (result != null && result.IsSuccess) {
             Thread.sleep(200);
             this.readStatus();
-            News.info("鍫嗗灈鏈哄懡浠や笅鍙慬id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
+//            News.info("鍫嗗灈鏈哄懡浠や笅鍙慬id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
+            OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆慬id:{1}] >>>>> 鍛戒护涓嬪彂锛� {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
+            return true;
+        } else {
+            OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆戝啓鍏ュ爢鍨涙満plc鏁版嵁澶辫触 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+            News.error("鍐欏叆鍫嗗灈鏈簆lc鏁版嵁澶辫触 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+            return false;
+        }
+    }
+
+    /**
+     * 鍐欏叆鏁版嵁
+     */
+    private boolean write2(CrnCommand command) throws InterruptedException {
+        if (null == command) {
+            News.error("鍫嗗灈鏈哄啓鍏ュ懡浠や负绌�");
+            return false;
+        }
+        // 鍚戝爢鍨涙満鍙戜换鍔″墠鐨勫爢鍨涙満鐘舵��
+        try {
+            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.20", (short) 18);
+            if (resultRead.IsSuccess) {
+                CrnCommand one = new CrnCommand();
+                one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
+                one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
+                one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
+                one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
+                one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
+                one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12));
+                one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
+                one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
+                if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode())
+                        || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY())
+                        || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX())
+                        || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ())
+                ) {
+//                    News.error("涓嬪彂鍓嶏細[id:{}] >>>>> 鍐欏叆[{}],===>>鍥炶[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
+                } else {
+//                    News.info("涓嬪彂鍓嶏細[id:{}] >>>>> 鍐欏叆[{}],===>>鍥炶[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
+                }
+            }
+        } catch (Exception e) {
+            News.error("鍫嗗灈鏈哄懡浠ゅ湴鍧�鍐欏叆鍚庡洖璇诲嚭閿�");
+        }
+//        convertRow(command);
+        command.setCrnNo(slave.getId());
+//        short[] array = new short[10];
+        short[] array = new short[9];
+        //array[0] = command.getAckFinish(); // 浠诲姟瀹屾垚纭浣�
+        array[0] = command.getTaskNo();  // 浠诲姟鍙�
+        array[1] = command.getTaskMode();  // 妯″紡
+        array[2] = command.getSourcePosX(); // 婧愪綅缃帓鍙�
+        array[3] = command.getSourcePosY(); // 婧愪綅缃垪鍙�
+        array[4] = command.getSourcePosZ(); // 婧愪綅缃眰鍙�
+        array[5] = command.getDestinationPosX();  // 鐩爣浣嶇疆鎺掑彿
+        array[6] = command.getDestinationPosY(); // 鐩爣浣嶇疆鍒楀彿
+        array[7] = command.getDestinationPosZ(); // 鐩爣浣嶇疆灞傚彿
+        array[8] = command.getCommand();
+//        array[10] = 0;   //澶囩敤1
+
+        short[] array2 = new short[1];
+        array2[0] = command.getAckFinish();
+        OperateResult result = siemensNet.Write("DB100.20", array);
+        OperateResult result2 = siemensNet.Write("DB100.0", array2);
+        News.info("鍫嗗灈鏈哄懡浠や笅鍙慬id:{}] >>>>> {}", slave.getId(), array);
+
+        int writeCount1 = 1;
+        do {
+            try {
+                if (!result.IsSuccess || !result2.IsSuccess) {
+//                    if (!resetFlag){
+                    News.error("鍐欏叆鍫嗗灈鏈簆lc鏁版嵁澶辫触锛岄噸鏂颁笅鍙戜换鍔�  鍐欏叆鐩存帴澶辫触 ===>> [id:{}],{},[鍐欏叆娆℃暟:{}]", slave.getId(), JSON.toJSON(command), writeCount1);
+                    result = siemensNet.Write("DB100.0", array);
+//                    }
+                    Thread.sleep(100);
+                    writeCount1++;
+                    continue;
+                }
+                OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.20", (short) 18);
+                if (resultRead.IsSuccess) {
+                    CrnCommand one = new CrnCommand();
+                    one.setAckFinish(siemensNet.getByteTransform().TransInt16(resultRead.Content, 0));
+                    one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 20));
+                    one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 22));
+                    one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 24));
+                    one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 26));
+                    one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 28));
+                    one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 30));
+                    one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 32));
+                    one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 34));
+                    if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode())
+                            || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY())
+                            || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX())
+                            || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ())
+                            || !command.getAckFinish().equals(one.getAckFinish())
+                    ) {
+                        try {
+                            News.error("鍫嗗灈鏈哄懡浠ゅ湴鍧�鍐欏叆鍚庡洖璇诲け璐�==>涓嶄竴鑷碵id:{}] >>>>> 鍐欏叆[{}],===>>鍥炶[{}]", slave.getId(), JSON.toJSON(command), JSON.toJSON(one));
+                        } catch (Exception e) {
+                            try {
+                                News.error("鏃ュ織鎵撳嵃澶辫触锛�===>>鍙傛暟one鎶ラ敊 [id:{}],{}", slave.getId(), JSON.toJSON(command), JSON.toJSON(resultRead));
+                            } catch (Exception e1) {
+                                News.error("鏃ュ織鎵撳嵃澶辫触锛�===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
+                            }
+                        }
+
+                        try {
+                            Thread.sleep(100);
+                        } catch (Exception e) {
+
+                        }
+//                        if (!resetFlag){
+                        News.error("鍐欏叆鍫嗗灈鏈簆lc鏁版嵁澶辫触锛岄噸鏂颁笅鍙戜换鍔�  鍥炶涓嶄竴鑷� ===>> [id:{}],{},[鍐欏叆娆℃暟:{}]", slave.getId(), JSON.toJSON(command), writeCount1);
+                        result = siemensNet.Write("DB100.0", array);
+//                        }
+                        writeCount1++;
+                        continue;
+                    } else {
+                        News.info("鍫嗗灈鏈哄懡浠ゅ湴鍧�鍐欏叆鍚庡洖璇绘垚鍔焄id:{}] >>>>> 鍐欏叆[{}],===>>鍥炶[{}]", slave.getId(), JSON.toJSON(command), JSON.toJSON(one));
+                        break;
+                    }
+                }
+            } catch (Exception e) {
+                News.error("鍫嗗灈鏈哄懡浠ゅ湴鍧�鍐欏叆鍚庡洖璇诲嚭閿�,寮傚父锛�" + e);
+            }
+            writeCount1++;
+        } while (writeCount1 < 6);
+
+
+        if (command.getAckFinish() == 0) {
+            if (result.IsSuccess) {
+                Thread.sleep(300);
+                //浠诲姟涓嬪彂娆℃暟
+                int writeCount2 = 0;
+
+                do {
+                    writeCount2++;
+                    short commandFinish = (short) 1;
+                    result = siemensNet.Write("DB100.38", commandFinish);
+                    if (result.IsSuccess) {
+                        //鍫嗗灈鏈轰换鍔″啓鍏ュ悗锛屽洖璇讳竴娆★紝鐪嬫槸鍚︽垚鍔�
+                        Thread.sleep(200);
+                        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.38", (short) 2);
+                        if (resultRead.IsSuccess) {
+                            commandFinish = siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
+                            if (commandFinish != 1) {
+                                News.error("鍫嗗灈鏈轰换鍔$‘璁や綅" + commandFinish + "鍐欏叆鏁版嵁涓庡洖璇绘暟鎹笉涓�鑷达紒" + "寰幆鎵ц娆℃暟:" + writeCount2 + "娆�");
+                            } else {
+                                //浠诲姟鍛戒护鍐欏叆鎴愬姛
+//                                News.info("鍫嗗灈鏈轰换鍔$‘璁や綅"+commandFinish+"鍥炶鎴愬姛锛�"+"寰幆鎵ц娆℃暟:"+writeCount2+"娆�");
+                                break;
+                            }
+                        } else {
+                            News.error("鍫嗗灈鏈轰换鍔$‘璁や綅" + commandFinish + "鍥炶澶辫触锛�" + "寰幆鎵ц娆℃暟:" + writeCount2 + "娆�");
+                        }
+                    } else {
+                        News.error("鍫嗗灈鏈轰换鍔$‘璁や綅" + commandFinish + "鍐欏叆澶辫触锛�" + "寰幆鎵ц娆℃暟:" + writeCount2 + "娆�");
+                    }
+                } while (writeCount2 < 5);
+            }
+        }
+
+
+        try {
+            // 鏃ュ織璁板綍
+            BasCrnOptService bean = SpringUtils.getBean(BasCrnOptService.class);
+            BasCrnOpt basCrnOpt = new BasCrnOpt(
+                    command.getTaskNo().intValue(),    // 浠诲姟鍙�
+                    command.getCrnNo(),    // 鍫嗗灈鏈篬闈炵┖]
+                    new Date(),    // 涓嬪彂鏃堕棿
+                    command.getTaskModeType().toString(),    // 妯″紡
+                    command.getSourcePosX().intValue(),    // 婧愭帓
+                    command.getSourcePosY().intValue(),    // 婧愬垪
+                    command.getSourcePosZ().intValue(),    // 婧愬眰
+                    null,    // 婧愮珯
+                    command.getDestinationPosX().intValue(),    // 鐩爣鎺�
+                    command.getDestinationPosY().intValue(),    // 鐩爣鍒�
+                    command.getDestinationPosZ().intValue(),    // 鐩爣灞�
+                    null,    // 鐩爣绔�
+                    null,    // 鍝嶅簲缁撴灉
+                    null,    // 淇敼鏃堕棿
+                    null    // 淇敼浜哄憳
+            );
+            bean.insert(basCrnOpt);
+        } catch (Exception ignore) {
+        }
+
+        if (result != null && result.IsSuccess) {
+            Thread.sleep(200);
+            this.readStatus();
+//            News.info("鍫嗗灈鏈哄懡浠や笅鍙慬{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
             OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆慬id:{1}] >>>>> 鍛戒护涓嬪彂锛� {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
             return true;
         } else {

--
Gitblit v1.9.1