From 6abc20e29568c129f4ca71eccec9310534a8c779 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期二, 04 八月 2020 14:42:24 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecA1EDataType.java       |   89 
 src/main/java/com/zy/common/HslCommunication/BasicFramework/SoftBasic.java                |    2 
 src/main/java/com/zy/common/HslCommunication/Core/IMessage/S7Message.java                 |    2 
 src/main/java/com/zy/common/HslCommunication/Core/Net/NetworkBase/NetworkXBase.java       |  735 +++++
 src/main/java/com/zy/common/HslCommunication/Core/Transfer/DataFormat.java                |    2 
 src/main/java/com/zy/common/HslCommunication/Core/Net/HslProtocol.java                    |    8 
 src/main/java/com/zy/common/HslCommunication/Core/Types/IDataTransfer.java                |    2 
 src/main/java/com/zy/common/HslCommunication/BasicFramework/SystemVersion.java            |  214 +
 src/main/java/com/zy/common/HslCommunication/Core/IMessage/INetMessage.java               |    2 
 src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResultExThree.java         |    2 
 src/main/java/com/zy/common/HslCommunication/LogNet/Core/HslMessageItem.java              |  147 +
 src/main/java/com/zy/common/HslCommunication/Core/Net/StateOne/AppSession.java            |    6 
 src/main/java/com/zy/common/HslCommunication/Enthernet/FileNet/FileBaseInfo.java          |   73 
 src/main/java/com/zy/common/HslCommunication/Core/Types/HslTimeOut.java                   |    2 
 src/main/java/com/zy/common/web/AuthController.java                                       |    2 
 src/main/webapp/views/crn.html                                                            |    2 
 src/main/java/com/zy/common/HslCommunication/Language/English.java                        |    2 
 src/main/java/com/zy/common/HslCommunication/Core/IMessage/MelsecA1EBinaryMessage.java    |  142 +
 src/main/java/com/zy/common/HslCommunication/ModBus/ModbusInfo.java                       |  150 +
 src/main/java/com/zy/common/HslCommunication/Profinet/Siemens/SiemensPLCS.java            |    2 
 src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecHelper.java            |  290 ++
 src/main/webapp/static/js/common.js                                                       |    3 
 src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResultExTwo.java           |    2 
 src/main/java/com/zy/common/HslCommunication/Core/Transfer/RegularByteTransform.java      |    5 
 src/main/java/com/zy/common/HslCommunication/Core/Types/FunctionOperateExOne.java         |    2 
 src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResult.java                |    6 
 src/main/java/com/zy/common/HslCommunication/Core/Types/FunctionOperate.java              |    2 
 src/main/java/com/zy/common/HslCommunication/Core/Types/ActionOperateExOne.java           |    2 
 src/main/java/com/zy/common/HslCommunication/Core/Types/ActionOperateExThree.java         |    2 
 src/main/java/com/zy/common/Main.java                                                     |  376 +++
 src/main/java/com/zy/common/HslCommunication/Core/Transfer/ByteTransformBase.java         |    4 
 src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResultExOne.java           |    8 
 src/main/java/com/zy/common/HslCommunication/ModBus/ModbusTcpNet.java                     |  494 +++
 src/main/java/com/zy/common/HslCommunication/ModBus/ModbusAddress.java                    |  277 ++
 src/main/java/com/zy/common/HslCommunication/Profinet/Omron/OmronFinsNet.java             |  529 ++++
 src/main/java/com/zy/common/HslCommunication/Profinet/Siemens/SiemensS7Net.java           |   25 
 src/main/java/com/zy/common/HslCommunication/BasicFramework/SoftZipped.java               |    2 
 src/main/java/com/zy/common/HslCommunication/Core/Types/ActionOperateExTwo.java           |    2 
 src/main/java/com/zy/common/HslCommunication/Core/Transfer/IByteTransform.java            |   60 
 src/main/java/com/zy/common/HslCommunication/Core/Net/NetHandle.java                      |  116 
 src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecMcNet.java             |  378 +++
 src/main/java/com/zy/common/HslCommunication/BasicFramework/SoftSecurity.java             |    8 
 src/main/java/com/zy/common/HslCommunication/Language/DefaultLanguage.java                |    2 
 src/main/java/com/zy/common/HslCommunication/Utilities.java                               |    2 
 src/main/java/com/zy/common/HslCommunication/Core/Net/NetworkBase/NetworkBase.java        |   16 
 src/main/java/com/zy/common/HslCommunication/LogNet/Core/ILogNet.java                     |    4 
 src/main/java/com/zy/common/HslCommunication/Core/Transfer/ByteTransformHelper.java       |   10 
 src/main/webapp/views/console.html                                                        |   10 
 src/main/java/com/zy/common/HslCommunication/Core/Transfer/ReverseBytesTransform.java     |    4 
 src/main/java/com/zy/common/HslCommunication/Core/Transfer/ReverseWordTransform.java      |  142 +
 src/main/java/com/zy/common/HslCommunication/LogNet/Core/HslMessageDegree.java            |    2 
 src/main/java/com/zy/common/HslCommunication/Core/Net/NetworkBase/NetworkDeviceBase.java  |   19 
 src/main/java/com/zy/common/HslCommunication/Core/Address/DeviceAddressBase.java          |   49 
 src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecMcDataType.java        |  122 
 src/main/java/com/zy/common/HslCommunication/Enthernet/ComplexNet/NetComplexClient.java   |  472 +++
 src/main/java/com/zy/common/HslCommunication/Core/Net/NetworkBase/NetworkDoubleBase.java  |   22 
 src/main/java/com/zy/common/HslCommunication/Enthernet/PushNet/NetPushClient.java         |  143 +
 src/main/webapp/views/index.html                                                          |    3 
 src/main/java/com/zy/common/HslCommunication/Enthernet/SimplifyNet/NetSimplifyClient.java |  130 +
 src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecMcAsciiNet.java        |  413 +++
 src/main/java/com/zy/common/HslCommunication/Core/Types/ActionOperate.java                |    2 
 src/main/java/com/zy/common/HslCommunication/Core/IMessage/MelsecQnA3EBinaryMessage.java  |  117 
 src/main/java/com/zy/common/HslCommunication/Core/Net/StateOne/AlienSession.java          |    2 
 src/main/java/com/zy/common/HslCommunication/Profinet/Siemens/SiemensFetchWriteNet.java   |  330 ++
 src/main/java/com/zy/common/HslCommunication/BasicFramework/SoftIncrementCount.java       |   52 
 src/main/java/com/zy/common/HslCommunication/Core/IMessage/ModbusTcpMessage.java          |  134 +
 src/main/java/com/zy/common/HslCommunication/Core/Security/HslSecurity.java               |    2 
 src/main/java/com/zy/common/HslCommunication/Core/IMessage/HslMessage.java                |  118 
 src/main/java/com/zy/common/HslCommunication/Core/Net/IReadWriteNet.java                  |   22 
 src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecA1ENet.java            |  336 ++
 src/main/java/com/zy/common/HslCommunication/Profinet/Omron/OmronFinsDataType.java        |   66 
 src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResultExFour.java          |    2 
 /dev/null                                                                                 |   96 
 src/main/java/com/zy/common/HslCommunication/Core/IMessage/FetchWriteMessage.java         |  125 +
 src/main/java/com/zy/common/HslCommunication/LogNet/Core/GenerateMode.java                |   32 
 src/main/java/com/zy/common/HslCommunication/Core/IMessage/FinsMessage.java               |  124 +
 src/main/java/com/zy/common/HslCommunication/Core/IMessage/MelsecQnA3EAsciiMessage.java   |  124 +
 src/main/resources/application.yml                                                        |    2 
 78 files changed, 7,195 insertions(+), 235 deletions(-)

diff --git a/src/main/java/com/zy/gateway/core/base/SoftBasic.java b/src/main/java/com/zy/common/HslCommunication/BasicFramework/SoftBasic.java
similarity index 99%
rename from src/main/java/com/zy/gateway/core/base/SoftBasic.java
rename to src/main/java/com/zy/common/HslCommunication/BasicFramework/SoftBasic.java
index 29686f5..5279eff 100644
--- a/src/main/java/com/zy/gateway/core/base/SoftBasic.java
+++ b/src/main/java/com/zy/common/HslCommunication/BasicFramework/SoftBasic.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.base;
+package com.zy.common.HslCommunication.BasicFramework;
 
 
 import java.io.ByteArrayOutputStream;
diff --git a/src/main/java/com/zy/common/HslCommunication/BasicFramework/SoftIncrementCount.java b/src/main/java/com/zy/common/HslCommunication/BasicFramework/SoftIncrementCount.java
new file mode 100644
index 0000000..7453a89
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/BasicFramework/SoftIncrementCount.java
@@ -0,0 +1,52 @@
+package com.zy.common.HslCommunication.BasicFramework;
+
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * 涓�涓畝鍗曠殑涓嶆寔涔呭寲鐨勫簭鍙疯嚜澧炵被锛岄噰鐢ㄧ嚎绋嬪畨鍏ㄥ疄鐜帮紝骞跺厑璁告寚瀹氭渶澶ф暟瀛楋紝鍒拌揪鍚庢竻绌轰粠鎸囧畾鏁板紑濮�
+ */
+public class SoftIncrementCount {
+
+
+    /**
+     * 瀹炰緥鍖栦竴涓嚜澧炰俊鎭殑瀵硅薄锛屽寘鎷渶澶у��
+     * @param max 鏁版嵁鐨勬渶澶у�硷紝蹇呴』鎸囧畾
+     * @param start 鏁版嵁鐨勮捣濮嬪�硷紝榛樿涓�0
+     */
+    public SoftIncrementCount( long max, long start )
+    {
+        this.start = start;
+        this.max = max;
+        current = start;
+        hybirdLock = new ReentrantLock();
+    }
+
+
+    private long start = 0;
+    private long current = 0;
+    private long max = Long.MAX_VALUE;
+    private Lock hybirdLock;
+
+
+    /**
+     * 鑾峰彇鑷淇℃伅
+     * @return 鍊�
+     */
+    public long GetCurrentValue( )
+    {
+        long value = 0;
+        hybirdLock.lock( );
+
+        value = current;
+        current++;
+        if (current > max)
+        {
+            current = 0;
+        }
+
+        hybirdLock.unlock( );
+        return value;
+    }
+
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/BasicFramework/SoftSecurity.java b/src/main/java/com/zy/common/HslCommunication/BasicFramework/SoftSecurity.java
new file mode 100644
index 0000000..849a914
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/BasicFramework/SoftSecurity.java
@@ -0,0 +1,8 @@
+package com.zy.common.HslCommunication.BasicFramework;
+
+
+public class SoftSecurity {
+
+
+
+}
diff --git a/src/main/java/com/zy/gateway/core/base/SoftZipped.java b/src/main/java/com/zy/common/HslCommunication/BasicFramework/SoftZipped.java
similarity index 95%
rename from src/main/java/com/zy/gateway/core/base/SoftZipped.java
rename to src/main/java/com/zy/common/HslCommunication/BasicFramework/SoftZipped.java
index af8adee..86cef61 100644
--- a/src/main/java/com/zy/gateway/core/base/SoftZipped.java
+++ b/src/main/java/com/zy/common/HslCommunication/BasicFramework/SoftZipped.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.base;
+package com.zy.common.HslCommunication.BasicFramework;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
diff --git a/src/main/java/com/zy/common/HslCommunication/BasicFramework/SystemVersion.java b/src/main/java/com/zy/common/HslCommunication/BasicFramework/SystemVersion.java
new file mode 100644
index 0000000..50e8430
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/BasicFramework/SystemVersion.java
@@ -0,0 +1,214 @@
+package com.zy.common.HslCommunication.BasicFramework;
+
+/**
+ * 绯荤粺鐨勭増鏈被
+ */
+public class SystemVersion {
+
+    /**
+     * 鏍规嵁鏍煎紡鍖栧瓧绗︿覆鐨勭増鏈彿鍒濆鍖�
+     * @param VersionString 鏍煎紡鍖栫殑瀛楃涓诧紝渚嬪锛�1.0.0鎴�1.0.0.0503
+     */
+    public SystemVersion(String VersionString)
+    {
+        String[] temp = VersionString.split("\\.");
+        if (temp.length >= 3)
+        {
+            m_MainVersion = Integer.parseInt(temp[0]);
+            m_SecondaryVersion = Integer.parseInt(temp[1]);
+            m_EditVersion = Integer.parseInt(temp[2]);
+
+            if (temp.length >= 4)
+            {
+                m_InnerVersion = Integer.parseInt(temp[3]);
+            }
+        }
+    }
+
+
+    /**
+     * 鏍规嵁鎸囧畾鐨勬暟瀛楀疄渚嬪寲涓�涓璞�
+     * @param main 涓荤増鏈�
+     * @param sec 娆$増鏈�
+     * @param edit 淇鐗�
+     */
+    public SystemVersion(int main, int sec, int edit)
+    {
+        m_MainVersion = main;
+        m_SecondaryVersion = sec;
+        m_EditVersion = edit;
+    }
+
+    /**
+     * 鏍规嵁鎸囧畾鐨勬暟瀛楀疄渚嬪寲涓�涓璞�
+     * @param main 涓荤増鏈�
+     * @param sec 娆$増鏈�
+     * @param edit 淇鐗�
+     * @param inner 鍐呴儴鐗堟湰鍙�
+     */
+    public SystemVersion(int main, int sec, int edit, int inner)
+    {
+        m_MainVersion = main;
+        m_SecondaryVersion = sec;
+        m_EditVersion = edit;
+        m_InnerVersion = inner;
+    }
+    private int m_MainVersion = 2;
+
+
+
+    /**
+     * 涓荤増鏈�
+     * @return int鏁版嵁
+     */
+    public int MainVersion()
+    {
+        return m_MainVersion;
+    }
+
+    private int m_SecondaryVersion = 0;
+
+
+
+    /**
+     * 娆$増鏈�
+     * @return int鏁版嵁
+     */
+    public int SecondaryVersion() {
+        return m_SecondaryVersion;
+    }
+
+    private int m_EditVersion = 0;
+
+    /**
+     * 淇鐗�
+     * @return int鏁版嵁
+     */
+    public int EditVersion() {
+        return m_EditVersion;
+    }
+    private int m_InnerVersion = 0;
+
+
+
+    /**
+     * 鍐呴儴鐗堟湰鍙凤紝鎴栬�呮槸鐗堟湰鍙疯〃绀轰负骞存湀浠�+鍐呴儴鐗堟湰鐨勮〃绀烘柟寮�
+     * @return int鏁版嵁
+     */
+    public int InnerVersion()
+    {
+        return m_InnerVersion;
+    }
+
+
+
+    /**
+     * 鏍规嵁鏍煎紡鍖栦负鏀寔杩斿洖鐨勪笉鍚屼俊鎭殑鐗堟湰鍙�
+     * C杩斿洖1.0.0.0
+     * N杩斿洖1.0.0
+     * S杩斿洖1.0
+     * @param format 鏍煎紡鍖栦俊鎭�
+     * @return 瀛楃涓叉暟鎹�
+     */
+    public String toString(String format)
+    {
+        if(format == "C")
+        {
+            return MainVersion()+"."+SecondaryVersion()+"."+EditVersion()+"."+InnerVersion();
+        }
+
+        if(format == "N")
+        {
+            return MainVersion()+"."+SecondaryVersion()+"."+EditVersion();
+        }
+
+        if(format == "S")
+        {
+            return MainVersion()+"."+SecondaryVersion();
+        }
+
+        return toString();
+    }
+
+
+    /**
+     * 鐗堟湰淇℃伅
+     * @return 瀛楃涓叉暟鎹�
+     */
+    @Override
+    public String toString() {
+        if(InnerVersion() == 0)
+        {
+            return MainVersion()+"."+SecondaryVersion()+"."+EditVersion();
+        }
+        else
+        {
+            return MainVersion()+"."+SecondaryVersion()+"."+EditVersion()+"."+InnerVersion();
+        }
+    }
+
+
+    /**
+     * 鍒ゆ柇鐗堟湰鏄惁涓�鑷�
+     * @param sv 瀵规瘮鐨勭増鏈�
+     * @return 鏄惁涓�鑷�
+     */
+    public boolean IsSameVersion(SystemVersion sv) {
+        if (this.m_MainVersion != sv.m_MainVersion) {
+            return false;
+        }
+
+        if (this.m_SecondaryVersion != sv.m_SecondaryVersion) {
+            return false;
+        }
+
+        if (this.m_EditVersion != sv.m_EditVersion) {
+            return false;
+        }
+
+        if (this.m_InnerVersion != sv.m_InnerVersion) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * 鍒ゆ柇鏄笉鏄皬浜庢寚瀹氱殑鐗堟湰
+     * @param sv 瀵规瘮鐨勭増鏈�
+     * @return 鏄惁灏忎簬
+     */
+    public boolean IsSmallerThan(SystemVersion sv) {
+        if (this.m_MainVersion < sv.m_MainVersion) {
+            return true;
+        }
+        else if(this.m_MainVersion > sv.m_MainVersion) {
+            return false;
+        }
+
+        if (this.m_SecondaryVersion < sv.m_SecondaryVersion) {
+            return true;
+        }
+        else if (this.m_SecondaryVersion > sv.m_SecondaryVersion) {
+            return false;
+
+        }
+
+        if (this.m_EditVersion < sv.m_EditVersion) {
+            return true;
+        }
+        else if (this.m_EditVersion > sv.m_EditVersion) {
+            return false;
+        }
+
+        if (this.m_InnerVersion < sv.m_InnerVersion) {
+            return true;
+        }
+        else if (this.m_InnerVersion > sv.m_InnerVersion) {
+            return false;
+        }
+
+        return false;
+    }
+
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Core/Address/DeviceAddressBase.java b/src/main/java/com/zy/common/HslCommunication/Core/Address/DeviceAddressBase.java
new file mode 100644
index 0000000..62eb1ab
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Address/DeviceAddressBase.java
@@ -0,0 +1,49 @@
+package com.zy.common.HslCommunication.Core.Address;
+
+/**
+ * 鎵�鏈夐�氫俊绫荤殑鍦板潃鍩虹被
+ */
+public class DeviceAddressBase {
+
+
+    /**
+     * 鑾峰彇鍦板潃淇℃伅
+     * @return
+     */
+    public int getAddress() {
+        return Address;
+    }
+
+    /**
+     * 璁剧疆鍦板潃淇℃伅
+     * @param address
+     */
+    public void setAddress(int address) {
+        Address = address;
+    }
+
+    /**
+     * 璧峰鍦板潃
+     */
+    private int Address = 0;
+
+
+    /**
+     * 瑙f瀽瀛楃涓茬殑鍦板潃
+     *
+     * @param address
+     */
+    public void AnalysisAddress(String address) {
+        Address = Integer.parseInt(address);
+    }
+
+
+    /**
+     * 杩斿洖琛ㄧず褰撳墠瀵硅薄鐨勫瓧绗︿覆
+     * @return 瀛楃涓�
+     */
+    @Override
+    public String toString() {
+        return String.valueOf(Address);
+    }
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Core/IMessage/FetchWriteMessage.java b/src/main/java/com/zy/common/HslCommunication/Core/IMessage/FetchWriteMessage.java
new file mode 100644
index 0000000..4183983
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Core/IMessage/FetchWriteMessage.java
@@ -0,0 +1,125 @@
+package com.zy.common.HslCommunication.Core.IMessage;
+
+public class FetchWriteMessage implements INetMessage
+{
+
+    /**
+     * 娑堟伅澶寸殑鎸囦护闀垮害
+     */
+    public int ProtocolHeadBytesLength(){
+        return 16;
+    }
+
+
+    /**
+     * 浠庡綋鍓嶇殑澶村瓙鑺傛枃浠朵腑鎻愬彇鍑烘帴涓嬫潵闇�瑕佹帴鏀剁殑鏁版嵁闀垮害
+     * @return 杩斿洖鎺ヤ笅鏉ョ殑鏁版嵁鍐呭闀垮害
+     */
+    public int GetContentLengthByHeadBytes(){
+        if(HeadBytes == null) return 0;
+
+        if(SendBytes == null) return 16;
+
+        if(HeadBytes[5]==0x04)
+        {
+            return 0;
+        }
+        else {
+            return (HeadBytes[12] & 0xff) * 256 + (HeadBytes[13] & 0xff);
+        }
+    }
+
+
+    /**
+     * 妫�鏌ュご瀛愯妭鐨勫悎娉曟��
+     * @param token 鐗规畩鐨勪护鐗岋紝鏈変簺鐗规畩娑堟伅鐨勯獙璇�
+     * @return 鏄惁鍚堟硶鐨勯獙璇�
+     */
+    public boolean CheckHeadBytesLegal(byte[] token)
+    {
+        if(HeadBytes == null) return false;
+        if(HeadBytes[0]==0x53 && HeadBytes[1] == 0x35){
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+
+    /**
+     * 鑾峰彇澶村瓙鑺傞噷鐨勬秷鎭爣璇�
+     * @return
+     */
+    public int GetHeadBytesIdentity(){
+
+        return HeadBytes[3];
+    }
+
+
+    /**
+     * 鑾峰彇娑堟伅澶村瓧鑺�
+     *
+     * @return
+     */
+    @Override
+    public byte[] getHeadBytes() {
+        return HeadBytes;
+    }
+
+    /**
+     * 鑾峰彇娑堟伅鍐呭瀛楄妭
+     *
+     * @return
+     */
+    @Override
+    public byte[] getContentBytes() {
+        return ContentBytes;
+    }
+
+    /**
+     * 鑾峰彇鍙戦�佺殑娑堟伅
+     *
+     * @return
+     */
+    @Override
+    public byte[] getSendBytes() {
+        return SendBytes;
+    }
+
+    /**
+     * 璁剧疆娑堟伅澶村瓙鑺�
+     * @param headBytes 瀛楄妭鏁版嵁
+     */
+    public void setHeadBytes(byte[] headBytes){
+        HeadBytes = headBytes;
+    }
+
+
+
+
+    /**
+     * 璁剧疆娑堟伅鍐呭瀛楄妭
+     * @param contentBytes 鍐呭瀛楄妭
+     */
+    public void setContentBytes(byte[] contentBytes){
+        ContentBytes = contentBytes;
+    }
+
+
+
+    /**
+     * 璁剧疆鍙戦�佺殑瀛楄妭淇℃伅
+     * @param sendBytes 鍙戦�佺殑瀛楄妭淇℃伅
+     */
+    public void setSendBytes(byte[] sendBytes){
+        SendBytes = sendBytes;
+    }
+
+
+    private byte[] HeadBytes = null;
+
+    private byte[] ContentBytes = null;
+
+    private byte[] SendBytes = null;
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Core/IMessage/FinsMessage.java b/src/main/java/com/zy/common/HslCommunication/Core/IMessage/FinsMessage.java
new file mode 100644
index 0000000..c4c3e93
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Core/IMessage/FinsMessage.java
@@ -0,0 +1,124 @@
+package com.zy.common.HslCommunication.Core.IMessage;
+
+import com.zy.common.HslCommunication.Utilities;
+
+public class FinsMessage implements INetMessage
+{
+
+    /**
+     * 娑堟伅澶寸殑鎸囦护闀垮害
+     */
+    public int ProtocolHeadBytesLength(){
+        return 8;
+    }
+
+
+    /**
+     * 浠庡綋鍓嶇殑澶村瓙鑺傛枃浠朵腑鎻愬彇鍑烘帴涓嬫潵闇�瑕佹帴鏀剁殑鏁版嵁闀垮害
+     * @return 杩斿洖鎺ヤ笅鏉ョ殑鏁版嵁鍐呭闀垮害
+     */
+    public int GetContentLengthByHeadBytes(){
+        if(HeadBytes == null) return 0;
+
+        byte[] buffer = new byte[4];
+        buffer[0] = HeadBytes[7];
+        buffer[1] = HeadBytes[6];
+        buffer[2] = HeadBytes[5];
+        buffer[3] = HeadBytes[4];
+        return Utilities.getInt(buffer,0);
+    }
+
+
+    /**
+     * 妫�鏌ュご瀛愯妭鐨勫悎娉曟��
+     * @param token 鐗规畩鐨勪护鐗岋紝鏈変簺鐗规畩娑堟伅鐨勯獙璇�
+     * @return 鏄惁鍚堟硶鐨勯獙璇�
+     */
+    public boolean CheckHeadBytesLegal(byte[] token)
+    {
+        if(HeadBytes == null) return false;
+        if(HeadBytes[0] == 0x46 && HeadBytes[1] == 0x49 && HeadBytes[2] == 0x4E && HeadBytes[3] == 0x53){
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+
+    /**
+     * 鑾峰彇澶村瓙鑺傞噷鐨勬秷鎭爣璇�
+     * @return
+     */
+    public int GetHeadBytesIdentity(){
+
+        return 0;
+    }
+
+
+    /**
+     * 鑾峰彇娑堟伅澶村瓧鑺�
+     *
+     * @return
+     */
+    @Override
+    public byte[] getHeadBytes() {
+        return HeadBytes;
+    }
+
+    /**
+     * 鑾峰彇娑堟伅鍐呭瀛楄妭
+     *
+     * @return
+     */
+    @Override
+    public byte[] getContentBytes() {
+        return ContentBytes;
+    }
+
+    /**
+     * 鑾峰彇鍙戦�佺殑娑堟伅
+     *
+     * @return
+     */
+    @Override
+    public byte[] getSendBytes() {
+        return SendBytes;
+    }
+
+    /**
+     * 璁剧疆娑堟伅澶村瓙鑺�
+     * @param headBytes 瀛楄妭鏁版嵁
+     */
+    public void setHeadBytes(byte[] headBytes){
+        HeadBytes = headBytes;
+    }
+
+
+
+
+    /**
+     * 璁剧疆娑堟伅鍐呭瀛楄妭
+     * @param contentBytes 鍐呭瀛楄妭
+     */
+    public void setContentBytes(byte[] contentBytes){
+        ContentBytes = contentBytes;
+    }
+
+
+
+    /**
+     * 璁剧疆鍙戦�佺殑瀛楄妭淇℃伅
+     * @param sendBytes 鍙戦�佺殑瀛楄妭淇℃伅
+     */
+    public void setSendBytes(byte[] sendBytes){
+        SendBytes = sendBytes;
+    }
+
+
+    private byte[] HeadBytes = null;
+
+    private byte[] ContentBytes = null;
+
+    private byte[] SendBytes = null;
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Core/IMessage/HslMessage.java b/src/main/java/com/zy/common/HslCommunication/Core/IMessage/HslMessage.java
new file mode 100644
index 0000000..e48e377
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Core/IMessage/HslMessage.java
@@ -0,0 +1,118 @@
+package com.zy.common.HslCommunication.Core.IMessage;
+
+
+import com.zy.common.HslCommunication.BasicFramework.SoftBasic;
+import com.zy.common.HslCommunication.Utilities;
+
+/**
+ * 鏈粍浠剁郴缁熶娇鐢ㄧ殑榛樿鐨勬秷鎭鍒欙紝璇存槑瑙f瀽鍜屽弽瑙f瀽瑙勫垯鐨�
+ */
+public class HslMessage implements INetMessage
+{
+
+    /**
+     * 娑堟伅澶寸殑鎸囦护闀垮害
+     */
+    public int ProtocolHeadBytesLength(){
+        return 32;
+    }
+
+
+    /**
+     * 浠庡綋鍓嶇殑澶村瓙鑺傛枃浠朵腑鎻愬彇鍑烘帴涓嬫潵闇�瑕佹帴鏀剁殑鏁版嵁闀垮害
+     * @return 杩斿洖鎺ヤ笅鏉ョ殑鏁版嵁鍐呭闀垮害
+     */
+    public int GetContentLengthByHeadBytes(){
+        if(HeadBytes == null) return 0;
+        if(HeadBytes.length != 32) return 0;
+
+        return Utilities.getInt(HeadBytes,28);
+    }
+
+
+    /**
+     * 妫�鏌ュご瀛愯妭鐨勫悎娉曟��
+     * @param token 鐗规畩鐨勪护鐗岋紝鏈変簺鐗规畩娑堟伅鐨勯獙璇�
+     * @return 鏄惁鍚堟硶鐨勯獙璇�
+     */
+    public boolean CheckHeadBytesLegal(byte[] token){
+        return SoftBasic.IsTwoBytesEquel(HeadBytes,12,token,0,16);
+    }
+
+
+    /**
+     * 鑾峰彇澶村瓙鑺傞噷鐨勬秷鎭爣璇�
+     * @return
+     */
+    public int GetHeadBytesIdentity(){
+
+        return Utilities.getInt(HeadBytes,0);
+    }
+
+
+    /**
+     * 鑾峰彇娑堟伅澶村瓧鑺�
+     *
+     * @return
+     */
+    @Override
+    public byte[] getHeadBytes() {
+        return HeadBytes;
+    }
+
+    /**
+     * 鑾峰彇娑堟伅鍐呭瀛楄妭
+     *
+     * @return
+     */
+    @Override
+    public byte[] getContentBytes() {
+        return ContentBytes;
+    }
+
+    /**
+     * 鑾峰彇鍙戦�佺殑娑堟伅
+     *
+     * @return
+     */
+    @Override
+    public byte[] getSendBytes() {
+        return SendBytes;
+    }
+
+    /**
+     * 璁剧疆娑堟伅澶村瓙鑺�
+     * @param headBytes 瀛楄妭鏁版嵁
+     */
+    public void setHeadBytes(byte[] headBytes){
+        HeadBytes = headBytes;
+    }
+
+
+
+
+    /**
+     * 璁剧疆娑堟伅鍐呭瀛楄妭
+     * @param contentBytes 鍐呭瀛楄妭
+     */
+    public void setContentBytes(byte[] contentBytes){
+        ContentBytes = contentBytes;
+    }
+
+
+
+    /**
+     * 璁剧疆鍙戦�佺殑瀛楄妭淇℃伅
+     * @param sendBytes 鍙戦�佺殑瀛楄妭淇℃伅
+     */
+    public void setSendBytes(byte[] sendBytes){
+        SendBytes = sendBytes;
+    }
+
+
+    private byte[] HeadBytes = null;
+
+    private byte[] ContentBytes = null;
+
+    private byte[] SendBytes = null;
+}
diff --git a/src/main/java/com/zy/gateway/core/domain/siemens/INetMessage.java b/src/main/java/com/zy/common/HslCommunication/Core/IMessage/INetMessage.java
similarity index 95%
rename from src/main/java/com/zy/gateway/core/domain/siemens/INetMessage.java
rename to src/main/java/com/zy/common/HslCommunication/Core/IMessage/INetMessage.java
index 38f6c10..8d31ba8 100644
--- a/src/main/java/com/zy/gateway/core/domain/siemens/INetMessage.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/IMessage/INetMessage.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.domain.siemens;
+package com.zy.common.HslCommunication.Core.IMessage;
 
 /**
  * 鏈郴缁熺殑娑堟伅绫伙紝鍖呭惈浜嗗悇绉嶈В鏋愯鍒欙紝鏁版嵁淇℃伅鎻愬彇瑙勫垯
diff --git a/src/main/java/com/zy/common/HslCommunication/Core/IMessage/MelsecA1EBinaryMessage.java b/src/main/java/com/zy/common/HslCommunication/Core/IMessage/MelsecA1EBinaryMessage.java
new file mode 100644
index 0000000..2b8cdcf
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Core/IMessage/MelsecA1EBinaryMessage.java
@@ -0,0 +1,142 @@
+package com.zy.common.HslCommunication.Core.IMessage;
+
+public class MelsecA1EBinaryMessage implements INetMessage {
+
+    /**
+     * 娑堟伅澶寸殑鎸囦护闀垮害
+     */
+    public int ProtocolHeadBytesLength(){
+        return 2;
+    }
+
+
+    /**
+     * 浠庡綋鍓嶇殑澶村瓙鑺傛枃浠朵腑鎻愬彇鍑烘帴涓嬫潵闇�瑕佹帴鏀剁殑鏁版嵁闀垮害
+     * @return 杩斿洖鎺ヤ笅鏉ョ殑鏁版嵁鍐呭闀垮害
+     */
+    public int GetContentLengthByHeadBytes(){
+        if(HeadBytes == null) return 0;
+
+        int contentLength = 0;
+
+        if (HeadBytes[1] == 0x5B)
+        {
+            contentLength = 2; //缁撴潫浠g爜 + 0x00
+            return contentLength;
+        }
+        else
+        {
+            int length = (SendBytes[10] % 2 == 0) ? SendBytes[10] : SendBytes[10] + 1;
+            switch (HeadBytes[0])
+            {
+                case (byte) 0x80: //浣嶅崟浣嶆垚鎵硅鍑哄悗锛屽洖澶嶅壇鏍囬
+                    contentLength = length / 2;
+                    break;
+                case (byte) 0x81: //瀛楀崟浣嶆垚鎵硅鍑哄悗锛屽洖澶嶅壇鏍囬
+                    contentLength = SendBytes[10] * 2;
+                    break;
+                case (byte) 0x82: //浣嶅崟浣嶆垚鎵瑰啓鍏ュ悗锛屽洖澶嶅壇鏍囬
+                    break;
+                case (byte) 0x83: //瀛楀崟浣嶆垚鎵瑰啓鍏ュ悗锛屽洖澶嶅壇鏍囬
+                    break;
+                default:
+                    break;
+            }
+            // 鍦ˋ鍏煎1E鍗忚涓紝鍐欏叆鍊煎悗锛岃嫢涓嶅彂鐢熷紓甯革紝鍙繑鍥炲壇鏍囬 + 缁撴潫浠g爜(0x00)
+            // 杩欏凡缁忓湪鍗忚澶撮儴璇诲彇杩囦簡锛屽悗闈㈣璇诲彇鐨勯暱搴︿负0锛坈ontentLength=0锛�
+        }
+        return contentLength;
+    }
+
+
+    /**
+     * 妫�鏌ュご瀛愯妭鐨勫悎娉曟��
+     * @param token 鐗规畩鐨勪护鐗岋紝鏈変簺鐗规畩娑堟伅鐨勯獙璇�
+     * @return 鏄惁鍚堟硶鐨勯獙璇�
+     */
+    public boolean CheckHeadBytesLegal(byte[] token)
+    {
+        if (HeadBytes != null)
+        {
+            if ((HeadBytes[0] - SendBytes[0]) == (byte) 0x80) { return true; }
+        }
+        return false;
+    }
+
+
+    /**
+     * 鑾峰彇澶村瓙鑺傞噷鐨勬秷鎭爣璇�
+     * @return
+     */
+    public int GetHeadBytesIdentity(){
+
+        return 0;
+    }
+
+
+    /**
+     * 鑾峰彇娑堟伅澶村瓧鑺�
+     *
+     * @return
+     */
+    @Override
+    public byte[] getHeadBytes() {
+        return HeadBytes;
+    }
+
+    /**
+     * 鑾峰彇娑堟伅鍐呭瀛楄妭
+     *
+     * @return
+     */
+    @Override
+    public byte[] getContentBytes() {
+        return ContentBytes;
+    }
+
+    /**
+     * 鑾峰彇鍙戦�佺殑娑堟伅
+     *
+     * @return
+     */
+    @Override
+    public byte[] getSendBytes() {
+        return SendBytes;
+    }
+
+    /**
+     * 璁剧疆娑堟伅澶村瓙鑺�
+     * @param headBytes 瀛楄妭鏁版嵁
+     */
+    public void setHeadBytes(byte[] headBytes){
+        HeadBytes = headBytes;
+    }
+
+
+
+
+    /**
+     * 璁剧疆娑堟伅鍐呭瀛楄妭
+     * @param contentBytes 鍐呭瀛楄妭
+     */
+    public void setContentBytes(byte[] contentBytes){
+        ContentBytes = contentBytes;
+    }
+
+
+
+    /**
+     * 璁剧疆鍙戦�佺殑瀛楄妭淇℃伅
+     * @param sendBytes 鍙戦�佺殑瀛楄妭淇℃伅
+     */
+    public void setSendBytes(byte[] sendBytes){
+        SendBytes = sendBytes;
+    }
+
+
+    private byte[] HeadBytes = null;
+
+    private byte[] ContentBytes = null;
+
+    private byte[] SendBytes = null;
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Core/IMessage/MelsecQnA3EAsciiMessage.java b/src/main/java/com/zy/common/HslCommunication/Core/IMessage/MelsecQnA3EAsciiMessage.java
new file mode 100644
index 0000000..b80e0c9
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Core/IMessage/MelsecQnA3EAsciiMessage.java
@@ -0,0 +1,124 @@
+package com.zy.common.HslCommunication.Core.IMessage;
+
+import com.zy.common.HslCommunication.Utilities;
+
+public class MelsecQnA3EAsciiMessage implements INetMessage
+{
+    /**
+     * 娑堟伅澶寸殑鎸囦护闀垮害
+     */
+    public int ProtocolHeadBytesLength(){
+        return 18;
+    }
+
+
+    /**
+     * 浠庡綋鍓嶇殑澶村瓙鑺傛枃浠朵腑鎻愬彇鍑烘帴涓嬫潵闇�瑕佹帴鏀剁殑鏁版嵁闀垮害
+     * @return 杩斿洖鎺ヤ笅鏉ョ殑鏁版嵁鍐呭闀垮害
+     */
+    public int GetContentLengthByHeadBytes(){
+        if(HeadBytes == null) return 0;
+
+        byte[] buffer = new byte[4];
+        buffer[0] = HeadBytes[14];
+        buffer[1] = HeadBytes[15];
+        buffer[2] = HeadBytes[16];
+        buffer[3] = HeadBytes[17];
+
+        return Integer.parseInt(Utilities.getString(buffer,"ascii"),16);
+    }
+
+
+    /**
+     * 妫�鏌ュご瀛愯妭鐨勫悎娉曟��
+     * @param token 鐗规畩鐨勪护鐗岋紝鏈変簺鐗规畩娑堟伅鐨勯獙璇�
+     * @return 鏄惁鍚堟硶鐨勯獙璇�
+     */
+    public boolean CheckHeadBytesLegal(byte[] token)
+    {
+        if(HeadBytes == null) return false;
+        if(HeadBytes[0] == (byte)'D' && HeadBytes[1] == (byte)'0' && HeadBytes[2] == (byte)'0' && HeadBytes[3] == (byte)'0'){
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+
+    /**
+     * 鑾峰彇澶村瓙鑺傞噷鐨勬秷鎭爣璇�
+     * @return
+     */
+    public int GetHeadBytesIdentity(){
+
+        return 0;
+    }
+
+
+    /**
+     * 鑾峰彇娑堟伅澶村瓧鑺�
+     *
+     * @return
+     */
+    @Override
+    public byte[] getHeadBytes() {
+        return HeadBytes;
+    }
+
+    /**
+     * 鑾峰彇娑堟伅鍐呭瀛楄妭
+     *
+     * @return
+     */
+    @Override
+    public byte[] getContentBytes() {
+        return ContentBytes;
+    }
+
+    /**
+     * 鑾峰彇鍙戦�佺殑娑堟伅
+     *
+     * @return
+     */
+    @Override
+    public byte[] getSendBytes() {
+        return SendBytes;
+    }
+
+    /**
+     * 璁剧疆娑堟伅澶村瓙鑺�
+     * @param headBytes 瀛楄妭鏁版嵁
+     */
+    public void setHeadBytes(byte[] headBytes){
+        HeadBytes = headBytes;
+    }
+
+
+
+
+    /**
+     * 璁剧疆娑堟伅鍐呭瀛楄妭
+     * @param contentBytes 鍐呭瀛楄妭
+     */
+    public void setContentBytes(byte[] contentBytes){
+        ContentBytes = contentBytes;
+    }
+
+
+
+    /**
+     * 璁剧疆鍙戦�佺殑瀛楄妭淇℃伅
+     * @param sendBytes 鍙戦�佺殑瀛楄妭淇℃伅
+     */
+    public void setSendBytes(byte[] sendBytes){
+        SendBytes = sendBytes;
+    }
+
+
+    private byte[] HeadBytes = null;
+
+    private byte[] ContentBytes = null;
+
+    private byte[] SendBytes = null;
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Core/IMessage/MelsecQnA3EBinaryMessage.java b/src/main/java/com/zy/common/HslCommunication/Core/IMessage/MelsecQnA3EBinaryMessage.java
new file mode 100644
index 0000000..7cb86c8
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Core/IMessage/MelsecQnA3EBinaryMessage.java
@@ -0,0 +1,117 @@
+package com.zy.common.HslCommunication.Core.IMessage;
+
+public class MelsecQnA3EBinaryMessage implements INetMessage
+{
+
+    /**
+     * 娑堟伅澶寸殑鎸囦护闀垮害
+     */
+    public int ProtocolHeadBytesLength(){
+        return 9;
+    }
+
+
+    /**
+     * 浠庡綋鍓嶇殑澶村瓙鑺傛枃浠朵腑鎻愬彇鍑烘帴涓嬫潵闇�瑕佹帴鏀剁殑鏁版嵁闀垮害
+     * @return 杩斿洖鎺ヤ笅鏉ョ殑鏁版嵁鍐呭闀垮害
+     */
+    public int GetContentLengthByHeadBytes(){
+        if(HeadBytes == null) return 0;
+
+        return (HeadBytes[7]&0xff) + (HeadBytes[8]&0xff)*256;
+    }
+
+
+    /**
+     * 妫�鏌ュご瀛愯妭鐨勫悎娉曟��
+     * @param token 鐗规畩鐨勪护鐗岋紝鏈変簺鐗规畩娑堟伅鐨勯獙璇�
+     * @return 鏄惁鍚堟硶鐨勯獙璇�
+     */
+    public boolean CheckHeadBytesLegal(byte[] token)
+    {
+        if(HeadBytes == null) return false;
+        if((HeadBytes[0]&0xff)==0xd0 && HeadBytes[1] == 0x00){
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+
+    /**
+     * 鑾峰彇澶村瓙鑺傞噷鐨勬秷鎭爣璇�
+     * @return
+     */
+    public int GetHeadBytesIdentity(){
+
+        return 0;
+    }
+
+
+    /**
+     * 鑾峰彇娑堟伅澶村瓧鑺�
+     *
+     * @return
+     */
+    @Override
+    public byte[] getHeadBytes() {
+        return HeadBytes;
+    }
+
+    /**
+     * 鑾峰彇娑堟伅鍐呭瀛楄妭
+     *
+     * @return
+     */
+    @Override
+    public byte[] getContentBytes() {
+        return ContentBytes;
+    }
+
+    /**
+     * 鑾峰彇鍙戦�佺殑娑堟伅
+     *
+     * @return
+     */
+    @Override
+    public byte[] getSendBytes() {
+        return SendBytes;
+    }
+
+    /**
+     * 璁剧疆娑堟伅澶村瓙鑺�
+     * @param headBytes 瀛楄妭鏁版嵁
+     */
+    public void setHeadBytes(byte[] headBytes){
+        HeadBytes = headBytes;
+    }
+
+
+
+
+    /**
+     * 璁剧疆娑堟伅鍐呭瀛楄妭
+     * @param contentBytes 鍐呭瀛楄妭
+     */
+    public void setContentBytes(byte[] contentBytes){
+        ContentBytes = contentBytes;
+    }
+
+
+
+    /**
+     * 璁剧疆鍙戦�佺殑瀛楄妭淇℃伅
+     * @param sendBytes 鍙戦�佺殑瀛楄妭淇℃伅
+     */
+    public void setSendBytes(byte[] sendBytes){
+        SendBytes = sendBytes;
+    }
+
+
+    private byte[] HeadBytes = null;
+
+    private byte[] ContentBytes = null;
+
+    private byte[] SendBytes = null;
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Core/IMessage/ModbusTcpMessage.java b/src/main/java/com/zy/common/HslCommunication/Core/IMessage/ModbusTcpMessage.java
new file mode 100644
index 0000000..3dfe03e
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Core/IMessage/ModbusTcpMessage.java
@@ -0,0 +1,134 @@
+package com.zy.common.HslCommunication.Core.IMessage;
+
+
+/**
+ * Modbus Tcp鍗忚鐨勬秷鎭璞★紝鐢ㄦ潵纭畾鎺ユ敹瑙勫垯鐨�
+ */
+public class ModbusTcpMessage implements INetMessage
+{
+
+    /**
+     * 娑堟伅澶寸殑鎸囦护闀垮害
+     */
+    public int ProtocolHeadBytesLength(){
+        return 8;
+    }
+
+
+    /**
+     * 浠庡綋鍓嶇殑澶村瓙鑺傛枃浠朵腑鎻愬彇鍑烘帴涓嬫潵闇�瑕佹帴鏀剁殑鏁版嵁闀垮害
+     * @return 杩斿洖鎺ヤ笅鏉ョ殑鏁版嵁鍐呭闀垮害
+     */
+    public int GetContentLengthByHeadBytes() {
+        if (HeadBytes == null) return 0;
+        if (HeadBytes.length >= ProtocolHeadBytesLength()) {
+            int length = (HeadBytes[4] & 0xff) * 256 + (HeadBytes[5] & 0xff);
+            if (length == 0) {
+                byte[] buffer = new byte[ProtocolHeadBytesLength() - 1];
+                for (int i = 0; i < buffer.length; i++) {
+                    buffer[i] = HeadBytes[i + 1];
+                }
+                HeadBytes = buffer;
+                return (HeadBytes[5] & 0xff) * 256 + (HeadBytes[6] & 0xff) - 1;
+            } else {
+                return length - 2;
+            }
+        }
+
+        return 0;
+    }
+
+
+    /**
+     * 妫�鏌ュご瀛愯妭鐨勫悎娉曟��
+     * @param token 鐗规畩鐨勪护鐗岋紝鏈変簺鐗规畩娑堟伅鐨勯獙璇�
+     * @return 鏄惁鍚堟硶鐨勯獙璇�
+     */
+    public boolean CheckHeadBytesLegal(byte[] token)
+    {
+        if(HeadBytes == null) return false;
+        if(HeadBytes[2]==0x00 && HeadBytes[3] == 0x00){
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+
+    /**
+     * 鑾峰彇澶村瓙鑺傞噷鐨勬秷鎭爣璇�
+     * @return
+     */
+    public int GetHeadBytesIdentity(){
+
+        return 0;
+    }
+
+
+    /**
+     * 鑾峰彇娑堟伅澶村瓧鑺�
+     *
+     * @return
+     */
+    @Override
+    public byte[] getHeadBytes() {
+        return HeadBytes;
+    }
+
+    /**
+     * 鑾峰彇娑堟伅鍐呭瀛楄妭
+     *
+     * @return
+     */
+    @Override
+    public byte[] getContentBytes() {
+        return ContentBytes;
+    }
+
+    /**
+     * 鑾峰彇鍙戦�佺殑娑堟伅
+     *
+     * @return
+     */
+    @Override
+    public byte[] getSendBytes() {
+        return SendBytes;
+    }
+
+    /**
+     * 璁剧疆娑堟伅澶村瓙鑺�
+     * @param headBytes 瀛楄妭鏁版嵁
+     */
+    public void setHeadBytes(byte[] headBytes){
+        HeadBytes = headBytes;
+    }
+
+
+
+
+    /**
+     * 璁剧疆娑堟伅鍐呭瀛楄妭
+     * @param contentBytes 鍐呭瀛楄妭
+     */
+    public void setContentBytes(byte[] contentBytes){
+        ContentBytes = contentBytes;
+    }
+
+
+
+    /**
+     * 璁剧疆鍙戦�佺殑瀛楄妭淇℃伅
+     * @param sendBytes 鍙戦�佺殑瀛楄妭淇℃伅
+     */
+    public void setSendBytes(byte[] sendBytes){
+        SendBytes = sendBytes;
+    }
+
+
+    private byte[] HeadBytes = null;
+
+    private byte[] ContentBytes = null;
+
+    private byte[] SendBytes = null;
+}
diff --git a/src/main/java/com/zy/gateway/core/domain/siemens/S7Message.java b/src/main/java/com/zy/common/HslCommunication/Core/IMessage/S7Message.java
similarity index 96%
rename from src/main/java/com/zy/gateway/core/domain/siemens/S7Message.java
rename to src/main/java/com/zy/common/HslCommunication/Core/IMessage/S7Message.java
index 8ebd657..1cdd04a 100644
--- a/src/main/java/com/zy/gateway/core/domain/siemens/S7Message.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/IMessage/S7Message.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.domain.siemens;
+package com.zy.common.HslCommunication.Core.IMessage;
 
 public class S7Message implements INetMessage {
 
diff --git a/src/main/java/com/zy/gateway/core/net/HslProtocol.java b/src/main/java/com/zy/common/HslCommunication/Core/Net/HslProtocol.java
similarity index 95%
rename from src/main/java/com/zy/gateway/core/net/HslProtocol.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Net/HslProtocol.java
index a63e795..d71f4c6 100644
--- a/src/main/java/com/zy/gateway/core/net/HslProtocol.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Net/HslProtocol.java
@@ -1,8 +1,8 @@
-package com.zy.gateway.core.net;
+package com.zy.common.HslCommunication.Core.Net;
 
-import com.zy.gateway.core.base.HslSecurity;
-import com.zy.gateway.core.base.SoftZipped;
-import com.zy.gateway.core.utils.Utilities;
+import com.zy.common.HslCommunication.BasicFramework.*;
+import com.zy.common.HslCommunication.Core.Security.HslSecurity;
+import com.zy.common.HslCommunication.Utilities;
 
 import java.util.UUID;
 
diff --git a/src/main/java/com/zy/gateway/core/net/IReadWriteNet.java b/src/main/java/com/zy/common/HslCommunication/Core/Net/IReadWriteNet.java
similarity index 89%
rename from src/main/java/com/zy/gateway/core/net/IReadWriteNet.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Net/IReadWriteNet.java
index 16017e2..bcca73e 100644
--- a/src/main/java/com/zy/gateway/core/net/IReadWriteNet.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Net/IReadWriteNet.java
@@ -1,8 +1,8 @@
-package com.zy.gateway.core.net;
+package com.zy.common.HslCommunication.Core.Net;
 
-import com.zy.gateway.core.domain.IDataTransfer;
-import com.zy.gateway.core.domain.OperateResult;
-import com.zy.gateway.core.domain.OperateResultExOne;
+import com.zy.common.HslCommunication.Core.Types.IDataTransfer;
+import com.zy.common.HslCommunication.Core.Types.OperateResult;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExOne;
 
 /**
  * 鎵�鏈夎澶囦氦浜掔被鐨勭粺涓�鐨勮鍐欐帴鍙�
@@ -15,7 +15,7 @@
      * @param length 鏁版嵁闀垮害
      * @return 甯︽湁鎴愬姛鏍囪瘑鐨刡yte[]鏁扮粍
      */
-    OperateResultExOne<byte[]> Read(String address, short length);
+    OperateResultExOne<byte[]> Read(String address, short length );
 
     /**
      * 璇诲彇16浣嶇殑鏈夌鍙锋暣鍨�
@@ -30,7 +30,7 @@
      * @param length 璇诲彇鐨勬暟缁勯暱搴�
      * @return 甯︽湁鎴愬姛鏍囪瘑鐨剆hort鏁扮粍
      */
-    OperateResultExOne<short []> ReadInt16(String address, short length);
+    OperateResultExOne<short []> ReadInt16( String address, short length );
 
     /**
      * 璇诲彇32浣嶇殑鏈夌鍙锋暣鍨�
@@ -45,7 +45,7 @@
      * @param length 鏁扮粍闀垮害
      * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
      */
-    OperateResultExOne<int[]> ReadInt32(String address, short length);
+    OperateResultExOne<int[]> ReadInt32( String address, short length );
 
     /**
      * 璇诲彇64浣嶇殑鏈夌鍙锋暣鍨�
@@ -60,7 +60,7 @@
      * @param length 鏁扮粍闀垮害
      * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
      */
-    OperateResultExOne<long[]> ReadInt64(String address, short length);
+    OperateResultExOne<long[]> ReadInt64( String address, short length );
 
     /**
      * 璇诲彇鍗曟诞鐐圭簿搴︾殑鏁版嵁
@@ -75,7 +75,7 @@
      * @param length 鏁扮粍闀垮害
      * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
      */
-    OperateResultExOne<float[]> ReadFloat(String address, short length);
+    OperateResultExOne<float[]> ReadFloat( String address, short length );
 
     /**
      * 璇诲彇鍙屾诞鐐圭簿搴︾殑鏁版嵁
@@ -91,7 +91,7 @@
      * @param length 鏁扮粍闀垮害
      * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
      */
-    OperateResultExOne<double[]> ReadDouble(String address, short length);
+    OperateResultExOne<double[]> ReadDouble( String address, short length );
 
     /**
      * 璇诲彇瀛楃涓叉暟鎹�
@@ -108,7 +108,7 @@
      * @param <T> 鑷畾涔夌殑绫诲瀷
      * @return 甯︽湁鎴愬姛鏍囪瘑鐨勮嚜瀹氫箟绫诲瀷鏁版嵁
      */
-    <T extends IDataTransfer> OperateResultExOne<T> ReadCustomer(String address, Class<T> tClass);
+    <T extends IDataTransfer> OperateResultExOne<T> ReadCustomer(String address,Class<T> tClass);
 
 
 
diff --git a/src/main/java/com/zy/common/HslCommunication/Core/Net/NetHandle.java b/src/main/java/com/zy/common/HslCommunication/Core/Net/NetHandle.java
new file mode 100644
index 0000000..d0b200c
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Net/NetHandle.java
@@ -0,0 +1,116 @@
+package com.zy.common.HslCommunication.Core.Net;
+
+import com.zy.common.HslCommunication.Utilities;
+
+
+/**
+ * 鐢ㄤ簬閫氫俊杩囩▼涓殑鏆楀彿瀵硅薄
+ */
+public final class NetHandle {
+
+
+    /**
+     * 鍒濆鍖栦竴涓殫鍙峰璞�
+     * @param value int鍊�
+     */
+    public NetHandle(int value)
+    {
+        byte[] buffer = Utilities.getBytes(value);
+
+        m_CodeMajor = buffer[3];
+        m_CodeMinor = buffer[2];
+        m_CodeIdentifier = Utilities.getShort(buffer,0);
+
+
+        m_CodeValue = value;
+    }
+
+
+
+    /**
+     * 鏍规嵁涓変釜鍊兼潵鍒濆鍖栨殫鍙峰璞�
+     * @param major 涓绘殫鍙�
+     * @param minor 涓绘殫鍙�
+     * @param identifier 鏆楀彿缂栧彿
+     */
+    public NetHandle(int major, int minor, int identifier)
+    {
+        m_CodeValue = 0;
+
+        byte[] buffer_major=Utilities.getBytes(major);
+        byte[] buffer_minor=Utilities.getBytes(minor);
+        byte[] buffer_identifier=Utilities.getBytes(identifier);
+
+        m_CodeMajor = buffer_major[0];
+        m_CodeMinor = buffer_minor[0];
+        m_CodeIdentifier = Utilities.getShort(buffer_identifier,0);
+
+        byte[] buffer = new byte[4];
+        buffer[3] = m_CodeMajor;
+        buffer[2] = m_CodeMinor;
+        buffer[1] = buffer_identifier[1];
+        buffer[0] = buffer_identifier[0];
+
+        m_CodeValue = Utilities.getInt(buffer,0);
+    }
+
+
+    /**
+     * 瀹屾暣鐨勬殫鍙峰��
+     */
+    private int m_CodeValue;
+
+    /**
+     * 涓绘殫鍙峰垎绫�0-255
+     */
+    private byte m_CodeMajor;
+
+    /**
+     * 娆¤鐨勬殫鍙峰垎绫�0-255
+     */
+    private byte m_CodeMinor;
+
+    /**
+     * 鏆楀彿鐨勭紪鍙峰垎绫�0-65535
+     */
+    private short m_CodeIdentifier;
+
+
+
+    /**
+     * 鑾峰彇瀹屾暣鐨勬殫鍙峰��
+     * @return
+     */
+    public int get_CodeValue(){
+        return  m_CodeValue;
+    }
+
+
+    /**
+     * 鑾峰彇涓绘殫鍙峰垎绫�0-255
+     * @return 涓绘殫鍙�
+     */
+    public byte get_CodeMajor() {
+        return m_CodeMajor;
+    }
+
+
+    /**
+     * 鑾峰彇娆¤鐨勬殫鍙峰垎绫�0-255
+     * @return 娆℃殫鍙�
+     */
+    public byte get_CodeMinor() {
+        return m_CodeMinor;
+    }
+
+
+    /**
+     * 鑾峰彇鏆楀彿鐨勭紪鍙峰垎绫�0-65535
+     * @return 缂栧彿鍒嗙被
+     */
+    public short get_CodeIdentifier() {
+        return m_CodeIdentifier;
+    }
+
+
+}
diff --git a/src/main/java/com/zy/gateway/core/net/NetworkBase.java b/src/main/java/com/zy/common/HslCommunication/Core/Net/NetworkBase/NetworkBase.java
similarity index 94%
rename from src/main/java/com/zy/gateway/core/net/NetworkBase.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Net/NetworkBase/NetworkBase.java
index 6276fef..4d847be 100644
--- a/src/main/java/com/zy/gateway/core/net/NetworkBase.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Net/NetworkBase/NetworkBase.java
@@ -1,12 +1,12 @@
-package com.zy.gateway.core.net;
+package com.zy.common.HslCommunication.Core.Net.NetworkBase;
 
-import com.zy.gateway.core.StringResources;
-import com.zy.gateway.core.domain.HslTimeOut;
-import com.zy.gateway.core.domain.OperateResult;
-import com.zy.gateway.core.domain.OperateResultExOne;
-import com.zy.gateway.core.domain.siemens.INetMessage;
-import com.zy.gateway.core.log.ILogNet;
-import com.zy.gateway.core.utils.Utilities;
+import com.zy.common.HslCommunication.Core.IMessage.INetMessage;
+import com.zy.common.HslCommunication.Core.Types.HslTimeOut;
+import com.zy.common.HslCommunication.Core.Types.OperateResult;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExOne;
+import com.zy.common.HslCommunication.LogNet.Core.ILogNet;
+import com.zy.common.HslCommunication.StringResources;
+import com.zy.common.HslCommunication.Utilities;
 
 import java.io.DataOutputStream;
 import java.io.IOException;
diff --git a/src/main/java/com/zy/gateway/core/net/NetworkDeviceBase.java b/src/main/java/com/zy/common/HslCommunication/Core/Net/NetworkBase/NetworkDeviceBase.java
similarity index 95%
rename from src/main/java/com/zy/gateway/core/net/NetworkDeviceBase.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Net/NetworkBase/NetworkDeviceBase.java
index 161f214..bb451b6 100644
--- a/src/main/java/com/zy/gateway/core/net/NetworkDeviceBase.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Net/NetworkBase/NetworkDeviceBase.java
@@ -1,12 +1,13 @@
-package com.zy.gateway.core.net;
+package com.zy.common.HslCommunication.Core.Net.NetworkBase;
 
-import com.zy.gateway.core.base.SoftBasic;
-import com.zy.gateway.core.domain.IDataTransfer;
-import com.zy.gateway.core.domain.OperateResult;
-import com.zy.gateway.core.domain.OperateResultExOne;
-import com.zy.gateway.core.domain.siemens.INetMessage;
-import com.zy.gateway.core.transfer.IByteTransform;
-import com.zy.gateway.core.utils.Utilities;
+import com.zy.common.HslCommunication.BasicFramework.SoftBasic;
+import com.zy.common.HslCommunication.Core.IMessage.INetMessage;
+import com.zy.common.HslCommunication.Core.Net.IReadWriteNet;
+import com.zy.common.HslCommunication.Core.Transfer.IByteTransform;
+import com.zy.common.HslCommunication.Core.Types.IDataTransfer;
+import com.zy.common.HslCommunication.Core.Types.OperateResult;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExOne;
+import com.zy.common.HslCommunication.Utilities;
 
 
 /**
@@ -62,7 +63,7 @@
      * @param <T> 绫诲瀷鍚嶇О
      * @return 甯︽湁鎴愬姛鏍囪瘑鐨勭粨鏋滃璞�
      */
-    public <T extends IDataTransfer> OperateResultExOne<T> ReadCustomer(String address , Class<T> tClass)
+    public <T extends IDataTransfer> OperateResultExOne<T> ReadCustomer(String address ,Class<T> tClass)
     {
         OperateResultExOne<T> result = new OperateResultExOne<T>();
         T Content;
diff --git a/src/main/java/com/zy/gateway/core/net/NetworkDoubleBase.java b/src/main/java/com/zy/common/HslCommunication/Core/Net/NetworkBase/NetworkDoubleBase.java
similarity index 95%
rename from src/main/java/com/zy/gateway/core/net/NetworkDoubleBase.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Net/NetworkBase/NetworkDoubleBase.java
index 58decda..bd495c5 100644
--- a/src/main/java/com/zy/gateway/core/net/NetworkDoubleBase.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Net/NetworkBase/NetworkDoubleBase.java
@@ -1,14 +1,14 @@
-package com.zy.gateway.core.net;
+package com.zy.common.HslCommunication.Core.Net.NetworkBase;
 
-import com.zy.gateway.core.StringResources;
-import com.zy.gateway.core.base.SoftBasic;
-import com.zy.gateway.core.domain.OperateResult;
-import com.zy.gateway.core.domain.OperateResultExOne;
-import com.zy.gateway.core.domain.OperateResultExTwo;
-import com.zy.gateway.core.domain.siemens.INetMessage;
-import com.zy.gateway.core.net.session.AlienSession;
-import com.zy.gateway.core.transfer.ByteTransformHelper;
-import com.zy.gateway.core.transfer.IByteTransform;
+import com.zy.common.HslCommunication.BasicFramework.SoftBasic;
+import com.zy.common.HslCommunication.Core.IMessage.INetMessage;
+import com.zy.common.HslCommunication.Core.Net.StateOne.AlienSession;
+import com.zy.common.HslCommunication.Core.Transfer.ByteTransformHelper;
+import com.zy.common.HslCommunication.Core.Transfer.IByteTransform;
+import com.zy.common.HslCommunication.Core.Types.OperateResult;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExOne;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExTwo;
+import com.zy.common.HslCommunication.StringResources;
 
 import java.lang.reflect.ParameterizedType;
 import java.net.Socket;
@@ -20,7 +20,7 @@
  * @param <TNetMessage> 娑堟伅绫荤殑绫诲瀷
  * @param <TTransform> 杞崲绫荤殑绫诲瀷
  */
-public class NetworkDoubleBase<TNetMessage extends INetMessage,TTransform extends IByteTransform> extends NetworkBase
+public class NetworkDoubleBase<TNetMessage extends INetMessage  ,TTransform extends IByteTransform> extends NetworkBase
 {
     /**
      * 榛樿鐨勬棤鍙傛瀯閫犲嚱鏁�
diff --git a/src/main/java/com/zy/common/HslCommunication/Core/Net/NetworkBase/NetworkXBase.java b/src/main/java/com/zy/common/HslCommunication/Core/Net/NetworkBase/NetworkXBase.java
new file mode 100644
index 0000000..a89b5e1
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Net/NetworkBase/NetworkXBase.java
@@ -0,0 +1,735 @@
+package com.zy.common.HslCommunication.Core.Net.NetworkBase;
+
+import com.zy.common.HslCommunication.BasicFramework.SoftBasic;
+import com.zy.common.HslCommunication.Core.Net.HslProtocol;
+import com.zy.common.HslCommunication.Core.Net.StateOne.AppSession;
+import com.zy.common.HslCommunication.Core.Types.*;
+import com.zy.common.HslCommunication.StringResources;
+import com.zy.common.HslCommunication.Utilities;
+
+import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.util.Date;
+
+/**
+ * 瀹㈡埛绔湇鍔″櫒鐨勫叡浜熀绫�
+ */
+public class NetworkXBase extends NetworkBase
+{
+
+    /**
+     * 榛樿鐨勬棤鍙傛瀯閫犳柟娉�
+     */
+    public NetworkXBase()
+    {
+    }
+
+    /**
+     * 鍙戦�佹暟鎹殑鏂规硶
+     * @param session 閫氫俊鐢ㄧ殑鏍稿績瀵硅薄
+     * @param content 瀹屾暣鐨勫瓧鑺備俊鎭�
+     */
+    void SendBytesAsync(AppSession session, byte[] content )
+    {
+        if (content == null) return;
+        try
+        {
+            // 杩涘叆鍙戦�佹暟鎹殑閿侊紝鐒跺悗寮�鍚紓姝ョ殑鏁版嵁鍙戦��
+            session.getHybirdLockSend().lock();
+            OutputStream outputStream = session.getWorkSocket().getOutputStream();
+            outputStream.write(content);
+        }
+        catch (Exception ex)
+        {
+            if (!ex.getMessage().contains( StringResources.Language.SocketRemoteCloseException() ))
+            {
+                if(LogNet!=null) LogNet.WriteException( toString( ), StringResources.Language.SocketSendException(), ex );
+            }
+        }
+        finally {
+            session.getHybirdLockSend().unlock();
+        }
+    }
+
+
+    private Thread thread;  // 鍚庡彴绾跨▼
+
+    /**
+     * 寮�濮嬫帴鍙楁暟鎹�
+     * @param session 浼氳瘽淇℃伅
+     */
+    protected void BeginReceiveBackground(AppSession session){
+        thread = new Thread(){
+            @Override
+            public void run(){
+                while (true){
+                    OperateResultExOne<byte[]> readHeadBytes = Receive(session.getWorkSocket(),HslProtocol.HeadByteLength);
+                    if(!readHeadBytes.IsSuccess){
+                        SocketReceiveException( session );
+                        return;
+                    }
+
+                    int length = Utilities.getInt(readHeadBytes.Content,28);
+                    OperateResultExOne<byte[]> readContent = Receive(session.getWorkSocket(),length);
+                    if(!readContent.IsSuccess){
+                        SocketReceiveException( session );
+                        return;
+                    }
+
+                    if (CheckRemoteToken( readHeadBytes.Content ))
+                    {
+                        byte[] head = readHeadBytes.Content;
+                        byte[] content = HslProtocol.CommandAnalysis(head,readContent.Content);
+                        int protocol = Utilities.getInt( head, 0 );
+                        int customer = Utilities.getInt( head, 4 );
+
+                        DataProcessingCenter(session,protocol,customer,content);
+                    }
+                    else {
+                        if(LogNet!=null) LogNet.WriteWarn( toString( ), StringResources.Language.TokenCheckFailed() );
+                        AppSessionRemoteClose( session );
+                    }
+                }
+            }
+        };
+        thread.start();
+    }
+
+    /**
+     * 鏁版嵁澶勭悊涓績锛屽簲璇ョ户鎵块噸鍐�
+     * @param session 杩炴帴鐘舵��
+     * @param protocol 鍗忚澶�
+     * @param customer 鐢ㄦ埛鑷畾涔�
+     * @param content 鏁版嵁鍐呭
+     */
+    protected void DataProcessingCenter( AppSession session, int protocol, int customer, byte[] content ) {
+
+    }
+
+    /**
+     * 妫�鏌ュ綋鍓嶇殑澶村瓙鑺備俊鎭殑浠ょ墝鏄惁鏄纭殑
+     * @param headBytes 澶村瓙鑺傛暟鎹�
+     * @return 浠ょ墝鏄獙璇佹垚鍔�
+     */
+    protected boolean CheckRemoteToken( byte[] headBytes )
+    {
+        return SoftBasic.IsTwoBytesEquel( headBytes,12, Utilities.UUID2Byte(Token),0,16 );
+    }
+
+
+    /**
+     * 鎺ユ敹鍑洪敊鐨勬椂鍊欒繘琛屽鐞�
+     * @param session 浼氳瘽鍐呭
+     */
+    protected void SocketReceiveException( AppSession session ) {
+
+    }
+
+
+    /**
+     * 褰撹繙绔殑瀹㈡埛绔叧闂繛鎺ユ椂瑙﹀彂
+     * @param session 浼氳瘽鍐呭
+     */
+    protected void AppSessionRemoteClose( AppSession session ) {
+
+    }
+
+
+
+    /**
+     * [鑷牎楠宂 鍙戦�佸瓧鑺傛暟鎹苟纭瀵规柟鎺ユ敹瀹屾垚鏁版嵁锛屽鏋滅粨鏋滃紓甯革紝鍒欑粨鏉熼�氳
+     * @param socket 缃戠粶濂楁帴瀛�
+     * @param headcode 澶存寚浠�
+     * @param customer 鐢ㄦ埛鎸囦护
+     * @param send 鍙戦�佺殑鏁版嵁
+     * @return 鏄惁鍙戦�佹垚鍔�
+     */
+    protected OperateResult SendBaseAndCheckReceive(Socket socket, int headcode, int customer, byte[] send )
+    {
+        // 鏁版嵁澶勭悊
+        send = HslProtocol.CommandBytes( headcode, customer, Token, send );
+
+        OperateResult sendResult = Send( socket, send );
+        if(!sendResult.IsSuccess) return sendResult;
+
+        // 妫�鏌ュ鏂规帴鏀跺畬鎴�
+        OperateResultExOne<Long> checkResult = ReceiveLong( socket );
+        if(!checkResult.IsSuccess) return checkResult;
+
+        // 妫�鏌ラ暱搴︽帴鏀�
+        if (checkResult.Content != send.length)
+        {
+            CloseSocket(socket);
+            return new OperateResult(StringResources.Language.CommandLengthCheckFailed());
+        }
+
+        return checkResult;
+    }
+
+
+    /**
+     * [鑷牎楠宂 鍙戦�佸瓧鑺傛暟鎹苟纭瀵规柟鎺ユ敹瀹屾垚鏁版嵁锛屽鏋滅粨鏋滃紓甯革紝鍒欑粨鏉熼�氳
+     * @param socket 缃戠粶濂楁帴瀛�
+     * @param customer 鐢ㄦ埛鎸囦护
+     * @param send 鍙戦�佺殑鏁版嵁
+     * @return 鏄惁鍙戦�佹垚鍔�
+     */
+    protected OperateResult SendBytesAndCheckReceive( Socket socket, int customer, byte[] send )
+    {
+        return SendBaseAndCheckReceive( socket, HslProtocol.ProtocolUserBytes, customer, send );
+    }
+
+
+    /**
+     * [鑷牎楠宂 鐩存帴鍙戦�佸瓧绗︿覆鏁版嵁骞剁‘璁ゅ鏂规帴鏀跺畬鎴愭暟鎹紝濡傛灉缁撴灉寮傚父锛屽垯缁撴潫閫氳
+     * @param socket 缃戠粶濂楁帴瀛�
+     * @param customer 鐢ㄦ埛鎸囦护
+     * @param send 鍙戦�佺殑鏁版嵁
+     * @return 鏄惁鍙戦�佹垚鍔�
+     */
+    protected OperateResult SendStringAndCheckReceive( Socket socket, int customer, String send )
+    {
+        byte[] data =(send == null || send.isEmpty() ) ? null : Utilities.string2Byte( send );
+
+        return SendBaseAndCheckReceive( socket, HslProtocol.ProtocolUserString, customer, data );
+    }
+
+
+
+    /// <summary>
+    /// [鑷牎楠宂 灏嗘枃浠舵暟鎹彂閫佽嚦濂楁帴瀛楋紝濡傛灉缁撴灉寮傚父锛屽垯缁撴潫閫氳
+    /// </summary>
+    /// <param name="socket">缃戠粶濂楁帴瀛�</param>
+    /// <param name="filename">瀹屾暣鐨勬枃浠惰矾寰�</param>
+    /// <param name="filelength">鏂囦欢鐨勯暱搴�</param>
+    /// <param name="report">杩涘害鎶ュ憡鍣�</param>
+    /// <returns>鏄惁鍙戦�佹垚鍔�</returns>
+//    protected OperateResult SendFileStreamToSocket( Socket socket, String filename, long filelength, BiConsumer<Long, Long> report )
+//    {
+//        try
+//        {
+//            OperateResult result = null;
+//            FileInputStream
+//            using (FileStream fs = new FileStream( filename, FileMode.Open, FileAccess.Read ))
+//            {
+//                result = SendStream( socket, fs, filelength, report, true );
+//            }
+//            return result;
+//        }
+//        catch (Exception ex)
+//        {
+//            socket?.Close( );
+//            LogNet?.WriteException( ToString( ), ex );
+//            return new OperateResult( )
+//            {
+//                Message = ex.Message
+//            };
+//        }
+//    }
+
+
+    /// <summary>
+    /// [鑷牎楠宂 灏嗘枃浠舵暟鎹彂閫佽嚦濂楁帴瀛楋紝鍏蜂綋鍙戦�佺粏鑺傚皢鍦ㄧ户鎵跨被涓疄鐜帮紝濡傛灉缁撴灉寮傚父锛屽垯缁撴潫閫氳
+    /// </summary>
+    /// <param name="socket">濂楁帴瀛�</param>
+    /// <param name="filename">鏂囦欢鍚嶇О锛屾枃浠跺繀椤诲瓨鍦�</param>
+    /// <param name="servername">杩滅▼绔殑鏂囦欢鍚嶇О</param>
+    /// <param name="filetag">鏂囦欢鐨勯澶栨爣绛�</param>
+    /// <param name="fileupload">鏂囦欢鐨勪笂浼犱汉</param>
+    /// <param name="sendReport">鍙戦�佽繘搴︽姤鍛�</param>
+    /// <returns>鏄惁鍙戦�佹垚鍔�</returns>
+//    protected OperateResult SendFileAndCheckReceive(
+//            Socket socket,
+//            String filename,
+//            String servername,
+//            String filetag,
+//            String fileupload,
+//            BiConsumer<Long, Long> sendReport
+//    )
+//    {
+//        // 鍙戦�佹枃浠跺悕锛屽ぇ灏忥紝鏍囩
+//        File file = new File(filename);
+//
+//        if (!file.exists())
+//        {
+//            // 濡傛灉鏂囦欢涓嶅瓨鍦�
+//            OperateResult stringResult = SendStringAndCheckReceive( socket, 0, "" );
+//            if (!stringResult.IsSuccess)
+//            {
+//                return stringResult;
+//            }
+//            else
+//            {
+//                CloseSocket(socket);
+//                OperateResult result = new OperateResult();
+//                result.Message = StringResources.FileNotExist;
+//                return  result;
+//            }
+//        }
+//
+//        // 鏂囦欢瀛樺湪鐨勬儏鍐�
+//        Newtonsoft.Json.Linq.JObject json = new Newtonsoft.Json.Linq.JObject
+//        {
+//            { "FileName", new Newtonsoft.Json.Linq.JValue(servername) },
+//            { "FileSize", new Newtonsoft.Json.Linq.JValue(file.length()) },
+//            { "FileTag", new Newtonsoft.Json.Linq.JValue(filetag) },
+//            { "FileUpload", new Newtonsoft.Json.Linq.JValue(fileupload) }
+//        };
+//
+//        // 鍏堝彂閫佹枃浠剁殑淇℃伅鍒板鏂�
+//        OperateResult sendResult = SendStringAndCheckReceive( socket, 1, json.ToString( ) );
+//        if (!sendResult.IsSuccess)
+//        {
+//            return sendResult;
+//        }
+//
+//        // 鏈�鍚庡彂閫�
+//        return SendFileStreamToSocket( socket, filename, file.length(), sendReport );
+//    }
+
+
+
+    /// <summary>
+    /// [鑷牎楠宂 灏嗘祦鏁版嵁鍙戦�佽嚦濂楁帴瀛楋紝鍏蜂綋鍙戦�佺粏鑺傚皢鍦ㄧ户鎵跨被涓疄鐜帮紝濡傛灉缁撴灉寮傚父锛屽垯缁撴潫閫氳
+    /// </summary>
+    /// <param name="socket">濂楁帴瀛�</param>
+    /// <param name="stream">鏂囦欢鍚嶇О锛屾枃浠跺繀椤诲瓨鍦�</param>
+    /// <param name="servername">杩滅▼绔殑鏂囦欢鍚嶇О</param>
+    /// <param name="filetag">鏂囦欢鐨勯澶栨爣绛�</param>
+    /// <param name="fileupload">鏂囦欢鐨勪笂浼犱汉</param>
+    /// <param name="sendReport">鍙戦�佽繘搴︽姤鍛�</param>
+    /// <returns></returns>
+//    protected OperateResult SendFileAndCheckReceive(
+//            Socket socket,
+//            Stream stream,
+//            String servername,
+//            String filetag,
+//            String fileupload,
+//            BiConsumer<Long, Long> sendReport
+//    )
+//    {
+//        // 鏂囦欢瀛樺湪鐨勬儏鍐�
+//        Newtonsoft.Json.Linq.JObject json = new Newtonsoft.Json.Linq.JObject
+//        {
+//            { "FileName", new Newtonsoft.Json.Linq.JValue(servername) },
+//            { "FileSize", new Newtonsoft.Json.Linq.JValue(stream.Length) },
+//            { "FileTag", new Newtonsoft.Json.Linq.JValue(filetag) },
+//            { "FileUpload", new Newtonsoft.Json.Linq.JValue(fileupload) }
+//        };
+//
+//
+//        // 鍙戦�佹枃浠朵俊鎭�
+//        OperateResult fileResult = SendStringAndCheckReceive( socket, 1, json.ToString( ) );
+//        if (!fileResult.IsSuccess) return fileResult;
+//
+//
+//        return SendStream( socket, stream, stream.count(), sendReport, true );
+//    }
+
+
+
+
+
+    /**
+     * [鑷牎楠宂 鎺ユ敹涓�鏉″畬鏁寸殑鍚屾鏁版嵁锛屽寘鍚ご瀛愯妭鍜屽唴瀹瑰瓧鑺傦紝鍩虹鐨勬暟鎹紝濡傛灉缁撴灉寮傚父锛屽垯缁撴潫閫氳
+     * @param socket 濂楁帴瀛�
+     * @param timeout 瓒呮椂鏃堕棿璁剧疆锛屽鏋滀负璐熸暟锛屽垯涓嶆鏌ヨ秴鏃�
+     * @return 鎺ユ敹鐨勭粨鏋滄暟鎹�
+     */
+    protected OperateResultExTwo<byte[], byte[]> ReceiveAndCheckBytes( Socket socket, int timeout ) {
+        // 30绉掕秴鏃舵帴鏀堕獙璇�
+        HslTimeOut hslTimeOut = new HslTimeOut();
+        hslTimeOut.DelayTime = timeout;
+        hslTimeOut.IsSuccessful = false;
+        hslTimeOut.StartTime = new Date();
+        hslTimeOut.WorkSocket = socket;
+
+
+        //if (timeout > 0) ThreadPool.QueueUserWorkItem( new WaitCallback( ThreadPoolCheckTimeOut ), hslTimeOut );
+
+        // 鎺ユ敹澶存寚浠�
+        OperateResultExOne<byte[]> headResult = Receive(socket, HslProtocol.HeadByteLength, timeout);
+        if (!headResult.IsSuccess) {
+            hslTimeOut.IsSuccessful = true;
+            return OperateResultExTwo.<byte[],byte[]>CreateFailedResult(headResult);
+        }
+        hslTimeOut.IsSuccessful = true;
+
+        // 妫�鏌ヤ护鐗�
+        if (!CheckRemoteToken(headResult.Content)) {
+            CloseSocket(socket);
+            return new OperateResultExTwo<>(StringResources.Language.TokenCheckFailed());
+        }
+
+        int contentLength = Utilities.getInt(headResult.Content, HslProtocol.HeadByteLength - 4);
+        // 鎺ユ敹鍐呭
+        OperateResultExOne<byte[]> contentResult = Receive(socket, contentLength);
+        if (!contentResult.IsSuccess) return OperateResultExTwo.CreateFailedResult(contentResult);
+
+        // 杩斿洖鎴愬姛淇℃伅
+        OperateResult checkResult = SendLong(socket, HslProtocol.HeadByteLength + contentLength);
+        if (!checkResult.IsSuccess)  return OperateResultExTwo.CreateFailedResult(checkResult);
+
+        byte[] head = headResult.Content;
+        byte[] content = contentResult.Content;
+        content = HslProtocol.CommandAnalysis(head, content);
+        return OperateResultExTwo.CreateSuccessResult(head, content);
+    }
+
+
+    /**
+     * [鑷牎楠宂 浠庣綉缁滀腑鎺ユ敹涓�涓瓧绗︿覆鏁版嵁锛屽鏋滅粨鏋滃紓甯革紝鍒欑粨鏉熼�氳
+     * @param socket 濂楁帴瀛�
+     * @return 鎺ユ敹鐨勭粨鏋滄暟鎹�
+     */
+    protected OperateResultExTwo<Integer, String> ReceiveStringContentFromSocket( Socket socket ) {
+        OperateResultExTwo<byte[], byte[]> receive = ReceiveAndCheckBytes(socket, 10000);
+        if (!receive.IsSuccess) return OperateResultExTwo.CreateFailedResult(receive);
+
+        // 妫�鏌ユ槸鍚︽槸瀛楃涓蹭俊鎭�
+        if (Utilities.getInt(receive.Content1, 0) != HslProtocol.ProtocolUserString) {
+            if (LogNet != null) LogNet.WriteError(toString(), StringResources.Language.CommandHeadCodeCheckFailed());
+            CloseSocket(socket);
+            return new OperateResultExTwo<>(StringResources.Language.CommandHeadCodeCheckFailed());
+        }
+
+        if (receive.Content2 == null) receive.Content2 = new byte[0];
+        // 鍒嗘瀽鏁版嵁
+        return OperateResultExTwo.CreateSuccessResult(Utilities.getInt(receive.Content1, 4), Utilities.byte2String(receive.Content2));
+    }
+
+
+
+
+    /**
+     * [鑷牎楠宂 浠庣綉缁滀腑鎺ユ敹涓�涓插瓧鑺傛暟鎹紝濡傛灉缁撴灉寮傚父锛屽垯缁撴潫閫氳
+     * @param socket 濂楁帴瀛�
+     * @return 缁撴灉鏁版嵁瀵硅薄
+     */
+    protected OperateResultExTwo<Integer, byte[]> ReceiveBytesContentFromSocket( Socket socket )
+    {
+        OperateResultExTwo<byte[], byte[]> receive = ReceiveAndCheckBytes( socket, 10000 );
+        if (!receive.IsSuccess) return OperateResultExTwo.CreateFailedResult(receive);
+
+        // 妫�鏌ユ槸鍚︽槸瀛楄妭淇℃伅
+        if (Utilities.getInt( receive.Content1, 0 ) != HslProtocol.ProtocolUserBytes)
+        {
+            if(LogNet!=null) LogNet.WriteError( toString( ), StringResources.Language.CommandHeadCodeCheckFailed() );
+            CloseSocket(socket);
+
+            return new OperateResultExTwo<>(StringResources.Language.CommandHeadCodeCheckFailed());
+        }
+
+        // 鍒嗘瀽鏁版嵁
+        return OperateResultExTwo.CreateSuccessResult( Utilities.getInt( receive.Content1, 4 ), receive.Content2 );
+    }
+
+
+    /// <summary>
+    /// [鑷牎楠宂 浠庡鎺ュ瓧涓帴鏀舵枃浠跺ご淇℃伅
+    /// </summary>
+    /// <param name="socket"></param>
+    /// <returns></returns>
+//    protected OperateResult<FileBaseInfo> ReceiveFileHeadFromSocket( Socket socket )
+//    {
+//        // 鍏堟帴鏀舵枃浠跺ご淇℃伅
+//        OperateResult<int, string> receiveString = ReceiveStringContentFromSocket( socket );
+//        if (!receiveString.IsSuccess) return OperateResult.CreateFailedResult<FileBaseInfo>( receiveString );
+//
+//        // 鍒ゆ柇鏂囦欢鏄惁瀛樺湪
+//        if (receiveString.Content1 == 0)
+//        {
+//            socket?.Close( );
+//            LogNet?.WriteWarn( ToString( ), "瀵规柟鏂囦欢涓嶅瓨鍦紝鏃犳硶鎺ユ敹锛�" );
+//            return new OperateResult<FileBaseInfo>( )
+//            {
+//                Message = StringResources.FileNotExist
+//            };
+//        }
+//
+//        OperateResult<FileBaseInfo> result = new OperateResult<FileBaseInfo>( );
+//        result.Content = new FileBaseInfo( );
+//        try
+//        {
+//            // 鎻愬彇淇℃伅
+//            Newtonsoft.Json.Linq.JObject json = Newtonsoft.Json.Linq.JObject.Parse( receiveString.Content2 );
+//            result.Content.Name = SoftBasic.GetValueFromJsonObject( json, "FileName", "" );
+//            result.Content.Size = SoftBasic.GetValueFromJsonObject( json, "FileSize", 0L );
+//            result.Content.Tag = SoftBasic.GetValueFromJsonObject( json, "FileTag", "" );
+//            result.Content.Upload = SoftBasic.GetValueFromJsonObject( json, "FileUpload", "" );
+//            result.IsSuccess = true;
+//        }
+//        catch (Exception ex)
+//        {
+//            socket?.Close( );
+//            result.Message = "鎻愬彇淇℃伅澶辫触锛�" + ex.Message;
+//        }
+//
+//        return result;
+//    }
+
+    /// <summary>
+    /// [鑷牎楠宂 浠庣綉缁滀腑鎺ユ敹涓�涓枃浠讹紝濡傛灉缁撴灉寮傚父锛屽垯缁撴潫閫氳
+    /// </summary>
+    /// <param name="socket">缃戠粶濂楁帴瀛�</param>
+    /// <param name="savename">鎺ユ敹鏂囦欢鍚庝繚瀛樼殑鏂囦欢鍚�</param>
+    /// <param name="receiveReport">鎺ユ敹杩涘害鎶ュ憡</param>
+    /// <returns></returns>
+//    protected OperateResult<FileBaseInfo> ReceiveFileFromSocket( Socket socket, string savename, Action<long, long> receiveReport )
+//    {
+//        // 鍏堟帴鏀舵枃浠跺ご淇℃伅
+//        OperateResult<FileBaseInfo> fileResult = ReceiveFileHeadFromSocket( socket );
+//        if (!fileResult.IsSuccess) return fileResult;
+//
+//        try
+//        {
+//            using (FileStream fs = new FileStream( savename, FileMode.Create, FileAccess.Write ))
+//            {
+//                WriteStream( socket, fs, fileResult.Content.Size, receiveReport, true );
+//            }
+//            return fileResult;
+//        }
+//        catch (Exception ex)
+//        {
+//            LogNet?.WriteException( ToString( ), ex );
+//            socket?.Close( );
+//            return new OperateResult<FileBaseInfo>( )
+//            {
+//                Message = ex.Message
+//            };
+//        }
+//    }
+
+
+    /// <summary>
+    /// [鑷牎楠宂 浠庣綉缁滀腑鎺ユ敹涓�涓枃浠讹紝鍐欏叆鏁版嵁娴侊紝濡傛灉缁撴灉寮傚父锛屽垯缁撴潫閫氳锛屽弬鏁伴『搴忔枃浠跺悕锛屾枃浠跺ぇ灏忥紝鏂囦欢鏍囪瘑锛屼笂浼犱汉
+    /// </summary>
+    /// <param name="socket">缃戠粶濂楁帴瀛�</param>
+    /// <param name="stream">绛夊緟鍐欏叆鐨勬暟鎹祦</param>
+    /// <param name="receiveReport">鎺ユ敹杩涘害鎶ュ憡</param>
+    /// <returns></returns>
+//    protected OperateResult<FileBaseInfo> ReceiveFileFromSocket( Socket socket, Stream stream, Action<long, long> receiveReport )
+//    {
+//        // 鍏堟帴鏀舵枃浠跺ご淇℃伅
+//        OperateResult<FileBaseInfo> fileResult = ReceiveFileHeadFromSocket( socket );
+//        if (!fileResult.IsSuccess) return fileResult;
+//
+//        try
+//        {
+//            WriteStream( socket, stream, fileResult.Content.Size, receiveReport, true );
+//            return fileResult;
+//        }
+//        catch (Exception ex)
+//        {
+//            LogNet?.WriteException( ToString( ), ex );
+//            socket?.Close( );
+//            return new OperateResult<FileBaseInfo>( )
+//            {
+//                Message = ex.Message
+//            };
+//        }
+//    }
+
+
+    /**
+     * 鍒犻櫎鏂囦欢鐨勬搷浣�
+     * @param filename 鏂囦欢鐨勫悕绉�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    protected boolean DeleteFileByName( String filename )
+    {
+        try
+        {
+            File file = new File(filename);
+
+            if (!file.exists()) return true;
+            file.delete();
+            return true;
+        }
+        catch (Exception ex)
+        {
+            if(LogNet!=null) LogNet.WriteException( toString( ), "delete file failed:" + filename, ex );
+            return false;
+        }
+    }
+
+
+    /**
+     * 棰勫鐞嗘枃浠跺す鐨勫悕绉帮紝闄ゅ幓鏂囦欢澶瑰悕绉版渶鍚庝竴涓�'\'锛屽鏋滄湁鐨勮瘽
+     * @param folder 鏂囦欢澶瑰悕绉�
+     * @return 缁撴灉鏁版嵁
+     */
+    protected String PreprocessFolderName( String folder ) {
+        if (folder.endsWith("\\")) {
+            return folder.substring(0, folder.length() - 1);
+        } else {
+            return folder;
+        }
+    }
+
+
+
+
+
+
+
+
+
+
+    /**
+     * 浠庣綉缁滀腑鎺ユ敹Long鏁版嵁
+     * @param socket 濂楁帴瀛椾俊鎭�
+     * @return 杩斿洖鐨勭粨鏋�
+     */
+    private OperateResultExOne<Long> ReceiveLong( Socket socket ) {
+        OperateResultExOne<byte[]> read = Receive(socket, 8);
+        if (!read.IsSuccess) return OperateResultExOne.CreateFailedResult(read);
+
+        return OperateResultExOne.CreateSuccessResult(Utilities.getLong(read.Content, 0));
+    }
+
+    /**
+     * 灏哃ong鏁版嵁鍙戦�佸埌濂楁帴瀛�
+     * @param socket 濂楁帴瀛�
+     * @param value 鍊�
+     * @return 杩斿洖鐨勭粨鏋�
+     */
+    private OperateResult SendLong( Socket socket, long value )
+    {
+        return Send( socket, Utilities.getBytes( value ) );
+    }
+
+
+
+
+
+    /**
+     * 鍙戦�佷竴涓祦鐨勬墍鏈夋暟鎹埌缃戠粶濂楁帴瀛�
+     * @param socket 缃戠粶濂楁帴瀛�
+     * @param stream 杈撳叆娴�
+     * @param receive 鎺ユ敹闀垮害
+     * @param report 杩涘害鎶ュ憡
+     * @param reportByPercent 鏄惁鎸夌収鐧惧垎姣旀姤鍛婅繘搴�
+     * @return 鏄惁鎴愬姛
+     */
+    protected OperateResult SendStream(Socket socket, InputStream stream, long receive, ActionOperateExTwo<Long, Long> report, boolean reportByPercent )
+    {
+        byte[] buffer = new byte[102400]; // 100K鐨勬暟鎹紦瀛樻睜
+        long SendTotal = 0;
+        long percent = 0;
+        while (SendTotal < receive)
+        {
+            // 鍏堜粠娴佷腑鎺ユ敹鏁版嵁
+            OperateResultExOne<Integer> read = ReadStream( stream, buffer );
+            if (!read.IsSuccess)
+            {
+                OperateResult result = new OperateResult();
+                result.Message = read.Message;
+                return  result;
+            }
+            else
+            {
+                SendTotal += read.Content;
+            }
+
+            // 鐒跺悗鍐嶅紓姝ュ啓鍒皊ocket涓�
+            byte[] newBuffer = new byte[read.Content];
+            System.arraycopy( buffer, 0, newBuffer, 0, newBuffer.length );
+            OperateResult write = SendBytesAndCheckReceive( socket, read.Content, newBuffer );
+            if (!write.IsSuccess)
+            {
+                OperateResult result = new OperateResult();
+                result.Message = write.Message;
+                return  result;
+            }
+
+            // 鎶ュ憡杩涘害
+            if (reportByPercent)
+            {
+                long percentCurrent = SendTotal * 100 / receive;
+                if (percent != percentCurrent)
+                {
+                    percent = percentCurrent;
+                    if(report!=null) report.Action( SendTotal, receive );
+                }
+            }
+            else
+            {
+                // 鎶ュ憡杩涘害
+                if(report!=null) report.Action( SendTotal, receive );
+            }
+        }
+
+        return OperateResult.CreateSuccessResult( );
+    }
+
+
+    /**
+     * 浠庡鎺ュ瓧涓帴鏀舵墍鏈夌殑鏁版嵁鐒跺悗鍐欏叆鍒版祦褰撲腑鍘�
+     * @param socket 缃戠粶濂楁帴瀛�
+     * @param stream 杈撳嚭娴�
+     * @param totalLength 鎬婚暱搴�
+     * @param report 杩涘害鎶ュ憡
+     * @param reportByPercent 杩涘害鎶ュ憡鏄惁鎸夌収鐧惧垎姣�
+     * @return 缁撴灉绫诲璞�
+     */
+    protected OperateResult WriteStream(Socket socket, OutputStream stream, long totalLength, ActionOperateExTwo<Long, Long> report, boolean reportByPercent )
+    {
+        long count_receive = 0;
+        long percent = 0;
+        while (count_receive < totalLength)
+        {
+            // 鍏堜粠娴佷腑寮傛鎺ユ敹鏁版嵁
+            OperateResultExTwo<Integer,byte[]> read = ReceiveBytesContentFromSocket( socket );
+            if (!read.IsSuccess)
+            {
+                OperateResult result = new OperateResult();
+                result.Message = read.Message;
+                return  result;
+            }
+            count_receive += read.Content1;
+
+            // 寮�濮嬪啓鍏ユ枃浠舵祦
+            OperateResult write = WriteStream( stream, read.Content2 );
+            if (!write.IsSuccess)
+            {
+                OperateResult result = new OperateResult();
+                result.Message = write.Message;
+                return  result;
+            }
+
+            // 鎶ュ憡杩涘害
+            if (reportByPercent)
+            {
+                long percentCurrent = count_receive * 100 / totalLength;
+                if (percent != percentCurrent)
+                {
+                    percent = percentCurrent;
+                    if(report!=null) report.Action( count_receive, totalLength );
+                }
+            }
+            else
+            {
+                if(report!=null) report.Action( count_receive, totalLength );
+            }
+
+        }
+
+        return OperateResult.CreateSuccessResult( );
+    }
+
+
+
+    /**
+     * 杩斿洖琛ㄧず褰撳墠瀵硅薄鐨勫瓧绗︿覆
+     * @return
+     */
+    @Override
+    public String toString()
+    {
+        return "NetworkXBase";
+    }
+
+}
diff --git a/src/main/java/com/zy/gateway/core/net/session/AlienSession.java b/src/main/java/com/zy/common/HslCommunication/Core/Net/StateOne/AlienSession.java
similarity index 95%
rename from src/main/java/com/zy/gateway/core/net/session/AlienSession.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Net/StateOne/AlienSession.java
index eee6e96..5f5f0bb 100644
--- a/src/main/java/com/zy/gateway/core/net/session/AlienSession.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Net/StateOne/AlienSession.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.net.session;
+package com.zy.common.HslCommunication.Core.Net.StateOne;
 
 import java.net.Socket;
 
diff --git a/src/main/java/com/zy/gateway/core/net/session/AppSession.java b/src/main/java/com/zy/common/HslCommunication/Core/Net/StateOne/AppSession.java
similarity index 95%
rename from src/main/java/com/zy/gateway/core/net/session/AppSession.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Net/StateOne/AppSession.java
index f3b41b3..2df2452 100644
--- a/src/main/java/com/zy/gateway/core/net/session/AppSession.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Net/StateOne/AppSession.java
@@ -1,7 +1,7 @@
-package com.zy.gateway.core.net.session;
+package com.zy.common.HslCommunication.Core.Net.StateOne;
 
-import com.zy.gateway.core.base.SoftBasic;
-import com.zy.gateway.core.net.HslProtocol;
+import com.zy.common.HslCommunication.BasicFramework.SoftBasic;
+import com.zy.common.HslCommunication.Core.Net.HslProtocol;
 
 import java.net.InetAddress;
 import java.net.Socket;
diff --git a/src/main/java/com/zy/gateway/core/base/HslSecurity.java b/src/main/java/com/zy/common/HslCommunication/Core/Security/HslSecurity.java
similarity index 93%
rename from src/main/java/com/zy/gateway/core/base/HslSecurity.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Security/HslSecurity.java
index f0a441e..3247cdd 100644
--- a/src/main/java/com/zy/gateway/core/base/HslSecurity.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Security/HslSecurity.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.base;
+package com.zy.common.HslCommunication.Core.Security;
 
 public class HslSecurity {
 
diff --git a/src/main/java/com/zy/gateway/core/transfer/ByteTransformBase.java b/src/main/java/com/zy/common/HslCommunication/Core/Transfer/ByteTransformBase.java
similarity index 98%
rename from src/main/java/com/zy/gateway/core/transfer/ByteTransformBase.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Transfer/ByteTransformBase.java
index 51f7267..31d76d0 100644
--- a/src/main/java/com/zy/gateway/core/transfer/ByteTransformBase.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Transfer/ByteTransformBase.java
@@ -1,6 +1,6 @@
-package com.zy.gateway.core.transfer;
+package com.zy.common.HslCommunication.Core.Transfer;
 
-import com.zy.gateway.core.utils.Utilities;
+import com.zy.common.HslCommunication.Utilities;
 
 
 /**
diff --git a/src/main/java/com/zy/gateway/core/transfer/ByteTransformHelper.java b/src/main/java/com/zy/common/HslCommunication/Core/Transfer/ByteTransformHelper.java
similarity index 93%
rename from src/main/java/com/zy/gateway/core/transfer/ByteTransformHelper.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Transfer/ByteTransformHelper.java
index bec4ff0..992187e 100644
--- a/src/main/java/com/zy/gateway/core/transfer/ByteTransformHelper.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Transfer/ByteTransformHelper.java
@@ -1,8 +1,8 @@
-package com.zy.gateway.core.transfer;
+package com.zy.common.HslCommunication.Core.Transfer;
 
-import com.zy.gateway.core.base.SoftBasic;
-import com.zy.gateway.core.domain.FunctionOperateExOne;
-import com.zy.gateway.core.domain.OperateResultExOne;
+import com.zy.common.HslCommunication.BasicFramework.SoftBasic;
+import com.zy.common.HslCommunication.Core.Types.FunctionOperateExOne;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExOne;
 
 public class ByteTransformHelper {
 
@@ -13,7 +13,7 @@
      * @param <TResult> 缁撴灉绫诲瀷
      * @return 鏈�鏂扮殑缁撴灉瀵硅薄
      */
-    public static <TResult> OperateResultExOne<TResult> GetResultFromBytes(OperateResultExOne<byte[]> result, FunctionOperateExOne<byte[], TResult> translator )
+    public static <TResult> OperateResultExOne<TResult> GetResultFromBytes( OperateResultExOne<byte[]> result, FunctionOperateExOne<byte[], TResult> translator )
     {
         OperateResultExOne<TResult> tmp = new OperateResultExOne<TResult>( );
         try
diff --git a/src/main/java/com/zy/gateway/core/transfer/DataFormat.java b/src/main/java/com/zy/common/HslCommunication/Core/Transfer/DataFormat.java
similarity index 85%
rename from src/main/java/com/zy/gateway/core/transfer/DataFormat.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Transfer/DataFormat.java
index c3d62c9..bc319d5 100644
--- a/src/main/java/com/zy/gateway/core/transfer/DataFormat.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Transfer/DataFormat.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.transfer;
+package com.zy.common.HslCommunication.Core.Transfer;
 
 /**
  * 搴旂敤浜庡瀛楄妭鏁版嵁鐨勮В鏋愭垨鏄敓鎴愭牸寮�
diff --git a/src/main/java/com/zy/gateway/core/transfer/IByteTransform.java b/src/main/java/com/zy/common/HslCommunication/Core/Transfer/IByteTransform.java
similarity index 75%
rename from src/main/java/com/zy/gateway/core/transfer/IByteTransform.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Transfer/IByteTransform.java
index 3f286e9..4c22caf 100644
--- a/src/main/java/com/zy/gateway/core/transfer/IByteTransform.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Transfer/IByteTransform.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.transfer;
+package com.zy.common.HslCommunication.Core.Transfer;
 
 public interface IByteTransform {
 
@@ -10,7 +10,7 @@
      * @param index 绱㈠紩浣嶇疆
      * @return boolean鍊�
      */
-    boolean TransBool(byte[] buffer, int index);
+    boolean TransBool( byte[] buffer, int index );
 
     /**
      * 缂撳瓨涓彁鍙朾yte缁撴灉
@@ -18,7 +18,7 @@
      * @param index 绱㈠紩浣嶇疆
      * @return byte瀵硅薄
      */
-    byte TransByte(byte[] buffer, int index);
+    byte TransByte( byte[] buffer, int index );
 
     /**
      * 浠庣紦瀛樹腑鎻愬彇byte鏁扮粍缁撴灉
@@ -27,7 +27,7 @@
      * @param length 璇诲彇鐨勬暟缁勯暱搴�
      * @return
      */
-    byte[] TransByte(byte[] buffer, int index, int length);
+    byte[] TransByte( byte[] buffer, int index, int length );
 
     /**
      * 浠庣紦瀛樹腑鎻愬彇short缁撴灉
@@ -35,7 +35,7 @@
      * @param index 绱㈠紩浣嶇疆
      * @return short瀵硅薄
      */
-    short TransInt16(byte[] buffer, int index);
+    short TransInt16( byte[] buffer, int index );
 
     /**
      * 浠庣紦瀛樹腑鎻愬彇short缁撴灉
@@ -44,7 +44,7 @@
      * @param length 璇诲彇鐨勬暟缁勯暱搴�
      * @return short鏁扮粍瀵硅薄
      */
-    short[] TransInt16(byte[] buffer, int index, int length);
+    short[] TransInt16( byte[] buffer, int index, int length );
 
     /**
      * 浠庣紦瀛樹腑鎻愬彇int缁撴灉
@@ -52,7 +52,7 @@
      * @param index 绱㈠紩浣嶇疆
      * @return int瀵硅薄
      */
-    int TransInt32(byte[] buffer, int index);
+    int TransInt32( byte[] buffer, int index );
 
 
     /**
@@ -62,7 +62,7 @@
      * @param length 璇诲彇鐨勬暟缁勯暱搴�
      * @return int鏁扮粍瀵硅薄
      */
-    int[] TransInt32(byte[] buffer, int index, int length);
+    int[] TransInt32( byte[] buffer, int index, int length );
 
 
     /**
@@ -71,7 +71,7 @@
      * @param index 绱㈠紩浣嶇疆
      * @return long瀵硅薄
      */
-    long TransInt64(byte[] buffer, int index);
+    long TransInt64( byte[] buffer, int index );
 
 
     /**
@@ -81,7 +81,7 @@
      * @param length 璇诲彇鐨勬暟缁勯暱搴�
      * @return long鏁扮粍瀵硅薄
      */
-    long[] TransInt64(byte[] buffer, int index, int length);
+    long[] TransInt64( byte[] buffer, int index, int length );
 
 
     /**
@@ -90,7 +90,7 @@
      * @param index 绱㈠紩浣嶇疆
      * @return float瀵硅薄
      */
-    float TransSingle(byte[] buffer, int index);
+    float TransSingle( byte[] buffer, int index );
 
 
     /**
@@ -100,7 +100,7 @@
      * @param length 璇诲彇鐨勬暟缁勯暱搴�
      * @return float鏁扮粍瀵硅薄
      */
-    float[] TransSingle(byte[] buffer, int index, int length);
+    float[] TransSingle( byte[] buffer, int index, int length );
 
 
     /**
@@ -109,7 +109,7 @@
      * @param index 绱㈠紩浣嶇疆
      * @return double瀵硅薄
      */
-    double TransDouble(byte[] buffer, int index);
+    double TransDouble( byte[] buffer, int index );
 
 
     /**
@@ -119,7 +119,7 @@
      * @param length 璇诲彇鐨勬暟缁勯暱搴�
      * @return double鏁扮粍
      */
-    double[] TransDouble(byte[] buffer, int index, int length);
+    double[] TransDouble( byte[] buffer, int index, int length );
 
 
     /**
@@ -130,7 +130,7 @@
      * @param encoding 瀛楃涓茬殑缂栫爜
      * @return string瀵硅薄
      */
-    String TransString(byte[] buffer, int index, int length, String encoding);
+    String TransString( byte[] buffer, int index, int length, String encoding );
 
 
 
@@ -147,7 +147,7 @@
      * @param value 绛夊緟杞寲鐨勬暟鎹�
      * @return buffer鏁版嵁
      */
-    byte[] TransByte(boolean value);
+    byte[] TransByte( boolean value );
 
 
     /**
@@ -155,7 +155,7 @@
      * @param values 绛夊緟杞寲鐨勬暟缁�
      * @return buffer鏁版嵁
      */
-    byte[] TransByte(boolean[] values);
+    byte[] TransByte( boolean[] values );
 
 
     /**
@@ -163,21 +163,21 @@
      * @param value 绛夊緟杞寲鐨勬暟鎹�
      * @return buffer鏁版嵁
      */
-    byte[] TransByte(byte value);
+    byte[] TransByte( byte value );
 
     /**
      * short鍙橀噺杞寲缂撳瓨鏁版嵁
      * @param value 绛夊緟杞寲鐨勬暟鎹�
      * @return buffer鏁版嵁
      */
-    byte[] TransByte(short value);
+    byte[] TransByte( short value );
 
     /**
      * short鏁扮粍鍙橀噺杞寲缂撳瓨鏁版嵁
      * @param values 绛夊緟杞寲鐨勬暟缁�
      * @return buffer鏁版嵁
      */
-    byte[] TransByte(short[] values);
+    byte[] TransByte( short[] values );
 
 
     /**
@@ -185,7 +185,7 @@
      * @param value 绛夊緟杞寲鐨勬暟鎹�
      * @return buffer鏁版嵁
      */
-    byte[] TransByte(int value);
+    byte[] TransByte( int value );
 
 
     /**
@@ -193,14 +193,14 @@
      * @param values 绛夊緟杞寲鐨勬暟缁�
      * @return buffer鏁版嵁
      */
-    byte[] TransByte(int[] values);
+    byte[] TransByte( int[] values );
 
     /**
      * long鍙橀噺杞寲缂撳瓨鏁版嵁
      * @param value 绛夊緟杞寲鐨勬暟鎹�
      * @return buffer鏁版嵁
      */
-    byte[] TransByte(long value);
+    byte[] TransByte( long value );
 
 
     /**
@@ -208,7 +208,7 @@
      * @param values 绛夊緟杞寲鐨勬暟缁�
      * @return v
      */
-    byte[] TransByte(long[] values);
+    byte[] TransByte( long[] values );
 
 
     /**
@@ -216,7 +216,7 @@
      * @param value 绛夊緟杞寲鐨勬暟鎹�
      * @return buffer鏁版嵁
      */
-    byte[] TransByte(float value);
+    byte[] TransByte( float value );
 
 
     /**
@@ -224,7 +224,7 @@
      * @param values 绛夊緟杞寲鐨勬暟缁�
      * @return buffer鏁版嵁
      */
-    byte[] TransByte(float[] values);
+    byte[] TransByte( float[] values );
 
 
     /**
@@ -232,14 +232,14 @@
      * @param value 绛夊緟杞寲鐨勬暟鎹�
      * @return buffer鏁版嵁
      */
-    byte[] TransByte(double value);
+    byte[] TransByte( double value );
 
     /**
      * double鏁扮粍鍙橀噺杞寲缂撳瓨鏁版嵁
      * @param values 绛夊緟杞寲鐨勬暟缁�
      * @return buffer鏁版嵁
      */
-    byte[] TransByte(double[] values);
+    byte[] TransByte( double[] values );
 
     /**
      * 浣跨敤鎸囧畾鐨勭紪鐮佸瓧绗︿覆杞寲缂撳瓨鏁版嵁
@@ -247,14 +247,14 @@
      * @param encoding 瀛楃涓茬殑缂栫爜鏂瑰紡
      * @return buffer鏁版嵁
      */
-    byte[] TransByte(String value, String encoding);
+    byte[] TransByte( String value, String encoding );
 
 
     /**
      * 璁剧疆鏁版嵁瑙f瀽鐨勬牸寮忥紝ABCD锛孊ADC锛孋DAB锛孌CBA鏍煎紡
      * @param dataFormat
      */
-    void setDataFormat(DataFormat dataFormat);
+    void setDataFormat( DataFormat dataFormat );
 
     /**
      * 鑾峰彇鏁版嵁瑙f瀽鐨勬牸寮忥紝榛樿ABCD锛屽彲閫塀ADC锛孋DAB锛孌CBA鏍煎紡
diff --git a/src/main/java/com/zy/common/HslCommunication/Core/Transfer/RegularByteTransform.java b/src/main/java/com/zy/common/HslCommunication/Core/Transfer/RegularByteTransform.java
new file mode 100644
index 0000000..fb20d6e
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Transfer/RegularByteTransform.java
@@ -0,0 +1,5 @@
+package com.zy.common.HslCommunication.Core.Transfer;
+
+public class RegularByteTransform extends ByteTransformBase
+{
+}
diff --git a/src/main/java/com/zy/gateway/core/transfer/ReverseBytesTransform.java b/src/main/java/com/zy/common/HslCommunication/Core/Transfer/ReverseBytesTransform.java
similarity index 97%
rename from src/main/java/com/zy/gateway/core/transfer/ReverseBytesTransform.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Transfer/ReverseBytesTransform.java
index eeba225..94fccac 100644
--- a/src/main/java/com/zy/gateway/core/transfer/ReverseBytesTransform.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Transfer/ReverseBytesTransform.java
@@ -1,6 +1,6 @@
-package com.zy.gateway.core.transfer;
+package com.zy.common.HslCommunication.Core.Transfer;
 
-import com.zy.gateway.core.utils.Utilities;
+import com.zy.common.HslCommunication.Utilities;
 
 /**
  * 鍙嶈浆鐨勫瓧鑺傚彉鎹㈢被
diff --git a/src/main/java/com/zy/common/HslCommunication/Core/Transfer/ReverseWordTransform.java b/src/main/java/com/zy/common/HslCommunication/Core/Transfer/ReverseWordTransform.java
new file mode 100644
index 0000000..aad67de
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Transfer/ReverseWordTransform.java
@@ -0,0 +1,142 @@
+package com.zy.common.HslCommunication.Core.Transfer;
+
+import com.zy.common.HslCommunication.BasicFramework.SoftBasic;
+import com.zy.common.HslCommunication.Utilities;
+
+/**
+ * 浠ュ瓧鑺備负鍗曚綅鐨勫彉鎹㈡搷浣�
+ */
+public class ReverseWordTransform extends ByteTransformBase
+{
+    /**
+     * 瀹炰緥鍖栦竴涓粯璁ょ殑瀵硅薄
+     */
+    public  ReverseWordTransform(){
+        this.setDataFormat(DataFormat.ABCD);
+    }
+
+    /**
+     * 鎸夌収瀛楄妭閿欎綅鐨勬柟娉�
+     * @param buffer 瀹為檯鐨勫瓧鑺傛暟鎹�
+     * @param index 璧峰瀛楄妭浣嶇疆
+     * @param length 鏁版嵁闀垮害
+     * @return
+     */
+    private byte[] ReverseBytesByWord( byte[] buffer, int index, int length )
+    {
+        byte[] tmp = new byte[length];
+
+        for (int i = 0; i < length; i++)
+        {
+            tmp[i] = buffer[index + i];
+        }
+
+        for (int i = 0; i < length / 2; i++)
+        {
+            byte b = tmp[i * 2 + 0];
+            tmp[i * 2 + 0] = tmp[i * 2 + 1];
+            tmp[i * 2 + 1] = b;
+        }
+
+        return tmp;
+    }
+
+    private byte[] ReverseBytesByWord( byte[] buffer )
+    {
+        return ReverseBytesByWord( buffer, 0, buffer.length );
+    }
+
+
+    /**
+     * 瀛楃涓叉暟鎹槸鍚︽寜鐓у瓧鏉ュ弽杞�
+     */
+    public boolean IsStringReverse =false;
+
+
+
+
+    /**
+     * 浠庣紦瀛樹腑鎻愬彇short缁撴灉
+     * @param buffer 缂撳瓨鏁版嵁
+     * @param index 绱㈠紩浣嶇疆
+     * @return short瀵硅薄
+     */
+    @Override
+    public short TransInt16( byte[] buffer, int index ) {
+        return Utilities.getShort(ReverseBytesByWord(buffer, index, 2), 0);
+    }
+
+
+
+    /**
+     * 浠庣紦瀛樹腑鎻愬彇string缁撴灉锛屼娇鐢ㄦ寚瀹氱殑缂栫爜
+     * @param buffer 缂撳瓨瀵硅薄
+     * @param index 绱㈠紩浣嶇疆
+     * @param length byte鏁扮粍闀垮害
+     * @param encoding 瀛楃涓茬殑缂栫爜
+     * @return string瀵硅薄
+     */
+    @Override
+    public String TransString( byte[] buffer, int index, int length, String encoding ) {
+        byte[] tmp = TransByte(buffer, index, length);
+
+        if (IsStringReverse) {
+            return Utilities.getString(ReverseBytesByWord(tmp), "ASCII");
+        } else {
+            return Utilities.getString(tmp, "ASCII");
+        }
+    }
+
+
+
+    /**
+     * bool鏁扮粍鍙橀噺杞寲缂撳瓨鏁版嵁
+     * @param values 绛夊緟杞寲鐨勬暟缁�
+     * @return buffer鏁版嵁
+     */
+    @Override
+    public byte[] TransByte( boolean[] values ) {
+        return SoftBasic.BoolArrayToByte(values);
+    }
+
+
+
+    /**
+     * short鏁扮粍鍙橀噺杞寲缂撳瓨鏁版嵁
+     * @param values 绛夊緟杞寲鐨勬暟缁�
+     * @return buffer鏁版嵁
+     */
+    @Override
+    public byte[] TransByte( short[] values ) {
+        if (values == null) return null;
+
+        byte[] buffer = new byte[values.length * 2];
+        for (int i = 0; i < values.length; i++) {
+            byte[] tmp = Utilities.getBytes(values[i]);
+            System.arraycopy(tmp, 0, buffer, 2 * i, tmp.length);
+        }
+
+        return ReverseBytesByWord(buffer);
+    }
+
+
+
+    /**
+     * 浣跨敤鎸囧畾鐨勭紪鐮佸瓧绗︿覆杞寲缂撳瓨鏁版嵁
+     * @param value 绛夊緟杞寲鐨勬暟鎹�
+     * @param encoding 瀛楃涓茬殑缂栫爜鏂瑰紡
+     * @return buffer鏁版嵁
+     */
+    @Override
+    public byte[] TransByte( String value, String encoding ) {
+        if (value == null) return null;
+        byte[] buffer = Utilities.getBytes(value, encoding);
+        buffer = SoftBasic.ArrayExpandToLengthEven(buffer);
+        if (IsStringReverse) {
+            return ReverseBytesByWord(buffer);
+        } else {
+            return buffer;
+        }
+    }
+
+}
diff --git a/src/main/java/com/zy/gateway/core/domain/ActionOperate.java b/src/main/java/com/zy/common/HslCommunication/Core/Types/ActionOperate.java
similarity index 71%
rename from src/main/java/com/zy/gateway/core/domain/ActionOperate.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Types/ActionOperate.java
index f13c3ad..dd8224b 100644
--- a/src/main/java/com/zy/gateway/core/domain/ActionOperate.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Types/ActionOperate.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.domain;
+package com.zy.common.HslCommunication.Core.Types;
 
 /**
  * 绌烘搷浣滅殑绫�
diff --git a/src/main/java/com/zy/gateway/core/domain/ActionOperateExOne.java b/src/main/java/com/zy/common/HslCommunication/Core/Types/ActionOperateExOne.java
similarity index 82%
rename from src/main/java/com/zy/gateway/core/domain/ActionOperateExOne.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Types/ActionOperateExOne.java
index 7cfb22d..99b36cb 100644
--- a/src/main/java/com/zy/gateway/core/domain/ActionOperateExOne.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Types/ActionOperateExOne.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.domain;
+package com.zy.common.HslCommunication.Core.Types;
 
 /**
  * 甯︿竴涓弬鏁板璞$殑鎿嶄綔绫�
diff --git a/src/main/java/com/zy/gateway/core/domain/ActionOperateExThree.java b/src/main/java/com/zy/common/HslCommunication/Core/Types/ActionOperateExThree.java
similarity index 88%
rename from src/main/java/com/zy/gateway/core/domain/ActionOperateExThree.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Types/ActionOperateExThree.java
index 0f70560..c8aef5e 100644
--- a/src/main/java/com/zy/gateway/core/domain/ActionOperateExThree.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Types/ActionOperateExThree.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.domain;
+package com.zy.common.HslCommunication.Core.Types;
 
 /**
  * 甯︿笁涓弬鏁扮殑绫诲瀷瀵硅薄
diff --git a/src/main/java/com/zy/gateway/core/domain/ActionOperateExTwo.java b/src/main/java/com/zy/common/HslCommunication/Core/Types/ActionOperateExTwo.java
similarity index 86%
rename from src/main/java/com/zy/gateway/core/domain/ActionOperateExTwo.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Types/ActionOperateExTwo.java
index b7c905e..f8ed2d9 100644
--- a/src/main/java/com/zy/gateway/core/domain/ActionOperateExTwo.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Types/ActionOperateExTwo.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.domain;
+package com.zy.common.HslCommunication.Core.Types;
 
 /**
  * 甯︿簩涓弬鏁板璞$殑鎿嶄綔绫�
diff --git a/src/main/java/com/zy/gateway/core/domain/FunctionOperate.java b/src/main/java/com/zy/common/HslCommunication/Core/Types/FunctionOperate.java
similarity index 62%
rename from src/main/java/com/zy/gateway/core/domain/FunctionOperate.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Types/FunctionOperate.java
index 05d030d..a18f894 100644
--- a/src/main/java/com/zy/gateway/core/domain/FunctionOperate.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Types/FunctionOperate.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.domain;
+package com.zy.common.HslCommunication.Core.Types;
 
 public class FunctionOperate<R>
 {
diff --git a/src/main/java/com/zy/gateway/core/domain/FunctionOperateExOne.java b/src/main/java/com/zy/common/HslCommunication/Core/Types/FunctionOperateExOne.java
similarity index 66%
rename from src/main/java/com/zy/gateway/core/domain/FunctionOperateExOne.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Types/FunctionOperateExOne.java
index 4c89313..48aebaa 100644
--- a/src/main/java/com/zy/gateway/core/domain/FunctionOperateExOne.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Types/FunctionOperateExOne.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.domain;
+package com.zy.common.HslCommunication.Core.Types;
 
 public class FunctionOperateExOne<T,R>
 {
diff --git a/src/main/java/com/zy/gateway/core/domain/HslTimeOut.java b/src/main/java/com/zy/common/HslCommunication/Core/Types/HslTimeOut.java
similarity index 91%
rename from src/main/java/com/zy/gateway/core/domain/HslTimeOut.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Types/HslTimeOut.java
index 9a00afb..a929704 100644
--- a/src/main/java/com/zy/gateway/core/domain/HslTimeOut.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Types/HslTimeOut.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.domain;
+package com.zy.common.HslCommunication.Core.Types;
 import java.net.Socket;
 import java.util.Date;
 
diff --git a/src/main/java/com/zy/gateway/core/domain/IDataTransfer.java b/src/main/java/com/zy/common/HslCommunication/Core/Types/IDataTransfer.java
similarity index 91%
rename from src/main/java/com/zy/gateway/core/domain/IDataTransfer.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Types/IDataTransfer.java
index 80e2eaa..956dc6d 100644
--- a/src/main/java/com/zy/gateway/core/domain/IDataTransfer.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Types/IDataTransfer.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.domain;
+package com.zy.common.HslCommunication.Core.Types;
 
 /**
  * 鐢ㄤ簬PLC閫氳鍙奙odbus鑷畾涔夋暟鎹被鍨嬬殑璇诲啓鎿嶄綔
diff --git a/src/main/java/com/zy/gateway/core/domain/OperateResult.java b/src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResult.java
similarity index 91%
rename from src/main/java/com/zy/gateway/core/domain/OperateResult.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResult.java
index 3d247b3..7256bc2 100644
--- a/src/main/java/com/zy/gateway/core/domain/OperateResult.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResult.java
@@ -1,6 +1,6 @@
-package com.zy.gateway.core.domain;
+package com.zy.common.HslCommunication.Core.Types;
 
-import com.zy.gateway.core.StringResources;
+import com.zy.common.HslCommunication.StringResources;
 
 /**
  * 涓�涓粨鏋滄搷浣滅被鐨勫熀绫�
@@ -28,7 +28,7 @@
      * @param err 閿欒鐮�
      * @param msg 閿欒娑堟伅
      */
-    public OperateResult(int err, String msg){
+    public OperateResult(int err,String msg){
         this.ErrorCode = err;
         this.Message = msg;
     }
diff --git a/src/main/java/com/zy/gateway/core/domain/OperateResultExFour.java b/src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResultExFour.java
similarity index 97%
rename from src/main/java/com/zy/gateway/core/domain/OperateResultExFour.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResultExFour.java
index c3f5761..395b26f 100644
--- a/src/main/java/com/zy/gateway/core/domain/OperateResultExFour.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResultExFour.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.domain;
+package com.zy.common.HslCommunication.Core.Types;
 
 /**
  * 甯︿笁涓弬鏁扮殑娉涘瀷绫诲璞�
diff --git a/src/main/java/com/zy/gateway/core/domain/OperateResultExOne.java b/src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResultExOne.java
similarity index 89%
rename from src/main/java/com/zy/gateway/core/domain/OperateResultExOne.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResultExOne.java
index ba374ac..b31ff41 100644
--- a/src/main/java/com/zy/gateway/core/domain/OperateResultExOne.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResultExOne.java
@@ -1,10 +1,12 @@
-package com.zy.gateway.core.domain;
+package com.zy.common.HslCommunication.Core.Types;
+
 
 /**
  * 甯︿竴涓弬鏁扮殑缁撴灉绫诲璞�
  * @param <T>
  */
-public class OperateResultExOne<T> extends  OperateResult {
+public class OperateResultExOne<T> extends  OperateResult
+{
 
     /**
      * 榛樿鐨勬棤鍙傛瀯閫犳柟娉�
@@ -26,7 +28,7 @@
      * @param err 閿欒鐮�
      * @param msg 閿欒娑堟伅
      */
-    public OperateResultExOne(int err, String msg){
+    public OperateResultExOne(int err,String msg){
         super(err,msg);
     }
 
diff --git a/src/main/java/com/zy/gateway/core/domain/OperateResultExThree.java b/src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResultExThree.java
similarity index 97%
rename from src/main/java/com/zy/gateway/core/domain/OperateResultExThree.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResultExThree.java
index 4bc6640..951f9aa 100644
--- a/src/main/java/com/zy/gateway/core/domain/OperateResultExThree.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResultExThree.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.domain;
+package com.zy.common.HslCommunication.Core.Types;
 
 
 /**
diff --git a/src/main/java/com/zy/gateway/core/domain/OperateResultExTwo.java b/src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResultExTwo.java
similarity index 96%
rename from src/main/java/com/zy/gateway/core/domain/OperateResultExTwo.java
rename to src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResultExTwo.java
index 9425077..fe01c66 100644
--- a/src/main/java/com/zy/gateway/core/domain/OperateResultExTwo.java
+++ b/src/main/java/com/zy/common/HslCommunication/Core/Types/OperateResultExTwo.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.domain;
+package com.zy.common.HslCommunication.Core.Types;
 
 /**
  * 甯�2涓弬鏁扮殑缁撴灉绫�
diff --git a/src/main/java/com/zy/common/HslCommunication/Enthernet/ComplexNet/NetComplexClient.java b/src/main/java/com/zy/common/HslCommunication/Enthernet/ComplexNet/NetComplexClient.java
new file mode 100644
index 0000000..db4dfed
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Enthernet/ComplexNet/NetComplexClient.java
@@ -0,0 +1,472 @@
+package com.zy.common.HslCommunication.Enthernet.ComplexNet;
+
+import com.zy.common.HslCommunication.Core.Net.HslProtocol;
+import com.zy.common.HslCommunication.Core.Net.NetHandle;
+import com.zy.common.HslCommunication.Core.Net.NetworkBase.NetworkXBase;
+import com.zy.common.HslCommunication.Core.Net.StateOne.AppSession;
+import com.zy.common.HslCommunication.Core.Types.*;
+import com.zy.common.HslCommunication.Utilities;
+
+import java.net.Socket;
+import java.util.Date;
+
+/**
+ * 涓�涓熀浜庡紓姝ラ珮鎬ц兘鐨勫鎴风缃戠粶绫伙紝鏀寔涓诲姩鎺ユ敹鏈嶅姟鍣ㄧ殑娑堟伅
+ */
+public class NetComplexClient extends NetworkXBase {
+
+
+    /**
+     * 瀹炰緥鍖栦竴涓璞�
+     */
+    public NetComplexClient() {
+        session = new AppSession();
+        ServerTime = new Date();
+
+    }
+
+
+    private AppSession session;                  // 瀹㈡埛绔殑鏍稿績杩炴帴瀵硅薄
+    private int isConnecting = 0;                // 鎸囩ず瀹㈡埛绔槸鍚﹀浜庤繛鎺ユ湇鍔″櫒涓紝0浠h〃鏈繛鎺ワ紝1浠h〃杩炴帴涓�
+    private boolean IsQuie = false;              // 鎸囩ず绯荤粺鏄惁鍑嗗閫�鍑�
+    private Thread thread_heart_check = null;   // 蹇冭烦绾跨▼
+    private String ipAddress = "";               // Ip鍦板潃
+    private int port = 1000;                     // 绔彛鍙�
+    private boolean IsClientStart = false;         // 瀹㈡埛绔槸鍚﹀惎鍔�
+    private int ConnectFailedCount = 0;            // 澶辫触閲嶈繛娆℃暟
+    private String ClientAlias = "";             // 瀹㈡埛绔殑鍒悕
+    private Date ServerTime = new Date();        // 鏈嶅姟鍣ㄧ殑鏃堕棿锛屾殏鏃朵笉鏀寔浣跨敤
+    private int DelayTime = 0;                   // 鑾峰彇寤惰繜鐨勬椂闂�
+
+    /**
+     * 鑾峰彇IP鍦板潃
+     *
+     * @return Ip鍦板潃
+     */
+    public String getIpAddress() {
+        return ipAddress;
+    }
+
+    /**
+     * 璁剧疆Ip鍦板潃
+     *
+     * @param ipAddress Ip鍦板潃
+     */
+    public void setIpAddress(String ipAddress) {
+        this.ipAddress = ipAddress;
+    }
+
+    /**
+     * 鑾峰彇绔彛鍙�
+     *
+     * @return 绔彛鍙�
+     */
+    public int getPort() {
+        return port;
+    }
+
+    /**
+     * 璁剧疆绔彛鍙�
+     *
+     * @param port
+     */
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    /**
+     * 鑾峰彇瀹㈡埛绔槸鍚﹀惎鍔�
+     *
+     * @return boolean鍊�
+     */
+    public boolean getIsClientStart() {
+        return IsClientStart;
+    }
+
+    /**
+     * 璁剧疆瀹㈡埛绔槸鍚﹀惎鍔�
+     *
+     * @param clientStart 瀹㈡埛绔槸鍚﹀惎鍔�
+     */
+    public void setClientStart(boolean clientStart) {
+        IsClientStart = clientStart;
+    }
+
+    /**
+     * 鑾峰彇澶辫触閲嶈繛娆℃暟
+     *
+     * @return
+     */
+    public int getConnectFailedCount() {
+        return ConnectFailedCount;
+    }
+
+    /**
+     * 鑾峰彇瀹㈡埛绔殑鐧诲綍鏍囪瘑鍚�
+     *
+     * @return 瀛楃涓蹭俊鎭�
+     */
+    public String getClientAlias() {
+        return ClientAlias;
+    }
+
+    /**
+     * 璁剧疆瀹㈡埛绔殑鐧诲綍鏍囪瘑鍚�
+     *
+     * @param clientAlias
+     */
+    public void setClientAlias(String clientAlias) {
+        ClientAlias = clientAlias;
+    }
+
+
+    /**
+     * 鑾峰彇鏈嶅姟鍣ㄧ殑鏃堕棿
+     * @return
+     */
+//    public Date getServerTime() {
+//        return ServerTime;
+//    }
+
+    /**
+     * 鑾峰彇淇℃伅寤惰繜鐨勬椂闂�
+     *
+     * @return
+     */
+    public int getDelayTime() {
+        return DelayTime;
+    }
+
+
+    /**
+     * 瀹㈡埛绔惎鍔ㄦ垚鍔熺殑浜嬩欢锛岄噸杩炴垚鍔熶篃灏嗚Е鍙戞浜嬩欢锛屽弬鏁版病鏈夋剰涔�
+     */
+    public ActionOperate LoginSuccess;
+
+    /**
+     * 杩炴帴澶辫触鏃惰Е鍙戠殑浜嬩欢锛屽弬鏁颁负杩炴帴澶辫触鐨勬鏁�
+     */
+    public ActionOperateExOne<Integer> LoginFailed;
+
+    /**
+     * 鏈嶅姟鍣ㄧ殑寮傚父锛屽惎鍔紝绛夌瓑涓�鑸秷鎭骇鐢熺殑鏃跺�欙紝鍑哄彂姝や簨浠�
+     */
+    public ActionOperateExOne<String> MessageAlerts;
+
+    /**
+     * 鍦ㄥ鎴风鏂紑鍚庡苟鍦ㄩ噸杩炴湇鍔″櫒涔嬪墠瑙﹀彂锛岀敤浜庢竻鐞嗙郴缁熻祫婧愶紝鍙傛暟鏃犳剰涔�
+     */
+    public ActionOperate BeforReConnected;
+
+    /**
+     * 褰撴帴鏀跺埌鏂囨湰鏁版嵁鐨勬椂鍊�,瑙﹀彂姝や簨浠�
+     */
+    public ActionOperateExThree<NetComplexClient, NetHandle, String> AcceptString;
+
+    /**
+     * 褰撴帴鏀跺埌瀛楄妭鏁版嵁鐨勬椂鍊�,瑙﹀彂姝や簨浠�
+     */
+    public ActionOperateExThree<NetComplexClient, NetHandle, byte[]> AcceptByte;
+
+
+    /**
+     * 鍏抽棴璇ュ鎴风寮曟搸
+     */
+    public void ClientClose() {
+        IsQuie = true;
+        if (IsClientStart)
+            SendBytes(session, HslProtocol.CommandBytes(HslProtocol.ProtocolClientQuit, 0, Token, null));
+
+        IsClientStart = false;          // 鍏抽棴瀹㈡埛绔�
+        thread_heart_check = null;
+
+        LoginSuccess = null;            // 娓呯┖鎵�鏈夌殑浜嬩欢
+        LoginFailed = null;
+        MessageAlerts = null;
+        AcceptByte = null;
+        AcceptString = null;
+        try {
+            session.getWorkSocket().close();
+        } catch (Exception ex) {
+
+        }
+        if (LogNet != null) LogNet.WriteDebug(toString(), "Client Close.");
+    }
+
+
+    /**
+     * 鍚姩瀹㈡埛绔紩鎿庯紝杩炴帴鏈嶅姟鍣ㄧ郴缁�
+     */
+    public void ClientStart() {
+        // 濡傛灉澶勪簬杩炴帴涓氨閫�鍑�
+        if (isConnecting != 0) return;
+        isConnecting = 1;
+
+        // 鍚姩鍚庡彴绾跨▼杩炴帴
+        new Thread(){
+            @Override
+            public void run() {
+                ThreadLogin();
+            }
+        }.start();
+
+        // 鍚姩蹇冭烦绾跨▼锛屽湪绗竴娆tart鐨勬椂鍊�
+        if (thread_heart_check == null) {
+            thread_heart_check = new Thread(){
+                @Override
+                public void run() {
+                    ThreadHeartCheck();
+                }
+            };
+            thread_heart_check.start();
+        }
+    }
+
+    /**
+     * 杩炴帴鏈嶅姟鍣ㄤ箣鍓嶇殑娑堟伅鎻愮ず锛屽鏋滄槸閲嶈繛鐨勮瘽锛屽氨鎻愮ず10绉掔瓑寰呬俊鎭�
+     */
+    private void AwaitToConnect() {
+        if (ConnectFailedCount == 0) {
+            // English Version : Connecting Server...
+            if (MessageAlerts != null) MessageAlerts.Action("姝e湪杩炴帴鏈嶅姟鍣�...");
+        } else {
+            int count = 10;
+            while (count > 0) {
+                if (IsQuie) return;
+                count--;
+                // English Version : Disconnected, wait [count] second to restart
+                if (MessageAlerts != null) MessageAlerts.Action("杩炴帴鏂紑锛岀瓑寰�" + count + "绉掑悗閲嶆柊杩炴帴");
+                try {
+                    Thread.sleep(1000);
+                } catch (Exception ex) {
+
+                }
+            }
+            if (MessageAlerts != null) MessageAlerts.Action("姝e湪灏濊瘯绗�" + ConnectFailedCount + "娆¤繛鎺ユ湇鍔″櫒...");
+        }
+    }
+
+    private void ConnectFailed() {
+        ConnectFailedCount++;
+        isConnecting = 0;
+        if (LoginFailed != null) LoginFailed.Action(ConnectFailedCount);
+        if (LogNet != null) LogNet.WriteDebug(toString(), "Connected Failed, Times: " + ConnectFailedCount);
+    }
+
+    private OperateResultExOne<Socket> ConnectServer() {
+        OperateResultExOne<Socket> connectResult = CreateSocketAndConnect(ipAddress, port, 10000);
+        if (!connectResult.IsSuccess) {
+            return connectResult;
+        }
+
+        // 杩炴帴鎴愬姛锛屽彂閫佹暟鎹俊鎭�
+        OperateResult sendResult = SendStringAndCheckReceive(connectResult.Content, 2, ClientAlias);
+        if (!sendResult.IsSuccess) {
+            return OperateResultExOne.<Socket>CreateFailedResult(sendResult);
+        }
+
+        if (MessageAlerts != null) MessageAlerts.Action("杩炴帴鏈嶅姟鍣ㄦ垚鍔燂紒");
+        return connectResult;
+    }
+
+    private void LoginSuccessMethod(Socket socket) {
+        ConnectFailedCount = 0;
+        try {
+            session.setIpEndPoint(socket.getInetAddress());
+            session.setLoginAlias(ClientAlias);
+            session.setWorkSocket(socket);
+            session.setHeartTime(new Date());
+            IsClientStart = true;
+            BeginReceiveBackground(session);
+        } catch (Exception ex) {
+            if (LogNet != null) LogNet.WriteException(toString(), ex);
+        }
+    }
+
+
+    private void ThreadLogin() {
+        // 杩炴帴鐨勬秷鎭瓑寰�
+        AwaitToConnect();
+
+        OperateResultExOne<Socket> connectResult = ConnectServer();
+        if (!connectResult.IsSuccess) {
+            ConnectFailed();
+            // 杩炴帴澶辫触锛岄噸鏂拌繛鎺ユ湇鍔″櫒
+            new Thread(){
+                @Override
+                public void run() {
+                    ReconnectServer(null);
+                }
+            }.start();
+            return;
+        }
+
+        // 鐧诲綍鎴愬姛
+        LoginSuccessMethod(connectResult.Content);
+
+        // 鐧诲綍鎴愬姛
+        if (LoginSuccess != null) LoginSuccess.Action();
+        isConnecting = 0;
+        try {
+            Thread.sleep(200);
+        } catch (Exception ex) {
+
+        }
+    }
+
+
+    private void ReconnectServer(Object obj) {
+        // 鏄惁杩炴帴鏈嶅姟鍣ㄤ腑锛屽凡缁忓湪杩炴帴鐨勮瘽锛屽垯涓嶅啀杩炴帴
+        if (isConnecting == 1) return;
+        // 鏄惁閫�鍑轰簡绯荤粺锛岄��鍑哄垯涓嶅啀閲嶈繛
+        if (IsQuie) return;
+        // 瑙﹀彂杩炴帴澶辫触锛岄噸杩炵郴缁熷墠閿欒
+        if (BeforReConnected != null) BeforReConnected.Action();
+        if (session != null) {
+            CloseSocket(session.getWorkSocket());
+        }
+        // 閲嶆柊鍚姩瀹㈡埛绔�
+        ClientStart();
+    }
+
+
+    /**
+     * 閫氫俊鍑洪敊鍚庣殑澶勭悊
+     *
+     * @param receive 閫氫俊鏂规硶
+     */
+    @Override
+    protected void SocketReceiveException(AppSession receive) {
+        if (LogNet != null) LogNet.WriteDebug(toString(), "Socket Excepiton Occured.");
+        // 寮傚父鎺夌嚎
+        ReconnectServer(null);
+
+    }
+
+
+    /**
+     * 鏈嶅姟鍣ㄧ鐢ㄤ簬鏁版嵁鍙戦�佹枃鏈殑鏂规硶
+     *
+     * @param customer 鐢ㄦ埛鑷畾涔夌殑鍛戒护澶�
+     * @param str      鍙戦�佺殑鏂囨湰
+     */
+    public void Send(NetHandle customer, String str) {
+        if (IsClientStart) {
+            SendBytes(session, HslProtocol.CommandBytes(customer.get_CodeValue(), Token, str));
+        }
+    }
+
+
+    /**
+     * 鏈嶅姟鍣ㄧ鐢ㄤ簬鍙戦�佸瓧鑺傜殑鏂规硶
+     *
+     * @param customer 鐢ㄦ埛鑷畾涔夌殑鍛戒护澶�
+     * @param bytes    瀹為檯鍙戦�佺殑鏁版嵁
+     */
+    public void Send(NetHandle customer, byte[] bytes) {
+        if (IsClientStart) {
+            SendBytes(session, HslProtocol.CommandBytes(customer.get_CodeValue(), Token, bytes));
+        }
+    }
+
+    private void SendBytes(AppSession stateone, byte[] content) {
+        super.Send(stateone.getWorkSocket(), content);
+    }
+
+
+    /**
+     * 瀹㈡埛绔殑鏁版嵁澶勭悊涓績
+     *
+     * @param session  杩炴帴鐘舵��
+     * @param protocol 鍗忚澶�
+     * @param customer 鐢ㄦ埛鑷畾涔�
+     * @param content  鏁版嵁鍐呭
+     */
+    @Override
+    protected void DataProcessingCenter(AppSession session, int protocol, int customer, byte[] content) {
+        if (protocol == HslProtocol.ProtocolCheckSecends) {
+            Date dt = new Date(Utilities.getLong(content, 0));
+            ServerTime = new Date(Utilities.getLong(content, 8));
+            DelayTime = (int) (new Date().getTime() - dt.getTime());
+            this.session.setHeartTime(new Date());
+            // MessageAlerts?.Invoke("蹇冭烦鏃堕棿锛�" + DateTime.Now.ToString());
+        } else if (protocol == HslProtocol.ProtocolClientQuit) {
+            // 鐢宠浜嗛��鍑�
+        } else if (protocol == HslProtocol.ProtocolUserBytes) {
+            // 鎺ユ敹鍒板瓧鑺傛暟鎹�
+            if (AcceptByte != null) AcceptByte.Action(this, new NetHandle(customer), content);
+        } else if (protocol == HslProtocol.ProtocolUserString) {
+            // 鎺ユ敹鍒版枃鏈暟鎹�
+            String str = Utilities.byte2String(content);
+            if (AcceptString != null) AcceptString.Action(this, new NetHandle(customer), str);
+        }
+    }
+
+
+    /**
+     * 蹇冭烦绾跨▼鐨勬柟娉�
+     */
+    private void ThreadHeartCheck() {
+        try {
+            Thread.sleep(2000);
+        } catch (Exception ex) {
+
+        }
+        while (true) {
+            try {
+                Thread.sleep(1000);
+            } catch (Exception ex) {
+
+            }
+
+            if (!IsQuie) {
+                byte[] send = new byte[16];
+                byte[] buffer = Utilities.getBytes(new Date().getTime());
+                System.arraycopy(buffer, 0, send, 0, buffer.length);
+
+                try {
+                    SendBytes(session, HslProtocol.CommandBytes(HslProtocol.ProtocolCheckSecends, 0, Token, send));
+                    double timeSpan = (new Date().getTime() - session.getHeartTime().getTime()) / 1000;
+                    if (timeSpan > 1 * 8)//8娆℃病鏈夋敹鍒板け鍘昏仈绯�
+                    {
+                        if (isConnecting == 0) {
+                            if (LogNet != null)
+                                LogNet.WriteDebug(toString(), "Heart Check Failed int " + timeSpan + " Seconds.");
+                            new Thread(){
+                                @Override
+                                public void run() {
+                                    ReconnectServer(null);
+                                }
+                            }.start();
+                        }
+                        if (!IsQuie) {
+                            try {
+                                Thread.sleep(1000);
+                            } catch (Exception ex) {
+
+                            }
+                        }
+                    }
+
+                } catch (Exception ex) {
+                    System.out.println(ex.getStackTrace());
+                }
+            } else {
+                break;
+            }
+        }
+
+
+    }
+
+
+    /**
+     * 杩斿洖瀵硅薄鐨勫瓧绗︿覆琛ㄧず褰㈠紡
+     *
+     * @return 瀛楃涓�
+     */
+    @Override
+    public String toString() {
+        return "NetComplexClient";
+    }
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Enthernet/FileNet/FileBaseInfo.java b/src/main/java/com/zy/common/HslCommunication/Enthernet/FileNet/FileBaseInfo.java
new file mode 100644
index 0000000..e2b49f3
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Enthernet/FileNet/FileBaseInfo.java
@@ -0,0 +1,73 @@
+package com.zy.common.HslCommunication.Enthernet.FileNet;
+
+public class FileBaseInfo {
+
+    /**
+     * 鑾峰彇鏂囦欢鐨勫悕绉�
+     * @return
+     */
+    public String getName() {
+        return Name;
+    }
+
+    /**
+     * 璁剧疆鏂囦欢鐨勫悕绉�
+     * @param name
+     */
+    public void setName(String name) {
+        Name = name;
+    }
+
+    /**
+     * 鑾峰彇鏂囦欢鐨勫ぇ灏�
+     * @return
+     */
+    public long getSize() {
+        return Size;
+    }
+
+    /**
+     * 璁剧疆鏂囦欢鐨勫ぇ灏�
+     * @param size
+     */
+    public void setSize(long size) {
+        Size = size;
+    }
+
+    /**
+     * 鑾峰彇鏂囦欢鐨勬爣璇嗭紝娉ㄩ噴
+     * @return
+     */
+    public String getTag() {
+        return Tag;
+    }
+
+    /**
+     * 璁剧疆鏂囦欢鐨勬爣璇嗭紝娉ㄩ噴
+     * @param tag
+     */
+    public void setTag(String tag) {
+        Tag = tag;
+    }
+
+    /**
+     * 鑾峰彇鏂囦欢鐨勪笂浼犱汉
+     * @return
+     */
+    public String getUpload() {
+        return Upload;
+    }
+
+    /**
+     * 璁剧疆鏂囦欢鐨勪笂浼犱汉
+     * @param upload
+     */
+    public void setUpload(String upload) {
+        Upload = upload;
+    }
+
+    private String Name ;     // 鏂囦欢鍚嶇О
+    private long Size;        // 鏂囦欢澶у皬
+    private String Tag;       // 鏂囦欢鐨勬爣璇嗭紝娉ㄩ噴
+    private String Upload;    // 鏂囦欢涓婁紶浜�
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Enthernet/PushNet/NetPushClient.java b/src/main/java/com/zy/common/HslCommunication/Enthernet/PushNet/NetPushClient.java
new file mode 100644
index 0000000..fbe7b33
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Enthernet/PushNet/NetPushClient.java
@@ -0,0 +1,143 @@
+package com.zy.common.HslCommunication.Enthernet.PushNet;
+
+import com.zy.common.HslCommunication.Core.Net.HslProtocol;
+import com.zy.common.HslCommunication.Core.Net.NetworkBase.NetworkXBase;
+import com.zy.common.HslCommunication.Core.Net.StateOne.AppSession;
+import com.zy.common.HslCommunication.Core.Types.ActionOperateExTwo;
+import com.zy.common.HslCommunication.Core.Types.OperateResult;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExOne;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExTwo;
+import com.zy.common.HslCommunication.Utilities;
+
+import java.net.Socket;
+
+public class NetPushClient extends NetworkXBase
+{
+
+    /**
+     * 瀹炰緥鍖栦竴涓彂甯冭闃呯被鐨勫鎴风锛岄渶瑕佹寚瀹歩p鍦板潃锛岀鍙o紝鍙婅闃呭叧閿瓧
+     * @param ipAddress 鏈嶅姟鍣ㄧ殑IP鍦板潃
+     * @param port 鏈嶅姟鍣ㄧ殑绔彛鍙�
+     * @param key 璁㈤槄鍏抽敭瀛�
+     */
+    public NetPushClient( String ipAddress, int port, String key )
+    {
+        this.ipAddress = ipAddress;
+        this.port = port;
+        keyWord = key;
+
+        if (key == null || key.isEmpty())
+        {
+            throw new RuntimeException( "key 涓嶅厑璁镐负绌�" );
+        }
+    }
+
+
+    @Override
+    protected void DataProcessingCenter(AppSession session, int protocol, int customer, byte[] content ) {
+        if (protocol == HslProtocol.ProtocolUserString) {
+            if (action != null) action.Action(this, Utilities.byte2String(content));
+        }
+    }
+
+
+    @Override
+    protected void SocketReceiveException( AppSession session) {
+        // 鍙戠敓寮傚父鐨勬椂鍊欓渶瑕佽繘琛岄噸鏂拌繛鎺�
+        while (true) {
+            System.out.print("10 绉掗挓鍚庡皾璇曢噸杩炴湇鍔″櫒");
+            try {
+                Thread.sleep(10000);
+            }catch (Exception ex){
+
+            }
+
+            if (CreatePush().IsSuccess) {
+                System.out.print("閲嶈繛鏈嶅姟鍣ㄦ垚鍔�");
+                break;
+            }
+        }
+    }
+
+
+    private OperateResult CreatePush( )
+    {
+        CloseSocket(CoreSocket);
+
+        OperateResultExOne<Socket> connect = CreateSocketAndConnect( ipAddress,port, 5000 );
+        if (!connect.IsSuccess) return connect;
+
+        OperateResult send = SendStringAndCheckReceive( connect.Content, 0, keyWord );
+        if (!send.IsSuccess) return send;
+
+        OperateResultExTwo<Integer, String> receive = ReceiveStringContentFromSocket( connect.Content );
+        if (!receive.IsSuccess) return receive;
+
+        if (receive.Content1 != 0)
+        {
+            OperateResult result = new OperateResult();
+            result.Message = receive.Content2;
+            return result;
+        }
+
+        AppSession appSession = new AppSession( );
+        CoreSocket = connect.Content;
+        appSession.setWorkSocket(connect.Content);
+        BeginReceiveBackground( appSession );
+
+        return OperateResult.CreateSuccessResult( );
+    }
+
+
+
+    /**
+     * 鍒涘缓鏁版嵁鎺ㄩ�佹湇鍔�
+     * @param pushCallBack 瑙﹀彂鏁版嵁鎺ㄩ�佺殑濮旀墭
+     * @return 鏄惁鎴愬姛
+     */
+    public OperateResult CreatePush( ActionOperateExTwo<NetPushClient,String> pushCallBack )
+    {
+        action = pushCallBack;
+        return CreatePush( );
+    }
+
+
+
+    /**
+     * 鍏抽棴娑堟伅鎺ㄩ�佺殑鐣岄潰
+     */
+    public void ClosePush()
+    {
+        action = null;
+        if (CoreSocket != null && CoreSocket.isConnected()){
+            Send(CoreSocket,Utilities.getBytes( 100 ) );
+        }
+        CloseSocket(CoreSocket);
+    }
+
+
+
+    /**
+     * 鏈鎴风鐨勫叧閿瓧
+     * @return
+     */
+    public String getKeyWord(){
+        return keyWord;
+    }
+
+
+    private String ipAddress = "";                                 // IP鍦板潃
+    private int port = 1000;                                       // 绔彛鍙�
+    private String keyWord = "";                                   // 缂撳瓨鐨勮闃呭叧閿瓧
+    private ActionOperateExTwo<NetPushClient,String> action;       // 鏈嶅姟鍣ㄦ帹閫佸悗鐨勫洖璋冩柟娉�
+
+
+    /**
+     * 鑾峰彇鏈璞$殑瀛楃涓茶〃绀哄舰寮�
+     * @return 瀛楃涓�
+     */
+    @Override
+    public String toString() {
+        return "NetPushClient";
+    }
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Enthernet/SimplifyNet/NetSimplifyClient.java b/src/main/java/com/zy/common/HslCommunication/Enthernet/SimplifyNet/NetSimplifyClient.java
new file mode 100644
index 0000000..e40887d
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Enthernet/SimplifyNet/NetSimplifyClient.java
@@ -0,0 +1,130 @@
+package com.zy.common.HslCommunication.Enthernet.SimplifyNet;
+
+import com.zy.common.HslCommunication.Core.IMessage.HslMessage;
+import com.zy.common.HslCommunication.Core.Net.HslProtocol;
+import com.zy.common.HslCommunication.Core.Net.NetHandle;
+import com.zy.common.HslCommunication.Core.Net.NetworkBase.NetworkDoubleBase;
+import com.zy.common.HslCommunication.Core.Transfer.RegularByteTransform;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExOne;
+import com.zy.common.HslCommunication.Utilities;
+
+import java.util.UUID;
+
+
+/**
+ * 鍚屾璁块棶鐨勭綉缁滃鎴风
+ */
+public class NetSimplifyClient extends NetworkDoubleBase<HslMessage,RegularByteTransform>
+{
+
+
+    /**
+     * 瀹炰緥鍖栦竴涓鎴风鐨勫璞★紝鐢ㄤ簬鍜屾湇鍔″櫒閫氫俊
+     * @param ipAddress Ip鍦板潃
+     * @param port 绔彛鍙�
+     */
+    public NetSimplifyClient(String ipAddress, int port)
+    {
+        this.setIpAddress(ipAddress);
+        this.setPort( port);
+    }
+
+    /**
+     * 瀹炰緥鍖栦竴涓鎴风鐨勫璞★紝鐢ㄤ簬鍜屾湇鍔″櫒閫氫俊
+     * @param ipAddress Ip鍦板潃
+     * @param port 绔彛鍙�
+     * @param token 浠ょ墝
+     */
+    public NetSimplifyClient(String ipAddress, int port, UUID token)
+    {
+        this.setIpAddress(ipAddress);
+        this.setPort( port);
+        this.Token = token;
+    }
+
+
+    /**
+     * 瀹炰緥鍖栦竴涓鎴风瀵硅薄锛岄渶瑕佹墜鍔ㄦ寚瀹欼p鍦板潃鍜岀鍙�
+     */
+    public NetSimplifyClient()
+    {
+
+    }
+
+
+    /**
+     * 瀹㈡埛绔悜鏈嶅姟鍣ㄨ繘琛岃姹傦紝璇锋眰瀛楃涓叉暟鎹�
+     * @param customer 鐢ㄦ埛鐨勬寚浠ゅご
+     * @param send 鍙戦�佹暟鎹�
+     * @return 甯︾粨鏋滆鏄庣殑瀵硅薄
+     */
+    public OperateResultExOne<String> ReadFromServer(NetHandle customer, String send) {
+        OperateResultExOne<String> result = new OperateResultExOne<String>();
+        byte[] data = send.isEmpty() ? new byte[0] : Utilities.string2Byte(send);
+        OperateResultExOne<byte[]> temp = ReadFromServerBase(HslProtocol.ProtocolUserString, customer.get_CodeValue(), data);
+        result.IsSuccess = temp.IsSuccess;
+        result.ErrorCode = temp.ErrorCode;
+        result.Message = temp.Message;
+        if (temp.IsSuccess) {
+            result.Content = Utilities.byte2String(temp.Content);
+        }
+        temp = null;
+        return result;
+    }
+
+
+    /**
+     * 瀹㈡埛绔悜鏈嶅姟鍣ㄨ繘琛岃姹傦紝璇锋眰瀛楄妭鏁版嵁
+     * @param customer 鐢ㄦ埛鐨勬寚浠ゅご
+     * @param send 鍙戦�佺殑瀛楄妭鍐呭
+     * @return 甯︾粨鏋滆鏄庣殑瀵硅薄
+     */
+    public OperateResultExOne<byte[]> ReadFromServer(NetHandle customer, byte[] send) {
+        return ReadFromServerBase(HslProtocol.ProtocolUserBytes, customer.get_CodeValue(), send);
+    }
+
+
+    /**
+     * 闇�瑕佸彂閫佺殑搴曞眰鏁版嵁
+     * @param headCode 鏁版嵁鐨勬寚浠ゅご
+     * @param customer 闇�瑕佸彂閫佺殑搴曞眰鏁版嵁
+     * @param send 闇�瑕佸彂閫佺殑搴曞眰鏁版嵁
+     * @return 甯︾粨鏋滆鏄庣殑瀵硅薄
+     */
+    private OperateResultExOne<byte[]> ReadFromServerBase(int headCode, int customer, byte[] send) {
+        OperateResultExOne<byte[]> read = ReadFromCoreServer(HslProtocol.CommandBytes(headCode, customer, Token, send));
+        if (!read.IsSuccess) {
+            return read;
+        }
+
+        if(read.Content.length < HslProtocol.HeadByteLength){
+            read.IsSuccess = false;
+            read.Message = "length is not correct :" +read.Content.length;
+            return read;
+        }
+
+        byte[] headBytes = new byte[HslProtocol.HeadByteLength];
+        byte[] contentBytes = new byte[read.Content.length - HslProtocol.HeadByteLength];
+
+        System.arraycopy(read.Content,0,headBytes,0,HslProtocol.HeadByteLength);
+        if (contentBytes.length > 0) {
+            System.arraycopy(read.Content, HslProtocol.HeadByteLength, contentBytes, 0, read.Content.length - HslProtocol.HeadByteLength);
+        }
+
+        contentBytes = HslProtocol.CommandAnalysis(headBytes, contentBytes);
+        return OperateResultExOne.CreateSuccessResult(contentBytes);
+    }
+
+
+
+    /**
+     * 鑾峰彇鏈璞$殑瀛楃涓茶〃绀哄舰寮�
+     * @return 瀛楃涓蹭俊鎭�
+     */
+    @Override
+    public String toString() {
+        return "NetSimplifyClient";
+    }
+
+
+}
diff --git a/src/main/java/com/zy/gateway/core/language/DefaultLanguage.java b/src/main/java/com/zy/common/HslCommunication/Language/DefaultLanguage.java
similarity index 99%
rename from src/main/java/com/zy/gateway/core/language/DefaultLanguage.java
rename to src/main/java/com/zy/common/HslCommunication/Language/DefaultLanguage.java
index 4f9a410..7e61b52 100644
--- a/src/main/java/com/zy/gateway/core/language/DefaultLanguage.java
+++ b/src/main/java/com/zy/common/HslCommunication/Language/DefaultLanguage.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.language;
+package com.zy.common.HslCommunication.Language;
 
 /**
  * 绯荤粺鐨勮瑷�鍩虹被锛岄粯璁や篃鍗虫槸涓枃鐗堟湰
diff --git a/src/main/java/com/zy/gateway/core/language/English.java b/src/main/java/com/zy/common/HslCommunication/Language/English.java
similarity index 99%
rename from src/main/java/com/zy/gateway/core/language/English.java
rename to src/main/java/com/zy/common/HslCommunication/Language/English.java
index 5ab15a7..4f40d6a 100644
--- a/src/main/java/com/zy/gateway/core/language/English.java
+++ b/src/main/java/com/zy/common/HslCommunication/Language/English.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.language;
+package com.zy.common.HslCommunication.Language;
 
 /**
  * English Version Text
diff --git a/src/main/java/com/zy/common/HslCommunication/LogNet/Core/GenerateMode.java b/src/main/java/com/zy/common/HslCommunication/LogNet/Core/GenerateMode.java
new file mode 100644
index 0000000..bc1a50d
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/LogNet/Core/GenerateMode.java
@@ -0,0 +1,32 @@
+package com.zy.common.HslCommunication.LogNet.Core;
+
+/**
+ * 鏃ュ織鏂囦欢杈撳嚭妯″紡
+ */
+public enum GenerateMode {
+
+    /**
+     * 鎸夋瘡涓皬鏃剁敓鎴愭棩蹇楁枃浠�
+     */
+    ByEveryHour,
+    /**
+     * 鎸夋瘡澶╃敓鎴愭棩蹇楁枃浠�
+     */
+    ByEveryDay,
+    /**
+     * 鎸夋瘡涓懆鐢熸垚鏃ュ織鏂囦欢
+     */
+    ByEveryWeek,
+    /**
+     * 鎸夋瘡涓湀鐢熸垚鏃ュ織鏂囦欢
+     */
+    ByEveryMonth,
+    /**
+     * 鎸夋瘡瀛e害鐢熸垚鏃ュ織鏂囦欢
+     */
+    ByEverySeason ,
+    /**
+     * 鎸夋瘡骞寸敓鎴愭棩蹇楁枃浠�
+     */
+    ByEveryYear,
+}
diff --git a/src/main/java/com/zy/gateway/core/log/HslMessageDegree.java b/src/main/java/com/zy/common/HslCommunication/LogNet/Core/HslMessageDegree.java
similarity index 90%
rename from src/main/java/com/zy/gateway/core/log/HslMessageDegree.java
rename to src/main/java/com/zy/common/HslCommunication/LogNet/Core/HslMessageDegree.java
index 37913a3..bf8a228 100644
--- a/src/main/java/com/zy/gateway/core/log/HslMessageDegree.java
+++ b/src/main/java/com/zy/common/HslCommunication/LogNet/Core/HslMessageDegree.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.log;
+package com.zy.common.HslCommunication.LogNet.Core;
 
 /**
  * 鏃ュ織鐨勫瓨鍌ㄧ瓑绾�
diff --git a/src/main/java/com/zy/common/HslCommunication/LogNet/Core/HslMessageItem.java b/src/main/java/com/zy/common/HslCommunication/LogNet/Core/HslMessageItem.java
new file mode 100644
index 0000000..a20c6b7
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/LogNet/Core/HslMessageItem.java
@@ -0,0 +1,147 @@
+package com.zy.common.HslCommunication.LogNet.Core;
+
+import com.zy.common.HslCommunication.Utilities;
+
+import java.util.Date;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * 鍗曚釜鏃ュ織鐨勮褰曚俊鎭�
+ */
+public class HslMessageItem {
+
+    private AtomicInteger IdNumber = new AtomicInteger();
+    private long id =0;
+    private HslMessageDegree degree = HslMessageDegree.DEBUG;
+    private int threadId = 0;
+    private String text = "";
+    private Date time = new Date();
+    private String keyWord = "";
+
+    /**
+     * 榛樿鐨勬棤鍙傛瀯閫犲櫒
+     */
+    public HslMessageItem()
+    {
+        id = IdNumber.getAndIncrement();
+    }
+
+
+    /**
+     * 鍗曚釜璁板綍淇℃伅鐨勬爣璇咺D锛岀▼搴忛噸鏂拌繍琛屾椂娓呯┖
+     * @return long鏁版嵁绫诲瀷
+     */
+    public long getId() {
+        return id;
+    }
+
+
+    /**
+     * 鑾峰彇娑堟伅鐨勭瓑绾�
+     * @return 娑堟伅绛夌骇
+     */
+    public HslMessageDegree getDegree() {
+        return degree;
+    }
+
+    /**
+     * 璁剧疆娑堟伅鐨勭瓑绾�
+     * @param degree 娑堟伅绛夌骇
+     */
+    public void setDegree(HslMessageDegree degree) {
+        this.degree = degree;
+    }
+
+
+    /**
+     * 鑾峰彇绾跨▼鐨勬爣璇�
+     * @return 绾跨▼id
+     */
+    public int getThreadId() {
+        return threadId;
+    }
+
+    /**
+     * 璁剧疆绾跨▼鐨勬爣璇�
+     * @param threadId 绾跨▼id
+     */
+    public void setThreadId(int threadId) {
+        this.threadId = threadId;
+    }
+
+    /**
+     * 鑾峰彇娑堟伅鏂囨湰
+     * @return string绫诲瀷鏁版嵁
+     */
+    public String getText() {
+        return text;
+    }
+
+    /**
+     * 璁剧疆娑堟伅鏂囨湰
+     * @param text 娑堟伅鏂囨湰
+     */
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    /**
+     * 鑾峰彇褰撳墠鐨勬椂闂翠俊鎭�
+     * @return 鏃堕棿绫诲瀷
+     */
+    public Date getTime() {
+        return time;
+    }
+
+    /**
+     * 璁剧疆褰撳墠鐨勬椂闂�
+     * @param time 鏃堕棿
+     */
+    public void setTime(Date time) {
+        this.time = time;
+    }
+
+    /**
+     * 鑾峰彇褰撳墠鐨勫叧閿瓧
+     * @return string绫诲瀷鐨勫叧閿瓧
+     */
+    public String getKeyWord() {
+        return keyWord;
+    }
+
+    /**
+     * 璁剧疆褰撳墠鐨勫叧閿瓧
+     * @param keyWord 鍏抽敭瀛�
+     */
+    public void setKeyWord(String keyWord) {
+        this.keyWord = keyWord;
+    }
+
+
+    /**
+     * 杩斿洖琛ㄧず褰撳墠瀵硅薄鐨勫瓧绗︿覆
+     * @return 瀛楃涓蹭俊鎭�
+     */
+    @Override
+    public String toString( )
+    {
+        if (keyWord == null || keyWord.length() == 0)
+        {
+            return "["+degree.toString()+"] "+ Utilities.getStringDateShort(time,"yyyy-MM-dd HH:mm:ss.fff") + " Thread["+String.format("D2",threadId)+"] "+text;
+        }
+        else
+        {
+            return "["+degree.toString()+"] "+ Utilities.getStringDateShort(time,"yyyy-MM-dd HH:mm:ss.fff") + " Thread["+String.format("D2",threadId)+"] " + keyWord +" : "+text;
+        }
+    }
+
+
+    /**
+     * 杩斿洖琛ㄧず褰撳墠瀵硅薄鐨勫瓧绗︿覆锛屽墧闄や簡鍏抽敭瀛�
+     * @return 瀛楃涓叉暟鎹�
+     */
+    public String ToStringWithoutKeyword()
+    {
+        return "["+degree.toString()+"] "+ Utilities.getStringDateShort(time,"yyyy-MM-dd HH:mm:ss.fff") + " Thread["+String.format("D2",threadId)+"] "+text;
+    }
+}
diff --git a/src/main/java/com/zy/gateway/core/log/ILogNet.java b/src/main/java/com/zy/common/HslCommunication/LogNet/Core/ILogNet.java
similarity index 96%
rename from src/main/java/com/zy/gateway/core/log/ILogNet.java
rename to src/main/java/com/zy/common/HslCommunication/LogNet/Core/ILogNet.java
index f47f575..a262f43 100644
--- a/src/main/java/com/zy/gateway/core/log/ILogNet.java
+++ b/src/main/java/com/zy/common/HslCommunication/LogNet/Core/ILogNet.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.log;
+package com.zy.common.HslCommunication.LogNet.Core;
 
 /**
  * 鏃ュ織鐨勫瓨鍌ㄥ璞�
@@ -135,7 +135,7 @@
      * 杩囨护鎺夋寚瀹氱殑鍏抽敭瀛楃殑鏃ュ織锛岃淇℃伅涓嶅瓨鍌紝浣嗕粛鐒惰Е鍙態eforeSaveToFile浜嬩欢
      * @param keyword
      */
-    void FiltrateKeyword(String keyword);
+    void FiltrateKeyword( String keyword );
 
 
     /**
diff --git a/src/main/java/com/zy/common/HslCommunication/ModBus/ModbusAddress.java b/src/main/java/com/zy/common/HslCommunication/ModBus/ModbusAddress.java
new file mode 100644
index 0000000..22e9862
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/ModBus/ModbusAddress.java
@@ -0,0 +1,277 @@
+package com.zy.common.HslCommunication.ModBus;
+
+import com.zy.common.HslCommunication.BasicFramework.SoftBasic;
+import com.zy.common.HslCommunication.Core.Address.DeviceAddressBase;
+import com.zy.common.HslCommunication.Utilities;
+
+
+/**
+ * Modbus鍗忚鍦板潃鏍煎紡锛屽彲浠ユ惡甯︾珯鍙凤紝鍔熻兘鐮侊紝鍦板潃淇℃伅
+ */
+public class ModbusAddress extends DeviceAddressBase {
+
+
+
+    /**
+     * 瀹炰緥鍖栦竴涓粯璁ょ殑瀵硅薄
+     */
+    public ModbusAddress() {
+        Station = -1;
+        Function = ModbusInfo.ReadRegister;
+        setAddress(0);
+    }
+
+
+    /**
+     * 瀹炰緥鍖栦竴涓粯璁ょ殑瀵硅薄锛屼娇鐢ㄩ粯璁ょ殑鍦板潃鍒濆鍖�
+     * @param address
+     */
+    public ModbusAddress(String address) {
+        Station = -1;
+        Function = ModbusInfo.ReadRegister;
+        setAddress(0);
+        AnalysisAddress(address);
+    }
+
+
+    /**
+     * 鑾峰彇绔欏彿
+     * @return
+     */
+    public int getStation() {
+        return Station;
+    }
+
+    /**
+     * 璁剧疆绔欏彿
+     * @param station
+     */
+    public void setStation(int station) {
+        Station = station;
+    }
+
+
+    /**
+     * 鑾峰彇鍔熻兘鐮�
+     * @return
+     */
+    public byte getFunction() {
+        return Function;
+    }
+
+    /**
+     * 璁剧疆鍔熻兘鐮�
+     * @param function
+     */
+    public void setFunction(byte function) {
+        Function = function;
+    }
+
+    private int Station = -1;
+
+    private byte Function = -1;
+
+
+
+    /**
+     * 瑙f瀽Modbus鐨勫湴鍧�鐮�
+     * @param address 鍦板潃
+     */
+    @Override
+    public void AnalysisAddress(String address) {
+        if (address.indexOf(';') < 0) {
+            // 姝e父鍦板潃锛屽姛鑳界爜03
+            setAddress(Integer.parseInt(address));
+        } else {
+            // 甯﹀姛鑳界爜鐨勫湴鍧�
+            String[] list = address.split(";");
+            for (int i = 0; i < list.length; i++) {
+                if (list[i].charAt(0) == 's' || list[i].charAt(0) == 'S') {
+                    // 绔欏彿淇℃伅
+                    this.Station = Integer.parseInt(list[i].substring(2));
+                } else if (list[i].charAt(0) == 'x' || list[i].charAt(0) == 'X') {
+                    this.Function = (byte) Integer.parseInt(list[i].substring(2));
+                } else {
+                    setAddress(Integer.parseInt(list[i]));
+                }
+            }
+        }
+    }
+
+
+
+    /**
+     * 鍒涘缓涓�涓鍙栫嚎鍦堢殑瀛楄妭瀵硅薄
+     * @param station 璇诲彇鐨勭珯鍙�
+     * @param length 璇诲彇鏁版嵁鐨勯暱搴�
+     * @return 鍘熷鐨刴odbus鎸囦护
+     */
+    public byte[] CreateReadCoils(byte station, int length) {
+        byte[] buffer = new byte[6];
+        buffer[0] = this.Station < 0 ? station : (byte) this.Station;
+        buffer[1] = ModbusInfo.ReadCoil;
+        buffer[2] = Utilities.getBytes(this.getAddress())[1];
+        buffer[3] = Utilities.getBytes(this.getAddress())[0];
+        buffer[4] = Utilities.getBytes(length)[1];
+        buffer[5] = Utilities.getBytes(length)[0];
+        return buffer;
+    }
+
+    /**
+     * 鍒涘缓涓�涓鍙栫鏁h緭鍏ョ殑瀛楄妭瀵硅薄
+     * @param station 璇诲彇鐨勭珯鍙�
+     * @param length 璇诲彇鏁版嵁鐨勯暱搴�
+     * @return 鍘熷鐨刴odbus鎸囦护
+     */
+    public byte[] CreateReadDiscrete(byte station, int length) {
+        byte[] buffer = new byte[6];
+        buffer[0] = this.Station < 0 ? station : (byte) this.Station;
+        buffer[1] = ModbusInfo.ReadDiscrete;
+        buffer[2] = Utilities.getBytes(this.getAddress())[1];
+        buffer[3] = Utilities.getBytes(this.getAddress())[0];
+        buffer[4] = Utilities.getBytes(length)[1];
+        buffer[5] = Utilities.getBytes(length)[0];
+        return buffer;
+    }
+
+
+
+    /**
+     * 鍒涘缓涓�涓鍙栧瘎瀛樺櫒鐨勫瓧鑺傚璞�
+     * @param station 璇诲彇鐨勭珯鍙�
+     * @param length 璇诲彇鏁版嵁鐨勯暱搴�
+     * @return 鍘熷鐨刴odbus鎸囦护
+     */
+    public byte[] CreateReadRegister(byte station, int length) {
+        byte[] buffer = new byte[6];
+        buffer[0] = this.Station < 0 ? station : (byte) this.Station;
+        buffer[1] = Function;
+        buffer[2] = Utilities.getBytes(this.getAddress())[1];
+        buffer[3] = Utilities.getBytes(this.getAddress())[0];
+        buffer[4] = Utilities.getBytes(length)[1];
+        buffer[5] = Utilities.getBytes(length)[0];
+        return buffer;
+    }
+
+
+    /**
+     * 鍒涘缓涓�涓啓鍏ュ崟涓嚎鍦堢殑鎸囦护
+     * @param station 绔欏彿
+     * @param value 鍊�
+     * @return 鍘熷鐨刴odbus鎸囦护
+     */
+    public byte[] CreateWriteOneCoil(byte station, boolean value) {
+        byte[] buffer = new byte[6];
+        buffer[0] = this.Station < 0 ? station : (byte) this.Station;
+        buffer[1] = ModbusInfo.WriteOneCoil;
+        buffer[2] = Utilities.getBytes(this.getAddress())[1];
+        buffer[3] = Utilities.getBytes(this.getAddress())[0];
+        buffer[4] = (byte) (value ? 0xFF : 0x00);
+        buffer[5] = 0x00;
+        return buffer;
+    }
+
+
+
+    /**
+     * 鍒涘缓涓�涓啓鍏ュ崟涓瘎瀛樺櫒鐨勬寚浠�
+     * @param station 绔欏彿
+     * @param data 鍊�
+     * @return 鍘熷鐨刴odbus鎸囦护
+     */
+    public byte[] CreateWriteOneRegister(byte station, byte[] data) {
+        byte[] buffer = new byte[6];
+        buffer[0] = this.Station < 0 ? station : (byte) this.Station;
+        buffer[1] = ModbusInfo.WriteOneRegister;
+        buffer[2] = Utilities.getBytes(this.getAddress())[1];
+        buffer[3] = Utilities.getBytes(this.getAddress())[0];
+        buffer[4] = data[1];
+        buffer[5] = data[0];
+        return buffer;
+    }
+
+
+
+    /**
+     * 鍒涘缓涓�涓啓鍏ユ壒閲忕嚎鍦堢殑鎸囦护
+     * @param station 绔欏彿
+     * @param values 鍊�
+     * @return 鍘熷鐨刴odbus鎸囦护
+     */
+    public byte[] CreateWriteCoil(byte station, boolean[] values) {
+        byte[] data = SoftBasic.BoolArrayToByte(values);
+        byte[] buffer = new byte[7 + data.length];
+        buffer[0] = this.Station < 0 ? station : (byte) this.Station;
+        buffer[1] = ModbusInfo.WriteCoil;
+        buffer[2] = Utilities.getBytes(this.getAddress())[1];
+        buffer[3] = Utilities.getBytes(this.getAddress())[0];
+        buffer[4] = (byte) (values.length / 256);
+        buffer[5] = (byte) (values.length % 256);
+        buffer[6] = (byte) (data.length);
+        System.arraycopy(data, 0, buffer, 7, data.length);
+        return buffer;
+    }
+
+
+
+    /**
+     * 鍒涘缓涓�涓啓鍏ユ壒閲忓瘎瀛樺櫒鐨勬寚浠�
+     * @param station 绔欏彿
+     * @param values 鍊�
+     * @return 鍘熷鐨刴odbus鎸囦护
+     */
+    public byte[] CreateWriteRegister(byte station, byte[] values) {
+        byte[] buffer = new byte[7 + values.length];
+        buffer[0] = this.Station < 0 ? station : (byte) this.Station;
+        buffer[1] = ModbusInfo.WriteRegister;
+        buffer[2] = Utilities.getBytes(this.getAddress())[1];
+        buffer[3] = Utilities.getBytes(this.getAddress())[0];
+        buffer[4] = (byte) (values.length / 2 / 256);
+        buffer[5] = (byte) (values.length / 2 % 256);
+        buffer[6] = (byte) (values.length);
+        System.arraycopy(values, 0, buffer, 7, values.length);
+        return buffer;
+    }
+
+
+
+    /**
+     * 鍦板潃鏂板鎸囧畾鐨勬暟
+     * @param value 鍦板潃鍊�
+     * @return 鏂板鍚庣殑鍦板潃淇℃伅
+     */
+    public ModbusAddress AddressAdd(int value) {
+        ModbusAddress address = new ModbusAddress();
+        address.setAddress(getAddress() + value);
+        address.setFunction(getFunction());
+        address.setStation(getStation());
+        return address;
+    }
+
+
+
+    /**
+     * 鍦板潃鏂板1
+     * @return 鏂板鍚庣殑鍦板潃淇℃伅
+     */
+    public ModbusAddress AddressAdd() {
+        return AddressAdd(1);
+    }
+
+
+
+    /**
+     * 鑾峰彇鏈璞$殑瀛楃涓茶〃绀哄舰寮�
+     * @return 瀛楃涓叉暟鎹�
+     */
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        if (Station >= 0) sb.append("s=" + Station + ";");
+        if (Function >= 1) sb.append("x=" + Function + ";");
+        sb.append(String.valueOf(getAddress()));
+
+        return sb.toString();
+    }
+
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/ModBus/ModbusInfo.java b/src/main/java/com/zy/common/HslCommunication/ModBus/ModbusInfo.java
new file mode 100644
index 0000000..fdfa3d2
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/ModBus/ModbusInfo.java
@@ -0,0 +1,150 @@
+package com.zy.common.HslCommunication.ModBus;
+
+import com.zy.common.HslCommunication.Core.Types.OperateResultExOne;
+import com.zy.common.HslCommunication.StringResources;
+import com.zy.common.HslCommunication.Utilities;
+
+/**
+ * Modbus鍗忚鐩稿叧鐨勪竴浜涗俊鎭�
+ */
+public class ModbusInfo {
+
+
+    /**
+     * 璇诲彇绾垮湀
+     */
+    public static final byte ReadCoil = 0x01;
+
+    /**
+     * 璇诲彇绂绘暎閲�
+     */
+    public static final byte ReadDiscrete = 0x02;
+
+
+    /**
+     * 璇诲彇瀵勫瓨鍣�
+     */
+    public static final byte ReadRegister = 0x03;
+
+    /**
+     * 璇诲彇杈撳叆瀵勫瓨鍣�
+     */
+    public static final byte ReadInputRegister = 0x04;
+
+
+    /**
+     * 鍐欏崟涓嚎鍦�
+     */
+    public static final byte WriteOneCoil = 0x05;
+
+    /**
+     * 鍐欏崟涓瘎瀛樺櫒
+     */
+    public static final byte WriteOneRegister = 0x06;
+
+
+    /**
+     * 鍐欏涓嚎鍦�
+     */
+    public static final byte WriteCoil = 0x0F;
+
+    /**
+     * 鍐欏涓瘎瀛樺櫒
+     */
+    public static final byte WriteRegister = 0x10;
+
+
+    /*****************************************************************************************
+     *
+     *    鏈湇鍔″櫒鍜屽鎴风鏀寔鐨勫紓甯歌繑鍥�
+     *
+     *******************************************************************************************/
+
+
+    /**
+     * 涓嶆敮鎸佽鍔熻兘鐮�
+     */
+    public static final byte FunctionCodeNotSupport = 0x01;
+
+    /**
+     * 璇ュ湴鍧�瓒婄晫
+     */
+    public static final byte FunctionCodeOverBound = 0x02;
+
+    /**
+     * 璇诲彇闀垮害瓒呰繃鏈�澶у��
+     */
+    public static final byte FunctionCodeQuantityOver = 0x03;
+
+    /**
+     * 璇诲啓寮傚父
+     */
+    public static final byte FunctionCodeReadWriteException = 0x04;
+
+
+    /**
+     * 灏唌odbus鎸囦护鎵撳寘鎴怣odbus-Tcp鎸囦护
+     *
+     * @param value Modbus鎸囦护
+     * @param id    娑堟伅鐨勫簭鍙�
+     * @return Modbus-Tcp鎸囦护
+     */
+    public static byte[] PackCommandToTcp(byte[] value, int id) {
+        byte[] buffer = new byte[value.length + 6];
+        buffer[0] = Utilities.getBytes(id)[1];
+        buffer[1] = Utilities.getBytes(id)[0];
+
+        buffer[4] = Utilities.getBytes(value.length)[1];
+        buffer[5] = Utilities.getBytes(value.length)[0];
+
+        System.arraycopy(value, 0, buffer, 6, value.length);
+        return buffer;
+    }
+
+
+    /**
+     * 鍒嗘瀽Modbus鍗忚鐨勫湴鍧�淇℃伅锛岃鍦板潃閫傚簲浜巘cp鍙妑tu妯″紡
+     *
+     * @param address         甯︽牸寮忕殑鍦板潃锛屾瘮濡�"100"锛�"x=4;100"锛�"s=1;100","s=1;x=4;100"
+     * @param isStartWithZero 璧峰鍦板潃鏄惁浠�0寮�濮�
+     * @return 杞崲鍚庣殑鍦板潃淇℃伅
+     */
+    public static OperateResultExOne<ModbusAddress> AnalysisReadAddress(String address, boolean isStartWithZero) {
+        try {
+            ModbusAddress mAddress = new ModbusAddress(address);
+            if (!isStartWithZero) {
+                if (mAddress.getAddress() < 1) throw new Exception("鍦板潃鍊煎湪璧峰鍦板潃涓�1鐨勬儏鍐典笅锛屽繀椤诲ぇ浜�1");
+                mAddress.setAddress(mAddress.getAddress() - 1);
+            }
+            return OperateResultExOne.CreateSuccessResult(mAddress);
+        } catch (Exception ex) {
+            OperateResultExOne<ModbusAddress> resultExOne = new OperateResultExOne<>();
+            resultExOne.Message = ex.getMessage();
+            return resultExOne;
+        }
+    }
+
+
+    /**
+     * 閫氳繃閿欒鐮佹潵鑾峰彇鍒板搴旂殑鏂囨湰娑堟伅
+     *
+     * @param code 閿欒鐮�
+     * @return 閿欒鐨勬枃鏈弿杩�
+     */
+    public static String GetDescriptionByErrorCode(byte code) {
+        switch (code) {
+            case ModbusInfo.FunctionCodeNotSupport:
+                return StringResources.Language.ModbusTcpFunctionCodeNotSupport();
+            case ModbusInfo.FunctionCodeOverBound:
+                return StringResources.Language.ModbusTcpFunctionCodeOverBound();
+            case ModbusInfo.FunctionCodeQuantityOver:
+                return StringResources.Language.ModbusTcpFunctionCodeQuantityOver();
+            case ModbusInfo.FunctionCodeReadWriteException:
+                return StringResources.Language.ModbusTcpFunctionCodeReadWriteException();
+            default:
+                return StringResources.Language.UnknownError();
+        }
+    }
+
+
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/ModBus/ModbusTcpNet.java b/src/main/java/com/zy/common/HslCommunication/ModBus/ModbusTcpNet.java
new file mode 100644
index 0000000..aad93b6
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/ModBus/ModbusTcpNet.java
@@ -0,0 +1,494 @@
+package com.zy.common.HslCommunication.ModBus;
+
+import com.zy.common.HslCommunication.BasicFramework.SoftBasic;
+import com.zy.common.HslCommunication.BasicFramework.SoftIncrementCount;
+import com.zy.common.HslCommunication.Core.IMessage.ModbusTcpMessage;
+import com.zy.common.HslCommunication.Core.Net.NetworkBase.NetworkDeviceBase;
+import com.zy.common.HslCommunication.Core.Transfer.DataFormat;
+import com.zy.common.HslCommunication.Core.Transfer.ReverseWordTransform;
+import com.zy.common.HslCommunication.Core.Types.OperateResult;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExOne;
+import com.zy.common.HslCommunication.StringResources;
+import com.zy.common.HslCommunication.Utilities;
+
+import java.io.ByteArrayOutputStream;
+
+
+/**
+ * Modbus-Tcp鍗忚鐨勫鎴风閫氳绫伙紝鏂逛究鐨勫拰鏈嶅姟鍣ㄨ繘琛屾暟鎹氦浜�
+ */
+public class ModbusTcpNet extends NetworkDeviceBase<ModbusTcpMessage, ReverseWordTransform> {
+
+
+    /**
+     * 瀹炰緥鍖栦竴涓狹Odbus-Tcp鍗忚鐨勫鎴风瀵硅薄
+     */
+    public ModbusTcpNet() {
+        this.softIncrementCount = new SoftIncrementCount(65535, 0);
+        this.WordLength = 1;
+        this.station = 1;
+    }
+
+
+    /**
+     * 鎸囧畾鏈嶅姟鍣ㄥ湴鍧�锛岀鍙e彿锛屽鎴风鑷繁鐨勭珯鍙锋潵鍒濆鍖�
+     *
+     * @param ipAddress 鏈嶅姟鍣ㄧ殑Ip鍦板潃
+     * @param port      鏈嶅姟鍣ㄧ殑绔彛鍙�
+     * @param station   瀹㈡埛绔嚜韬殑绔欏彿锛屽彲浠ュ湪璇诲彇鐨勬椂鍊欏姩鎬侀厤缃�
+     */
+    public ModbusTcpNet(String ipAddress, int port, byte station) {
+        this.softIncrementCount = new SoftIncrementCount(65535, 0);
+        setIpAddress(ipAddress);
+        setPort(port);
+        this.WordLength = 1;
+        this.station = station;
+    }
+
+
+    private byte station = 0x01;                                // 鏈鎴风鐨勭珯鍙�
+    private SoftIncrementCount softIncrementCount;              // 鑷娑堟伅鐨勫璞�
+    private boolean isAddressStartWithZero = true;                 // 绾垮湀鍊肩殑鍦板潃鍊兼槸鍚︿粠闆跺紑濮�
+
+
+    /**
+     * 鑾峰彇璧峰鍦板潃鏄惁浠�0寮�濮�
+     *
+     * @return bool鍊�
+     */
+    public boolean getAddressStartWithZero() {
+        return isAddressStartWithZero;
+    }
+
+    /**
+     * 璁剧疆璧峰鍦板潃鏄惁浠�0寮�濮�
+     *
+     * @param addressStartWithZero true浠h〃浠�0寮�濮嬶紝false浠h〃浠�1寮�濮�
+     */
+    public void setAddressStartWithZero(boolean addressStartWithZero) {
+        this.isAddressStartWithZero = addressStartWithZero;
+    }
+
+    /**
+     * 鑾峰彇绔欏彿
+     *
+     * @return 绔欏彿
+     */
+    public byte getStation() {
+        return station;
+    }
+
+    /**
+     * 璁剧疆绔欏彿
+     *
+     * @param station 绔欏彿
+     */
+    public void setStation(byte station) {
+        this.station = station;
+    }
+
+    /**
+     * 璁剧疆澶氬瓧鑺傛暟鎹殑鍙嶈浆绫诲瀷锛岄�傜敤浜巌nt,float,double,long绫诲瀷鐨勬暟鎹�
+     *
+     * @param dataFormat 鏁版嵁绫诲瀷
+     */
+    public void setDataFormat(DataFormat dataFormat) {
+        getByteTransform().setDataFormat(dataFormat);
+    }
+
+    /**
+     * 鑾峰彇澶氬瓧鑺傛暟鎹殑鍙嶈浆绫诲瀷锛岄�傜敤浜巌nt,float,double,long绫诲瀷鐨勬暟鎹�
+     *
+     * @return
+     */
+    public DataFormat getDataFormat() {
+        return getByteTransform().getDataFormat();
+    }
+
+
+    /**
+     * 瀛楃涓叉暟鎹槸鍚﹀彂鐢熷弽杞�
+     *
+     * @return bool鍊�
+     */
+    public boolean isStringReverse() {
+        return getByteTransform().IsStringReverse;
+    }
+
+    /**
+     * 璁剧疆瀛楃涓叉暟鎹槸鍚﹀弽杞�
+     *
+     * @param stringReverse bool鍊�
+     */
+    public void setStringReverse(boolean stringReverse) {
+        getByteTransform().IsStringReverse = stringReverse;
+    }
+
+
+    private OperateResultExOne<byte[]> BuildReadCoilCommand(String address, short count) {
+        OperateResultExOne<ModbusAddress> analysis = ModbusInfo.AnalysisReadAddress(address, isAddressStartWithZero);
+        if (!analysis.IsSuccess) return OperateResultExOne.<byte[]>CreateFailedResult(analysis);
+
+        short messageId = (short) softIncrementCount.GetCurrentValue();
+        // 鐢熸垚鏈�缁坱cp鎸囦护
+        byte[] buffer = ModbusInfo.PackCommandToTcp(analysis.Content.CreateReadCoils(station, count), messageId);
+        return OperateResultExOne.CreateSuccessResult(buffer);
+    }
+
+    private OperateResultExOne<byte[]> BuildReadDiscreteCommand(String address, short length) {
+        OperateResultExOne<ModbusAddress> analysis = ModbusInfo.AnalysisReadAddress(address, isAddressStartWithZero);
+        if (!analysis.IsSuccess) return OperateResultExOne.<byte[]>CreateFailedResult(analysis);
+
+        short messageId = (short) softIncrementCount.GetCurrentValue();
+        // 鐢熸垚鏈�缁坱cp鎸囦护
+        byte[] buffer = ModbusInfo.PackCommandToTcp(analysis.Content.CreateReadDiscrete(station, length), messageId);
+        return OperateResultExOne.CreateSuccessResult(buffer);
+    }
+
+
+    private OperateResultExOne<byte[]> BuildReadRegisterCommand(String address, short length) {
+        OperateResultExOne<ModbusAddress> analysis = ModbusInfo.AnalysisReadAddress(address, isAddressStartWithZero);
+        if (!analysis.IsSuccess) return OperateResultExOne.<byte[]>CreateFailedResult(analysis);
+
+        short messageId = (short) softIncrementCount.GetCurrentValue();
+        // 鐢熸垚鏈�缁坱cp鎸囦护
+        byte[] buffer = ModbusInfo.PackCommandToTcp(analysis.Content.CreateReadRegister(station, length), messageId);
+        return OperateResultExOne.CreateSuccessResult(buffer);
+    }
+
+
+    private OperateResultExOne<byte[]> BuildReadRegisterCommand(ModbusAddress address, short length) {
+        short messageId = (short) softIncrementCount.GetCurrentValue();
+        // 鐢熸垚鏈�缁坱cp鎸囦护
+        byte[] buffer = ModbusInfo.PackCommandToTcp(address.CreateReadRegister(station, length), messageId);
+        return OperateResultExOne.CreateSuccessResult(buffer);
+    }
+
+
+    private OperateResultExOne<byte[]> BuildWriteOneCoilCommand(String address, boolean value) {
+        OperateResultExOne<ModbusAddress> analysis = ModbusInfo.AnalysisReadAddress(address, isAddressStartWithZero);
+        if (!analysis.IsSuccess) return OperateResultExOne.<byte[]>CreateFailedResult(analysis);
+
+        short messageId = (short) softIncrementCount.GetCurrentValue();
+        // 鐢熸垚鏈�缁坱cp鎸囦护
+        byte[] buffer = ModbusInfo.PackCommandToTcp(analysis.Content.CreateWriteOneCoil(station, value), messageId);
+        return OperateResultExOne.CreateSuccessResult(buffer);
+    }
+
+
+    private OperateResultExOne<byte[]> BuildWriteOneRegisterCommand(String address, byte[] data) {
+        OperateResultExOne<ModbusAddress> analysis = ModbusInfo.AnalysisReadAddress(address, isAddressStartWithZero);
+        if (!analysis.IsSuccess) return OperateResultExOne.<byte[]>CreateFailedResult(analysis);
+
+        short messageId = (short) softIncrementCount.GetCurrentValue();
+        // 鐢熸垚鏈�缁坱cp鎸囦护
+        byte[] buffer = ModbusInfo.PackCommandToTcp(analysis.Content.CreateWriteOneRegister(station, data), messageId);
+        return OperateResultExOne.CreateSuccessResult(buffer);
+    }
+
+
+    private OperateResultExOne<byte[]> BuildWriteCoilCommand(String address, boolean[] values) {
+        OperateResultExOne<ModbusAddress> analysis = ModbusInfo.AnalysisReadAddress(address, isAddressStartWithZero);
+        if (!analysis.IsSuccess) return OperateResultExOne.<byte[]>CreateFailedResult(analysis);
+
+        short messageId = (short) softIncrementCount.GetCurrentValue();
+        // 鐢熸垚鏈�缁坱cp鎸囦护
+        byte[] buffer = ModbusInfo.PackCommandToTcp(analysis.Content.CreateWriteCoil(station, values), messageId);
+        return OperateResultExOne.CreateSuccessResult(buffer);
+    }
+
+
+    private OperateResultExOne<byte[]> BuildWriteRegisterCommand(String address, byte[] values) {
+        OperateResultExOne<ModbusAddress> analysis = ModbusInfo.AnalysisReadAddress(address, isAddressStartWithZero);
+        if (!analysis.IsSuccess) return OperateResultExOne.<byte[]>CreateFailedResult(analysis);
+
+        short messageId = (short) softIncrementCount.GetCurrentValue();
+        // 鐢熸垚鏈�缁坱cp鎸囦护
+        byte[] buffer = ModbusInfo.PackCommandToTcp(analysis.Content.CreateWriteRegister(station, values), messageId);
+        return OperateResultExOne.CreateSuccessResult(buffer);
+    }
+
+
+    /**
+     * 妫�鏌ュ綋鍓嶇殑Modbus-Tcp鍝嶅簲鏄惁鏄纭殑
+     *
+     * @param send 鍙戦�佺殑鏁版嵁淇℃伅
+     * @return 甯︽槸鍚︽垚鍔熺殑缁撴灉鏁版嵁
+     */
+    private OperateResultExOne<byte[]> CheckModbusTcpResponse(byte[] send) {
+        OperateResultExOne<byte[]> result = ReadFromCoreServer(send);
+        if (result.IsSuccess) {
+            if ((send[7] + 0x80) == result.Content[7]) {
+                // 鍙戠敓浜嗛敊璇�
+                result.IsSuccess = false;
+                result.Message = ModbusInfo.GetDescriptionByErrorCode(result.Content[8]);
+                result.ErrorCode = result.Content[8];
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 璇诲彇鏈嶅姟鍣ㄧ殑鏁版嵁锛岄渶瑕佹寚瀹氫笉鍚岀殑鍔熻兘鐮�
+     *
+     * @param address 鍦板潃
+     * @param length  闀垮害
+     * @return 缁撴灉鏁版嵁
+     */
+    private OperateResultExOne<byte[]> ReadModBusBase(ModbusAddress address, short length) {
+        OperateResultExOne<byte[]> command = BuildReadRegisterCommand(address, length);
+        if (!command.IsSuccess) return OperateResultExOne.<byte[]>CreateFailedResult(command);
+
+        OperateResultExOne<byte[]> resultBytes = CheckModbusTcpResponse(command.Content);
+        if (resultBytes.IsSuccess) {
+            // 浜屾鏁版嵁澶勭悊
+            if (resultBytes.Content.length >= 9) {
+                byte[] buffer = new byte[resultBytes.Content.length - 9];
+                System.arraycopy(resultBytes.Content, 9, buffer, 0, buffer.length);
+                resultBytes.Content = buffer;
+            }
+        }
+        return resultBytes;
+    }
+
+
+    /**
+     * 璇诲彇鏈嶅姟鍣ㄧ殑鏁版嵁锛岄渶瑕佹寚瀹氫笉鍚岀殑鍔熻兘鐮�
+     *
+     * @param code    鎸囦护
+     * @param address 鍦板潃
+     * @param length  闀垮害
+     * @return 鎸囦护瀛楄妭淇℃伅
+     */
+    private OperateResultExOne<byte[]> ReadModBusBase(byte code, String address, short length) {
+
+        OperateResultExOne<byte[]> command = null;
+        switch (code) {
+            case ModbusInfo.ReadCoil: {
+                command = BuildReadCoilCommand(address, length);
+                break;
+            }
+            case ModbusInfo.ReadDiscrete: {
+                command = BuildReadDiscreteCommand(address, length);
+                break;
+            }
+            case ModbusInfo.ReadRegister: {
+                command = BuildReadRegisterCommand(address, length);
+                break;
+            }
+            default: {
+                command = new OperateResultExOne<byte[]>();
+                command.Message = StringResources.Language.ModbusTcpFunctionCodeNotSupport();
+                break;
+            }
+        }
+        if (!command.IsSuccess) return OperateResultExOne.<byte[]>CreateFailedResult(command);
+
+        OperateResultExOne<byte[]> resultBytes = CheckModbusTcpResponse(command.Content);
+        if (resultBytes.IsSuccess) {
+            // 浜屾鏁版嵁澶勭悊
+            if (resultBytes.Content.length >= 9) {
+                byte[] buffer = new byte[resultBytes.Content.length - 9];
+                System.arraycopy(resultBytes, 9, buffer, 0, buffer.length);
+                resultBytes.Content = buffer;
+            }
+        }
+        return resultBytes;
+
+    }
+
+
+    /**
+     * 璇诲彇绾垮湀锛岄渶瑕佹寚瀹氳捣濮嬪湴鍧�
+     *
+     * @param address 璧峰鍦板潃锛屾牸寮忎负"1234"
+     * @return 甯︽湁鎴愬姛鏍囧織鐨刡ool瀵硅薄
+     */
+    public OperateResultExOne<Boolean> ReadCoil(String address) {
+        OperateResultExOne<byte[]> read = ReadModBusBase(ModbusInfo.ReadCoil, address, (short) 1);
+        if (!read.IsSuccess) return OperateResultExOne.<Boolean>CreateFailedResult(read);
+
+        return GetBoolResultFromBytes(read);
+    }
+
+
+    /**
+     * 鎵归噺鐨勮鍙栫嚎鍦堬紝闇�瑕佹寚瀹氳捣濮嬪湴鍧�锛岃鍙栭暱搴�
+     *
+     * @param address 璧峰鍦板潃锛屾牸寮忎负"1234"
+     * @param length  璇诲彇闀垮害
+     * @return 甯︽湁鎴愬姛鏍囧織鐨刡ool鏁扮粍瀵硅薄
+     */
+    public OperateResultExOne<boolean[]> ReadCoil(String address, short length) {
+        OperateResultExOne<byte[]> read = ReadModBusBase(ModbusInfo.ReadCoil, address, length);
+        if (!read.IsSuccess) return OperateResultExOne.<boolean[]>CreateFailedResult(read);
+
+        return OperateResultExOne.CreateSuccessResult(SoftBasic.ByteToBoolArray(read.Content, length));
+    }
+
+
+    /**
+     * 璇诲彇杈撳叆绾垮湀锛岄渶瑕佹寚瀹氳捣濮嬪湴鍧�
+     *
+     * @param address 璧峰鍦板潃锛屾牸寮忎负"1234"
+     * @return 甯︽湁鎴愬姛鏍囧織鐨刡ool瀵硅薄
+     */
+    public OperateResultExOne<Boolean> ReadDiscrete(String address) {
+        OperateResultExOne<byte[]> read = ReadModBusBase(ModbusInfo.ReadDiscrete, address, (short) 1);
+        if (!read.IsSuccess) return OperateResultExOne.<Boolean>CreateFailedResult(read);
+
+        return GetBoolResultFromBytes(read);
+    }
+
+
+    /**
+     * 鎵归噺鐨勮鍙栬緭鍏ョ偣锛岄渶瑕佹寚瀹氳捣濮嬪湴鍧�锛岃鍙栭暱搴�
+     *
+     * @param address 璧峰鍦板潃锛屾牸寮忎负"1234"
+     * @param length  璇诲彇闀垮害
+     * @return 甯︽湁鎴愬姛鏍囧織鐨刡ool鏁扮粍瀵硅薄
+     */
+    public OperateResultExOne<boolean[]> ReadDiscrete(String address, short length) {
+        OperateResultExOne<byte[]> read = ReadModBusBase(ModbusInfo.ReadDiscrete, address, length);
+        if (!read.IsSuccess) return OperateResultExOne.<boolean[]>CreateFailedResult(read);
+
+        return OperateResultExOne.CreateSuccessResult(SoftBasic.ByteToBoolArray(read.Content, length));
+    }
+
+
+    /**
+     * 浠嶮odbus鏈嶅姟鍣ㄦ壒閲忚鍙栧瘎瀛樺櫒鐨勪俊鎭紝闇�瑕佹寚瀹氳捣濮嬪湴鍧�锛岃鍙栭暱搴�
+     *
+     * @param address 璧峰鍦板潃锛屾牸寮忎负"1234"锛屾垨鑰呮槸甯﹀姛鑳界爜鏍煎紡03X1234
+     * @param length  璇诲彇鐨勬暟閲�
+     * @return 甯︽湁鎴愬姛鏍囧織鐨勫瓧鑺備俊鎭�
+     */
+    @Override
+    public OperateResultExOne<byte[]> Read(String address, short length) {
+        OperateResultExOne<ModbusAddress> analysis = ModbusInfo.AnalysisReadAddress(address, isAddressStartWithZero);
+        if (!analysis.IsSuccess) return OperateResultExOne.<byte[]>CreateFailedResult(analysis);
+
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+
+        int alreadyFinished = 0;
+        while (alreadyFinished < length) {
+            short lengthTmp = (short) Math.min((length - alreadyFinished), 120);
+            OperateResultExOne<byte[]> read = ReadModBusBase(analysis.Content.AddressAdd(alreadyFinished), lengthTmp);
+            if (!read.IsSuccess) return OperateResultExOne.<byte[]>CreateFailedResult(read);
+
+            try {
+                outputStream.write(read.Content);
+            } catch (Exception ex) {
+
+            }
+            alreadyFinished += lengthTmp;
+        }
+
+        byte[] data = outputStream.toByteArray();
+        try {
+            outputStream.close();
+        } catch (Exception ex) {
+
+        }
+        return OperateResultExOne.CreateSuccessResult(data);
+    }
+
+    /**
+     * 鍐欎竴涓瘎瀛樺櫒鏁版嵁
+     *
+     * @param address 璧峰鍦板潃
+     * @param high    楂樹綅
+     * @param low     鍦颁綅
+     * @return 杩斿洖鍐欏叆缁撴灉
+     */
+    public OperateResult WriteOneRegister(String address, byte high, byte low) {
+        OperateResultExOne<byte[]> command = BuildWriteOneRegisterCommand(address, new byte[]{high, low});
+        if (!command.IsSuccess) {
+            return command;
+        }
+
+        return CheckModbusTcpResponse(command.Content);
+    }
+
+    /**
+     * 鍐欎竴涓瘎瀛樺櫒鏁版嵁
+     *
+     * @param address 璧峰鍦板潃
+     * @param value   鍐欏叆鍊�
+     * @return 杩斿洖鍐欏叆缁撴灉
+     */
+    public OperateResult WriteOneRegister(String address, short value) {
+        byte[] buffer = Utilities.getBytes(value);
+        return WriteOneRegister(address, buffer[1], buffer[0]);
+    }
+
+    /**
+     * 灏嗘暟鎹啓鍏ュ埌Modbus鐨勫瘎瀛樺櫒涓婂幓锛岄渶瑕佹寚瀹氳捣濮嬪湴鍧�鍜屾暟鎹唴瀹�
+     *
+     * @param address 璧峰鍦板潃锛屾牸寮忎负"1234"
+     * @param value   鍐欏叆鐨勬暟鎹紝闀垮害鏍规嵁data鐨勯暱搴︽潵鎸囩ず
+     * @return 杩斿洖鍐欏叆缁撴灉
+     */
+    @Override
+    public OperateResult Write(String address, byte[] value) {
+        OperateResultExOne<byte[]> command = BuildWriteRegisterCommand(address, value);
+        if (!command.IsSuccess) {
+            return command;
+        }
+
+        return CheckModbusTcpResponse(command.Content);
+    }
+
+    /**
+     * 鍐欎竴涓嚎鍦堜俊鎭紝鎸囧畾鏄惁閫氭柇
+     *
+     * @param address 璧峰鍦板潃
+     * @param value   鍐欏叆鍊�
+     * @return 杩斿洖鍐欏叆缁撴灉
+     */
+    public OperateResult WriteCoil(String address, boolean value) {
+        OperateResultExOne<byte[]> command = BuildWriteOneCoilCommand(address, value);
+        if (!command.IsSuccess) {
+            return command;
+        }
+
+        return CheckModbusTcpResponse(command.Content);
+    }
+
+    /**
+     * 鍐欑嚎鍦堟暟缁勶紝鎸囧畾鏄惁閫氭柇
+     *
+     * @param address 璧峰鍦板潃
+     * @param values  鍐欏叆鍊�
+     * @return 杩斿洖鍐欏叆缁撴灉
+     */
+    public OperateResult WriteCoil(String address, boolean[] values) {
+        OperateResultExOne<byte[]> command = BuildWriteCoilCommand(address, values);
+        if (!command.IsSuccess) {
+            return command;
+        }
+
+        return CheckModbusTcpResponse(command.Content);
+    }
+
+    /**
+     * 鍚戝瘎瀛樺櫒涓啓鍏ool鏁扮粍锛岃繑鍥炲�艰鏄庯紝姣斿浣犲啓鍏100,閭d箞data[0]瀵瑰簲M100.0
+     *
+     * @param address 瑕佸啓鍏ョ殑鏁版嵁鍦板潃
+     * @param values  瑕佸啓鍏ョ殑瀹為檯鏁版嵁锛岄暱搴︿负8鐨勫�嶆暟
+     * @return 杩斿洖鍐欏叆缁撴灉
+     */
+    public OperateResult Write(String address, boolean[] values) {
+        return Write(address, SoftBasic.BoolArrayToByte(values));
+    }
+
+    /**
+     * 杩斿洖琛ㄧず褰撳墠瀵硅薄鐨勫瓧绗︿覆
+     * @return 瀛楃涓蹭俊鎭�
+     */
+    @Override
+    public String toString() {
+        return "ModbusTcpNet[" + getIpAddress() + ":"+getPort()+"]";
+    }
+
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecA1EDataType.java b/src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecA1EDataType.java
new file mode 100644
index 0000000..96c9e1a
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecA1EDataType.java
@@ -0,0 +1,89 @@
+package com.zy.common.HslCommunication.Profinet.Melsec;
+
+/**
+ * 涓夎彵PLC鐨勬暟鎹被鍨嬶紝姝ゅ鍖呭惈浜嗗嚑涓父鐢ㄧ殑绫诲瀷
+ */
+public class MelsecA1EDataType {
+    /**
+     * 濡傛灉鎮ㄦ竻妤氱被鍨嬩唬鍙凤紝鍙互鏍规嵁鍊艰繘琛屾墿灞�
+     * @param code 鏁版嵁绫诲瀷鐨勪唬鍙�
+     * @param type 0鎴�1锛岄粯璁や负0
+     * @param asciiCode ASCII鏍煎紡鐨勭被鍨嬩俊鎭�
+     * @param fromBase >鎸囩ず鍦板潃鐨勫灏戣繘鍒剁殑锛�10鎴栨槸16
+     */
+    public MelsecA1EDataType( byte[] code, byte type, String asciiCode, int fromBase )
+    {
+        DataCode = code;
+        AsciiCode = asciiCode;
+        FromBase = fromBase;
+        if (type < 2) DataType = type;
+    }
+
+    private byte[] DataCode = new byte[2];
+    private byte DataType = 0x00;
+    private String AsciiCode = "";
+    private int FromBase = 0;
+
+    /**
+     * 绫诲瀷鐨勪唬鍙峰�硷紙杞厓浠朵唬鐮侊紝鐢ㄤ簬鍖哄垎杞厓浠剁被鍨嬶紝濡傦細D锛孯锛�
+     * @return
+     */
+    public byte[] getDataCode(){
+        return DataCode;
+    }
+
+    /**
+     * 鏁版嵁鐨勭被鍨嬶紝0浠h〃鎸夊瓧锛�1浠h〃鎸変綅
+     * @return
+     */
+    public byte getDataType(){
+        return DataType;
+    }
+
+    /**
+     * 褰撲互ASCII鏍煎紡閫氳鏃剁殑绫诲瀷鎻忚堪
+     * @return
+     */
+    public String getAsciiCode(){
+        return AsciiCode;
+    }
+
+    /**
+     * 鎸囩ず鍦板潃鏄�10杩涘埗锛岃繕鏄�16杩涘埗鐨�
+     * @return
+     */
+    public int getFromBase(){
+        return FromBase;
+    }
+
+
+    /**
+     * X杈撳叆瀵勫瓨鍣�
+     */
+    public final static MelsecA1EDataType X = new MelsecA1EDataType( new byte[] {0x58, 0x20}, (byte) 0x01, "X*", 8 );
+
+    /**
+     * Y杈撳嚭瀵勫瓨鍣�
+     */
+    public final static MelsecA1EDataType Y = new MelsecA1EDataType( new byte[] {0x59,0x20}, (byte)0x01, "Y*", 8 );
+
+    /**
+     * M涓棿瀵勫瓨鍣�
+     */
+    public final static MelsecA1EDataType M = new MelsecA1EDataType( new byte[] {0x4D,0x20}, (byte)0x01, "M*", 10 );
+
+    /**
+     * S鐘舵�佸瘎瀛樺櫒
+     */
+    public final static MelsecA1EDataType S = new MelsecA1EDataType( new byte[] {0x53,0x20}, (byte)0x01, "S*", 10 );
+
+    /**
+     * D鏁版嵁瀵勫瓨鍣�
+     */
+    public final static MelsecA1EDataType D = new MelsecA1EDataType( new byte[] {0x44,0x20}, (byte)0x00, "D*", 10 );
+
+    /**
+     * R鏂囦欢瀵勫瓨鍣�
+     */
+    public final static MelsecA1EDataType R = new MelsecA1EDataType( new byte[] { 0x52, 0x20 }, (byte)0x00, "R*", 10 );
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecA1ENet.java b/src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecA1ENet.java
new file mode 100644
index 0000000..e7ae89e
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecA1ENet.java
@@ -0,0 +1,336 @@
+package com.zy.common.HslCommunication.Profinet.Melsec;
+
+import com.zy.common.HslCommunication.Core.IMessage.MelsecA1EBinaryMessage;
+import com.zy.common.HslCommunication.Core.Net.NetworkBase.NetworkDeviceBase;
+import com.zy.common.HslCommunication.Core.Transfer.RegularByteTransform;
+import com.zy.common.HslCommunication.Core.Types.OperateResult;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExOne;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExTwo;
+import com.zy.common.HslCommunication.StringResources;
+
+/**
+ * 涓夎彵PLC閫氳鍗忚锛岄噰鐢ˋ鍏煎1E甯у崗璁疄鐜帮紝浣跨敤浜岃繘鍒剁爜閫氳锛岃鏍规嵁瀹為檯鍨嬪彿鏉ヨ繘琛岄�夊彇
+ */
+public class MelsecA1ENet extends NetworkDeviceBase<MelsecA1EBinaryMessage,RegularByteTransform> {
+
+
+    /**
+     * 瀹炰緥鍖栦笁鑿辩殑A鍏煎1E甯у崗璁殑閫氳瀵硅薄
+     */
+    public MelsecA1ENet() {
+        WordLength = 1;
+    }
+
+
+    /**
+     * 瀹炰緥鍖栦竴涓笁鑿辩殑A鍏煎1E甯у崗璁殑閫氳瀵硅薄
+     *
+     * @param ipAddress PLCd鐨処p鍦板潃
+     * @param port      PLC鐨勭鍙�
+     */
+    public MelsecA1ENet(String ipAddress, int port) {
+        WordLength = 1;
+        super.setIpAddress(ipAddress);
+        super.setPort(port);
+    }
+
+
+    private byte PLCNumber = (byte) (0xFF);                       // PLC缂栧彿
+
+    /**
+     * 鑾峰彇PLC缂栧彿
+     *
+     * @return PLC缂栧彿
+     */
+    public byte getPLCNumber() {
+        return PLCNumber;
+    }
+
+    /**
+     * 璁剧疆PLC缂栧彿
+     *
+     * @param plcNumber PLC缂栧彿
+     */
+    public void setPLCNumber(byte plcNumber) {
+        PLCNumber = plcNumber;
+    }
+
+
+    /**
+     * 浠庝笁鑿盤LC涓鍙栨兂瑕佺殑鏁版嵁锛岃繑鍥炶鍙栫粨鏋�
+     * @param address 璇诲彇鍦板潃锛屾牸寮忎负"M100","D100","W1A0"
+     * @param length 璇诲彇鐨勬暟鎹暱搴︼紝瀛楁渶澶у��960锛屼綅鏈�澶у��7168
+     * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
+     */
+    @Override
+    public OperateResultExOne<byte[]> Read(String address, short length) {
+        // 鑾峰彇鎸囦护
+        OperateResultExOne<byte[]> command = BuildReadCommand( address, length, PLCNumber );
+        if (!command.IsSuccess) return OperateResultExOne.CreateFailedResult( command );
+
+        // 鏍稿績浜や簰
+        OperateResultExOne<byte[]> read = ReadFromCoreServer( command.Content );
+        if (!read.IsSuccess) return OperateResultExOne.CreateFailedResult( read );
+
+        // 閿欒浠g爜楠岃瘉
+        if (read.Content[1] != 0) return new OperateResultExOne<>( read.Content[1], StringResources.Language.MelsecPleaseReferToManulDocument() );
+
+        // 鏁版嵁瑙f瀽锛岄渶瑕佷紶鍏ユ槸鍚︿娇鐢ㄤ綅鐨勫弬鏁�
+        return ExtractActualData( read.Content, command.Content[0] == 0x00 );
+    }
+
+
+
+
+    /**
+     * 浠庝笁鑿盤LC涓壒閲忚鍙栦綅杞厓浠讹紝杩斿洖璇诲彇缁撴灉
+     * @param address 璧峰鍦板潃
+     * @param length 璇诲彇鐨勯暱搴�
+     * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
+     */
+    public OperateResultExOne<boolean[]> ReadBool(String address, short length) {
+        // 瑙f瀽鍦板潃
+        OperateResultExTwo<MelsecA1EDataType, Short> analysis = MelsecHelper.McA1EAnalysisAddress( address );
+        if (!analysis.IsSuccess) return OperateResultExOne.CreateFailedResult( analysis );
+
+        // 浣嶈鍙栨牎楠�
+        if (analysis.Content1.getDataType() == 0x00) return new OperateResultExOne<boolean[]>( 0, StringResources.Language.MelsecReadBitInfo() );
+
+        // 鏍稿績浜や簰
+        OperateResultExOne<byte[]> read = Read( address, length );
+        if (!read.IsSuccess) return OperateResultExOne.CreateFailedResult( read );
+
+        // 杞寲bool鏁扮粍
+        boolean[] result = new boolean[read.Content.length];
+        for(int i=0;i<result.length;i++){
+            if(read.Content[i] == 0x01) result[i] = true;
+        }
+        return OperateResultExOne.CreateSuccessResult( result );
+    }
+
+
+
+    /**
+     * 浠庝笁鑿盤LC涓壒閲忚鍙栦綅杞厓浠讹紝杩斿洖璇诲彇缁撴灉
+     * @param address 璧峰鍦板潃
+     * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
+     */
+    public OperateResultExOne<Boolean> ReadBool(String address) {
+        OperateResultExOne<boolean[]> read = ReadBool(address, (short) 1);
+        if (!read.IsSuccess) return OperateResultExOne.CreateFailedResult(read);
+
+        return OperateResultExOne.CreateSuccessResult(read.Content[0]);
+    }
+
+
+
+
+
+    /**
+     * 鍚慞LC鍐欏叆鏁版嵁锛屾暟鎹牸寮忎负鍘熷鐨勫瓧鑺傜被鍨�
+     * @param address 璧峰鍦板潃
+     * @param value 鍘熷鏁版嵁
+     * @return 缁撴灉
+     */
+    @Override
+    public OperateResult Write(String address, byte[] value) {
+        // 瑙f瀽鎸囦护
+        OperateResultExOne<byte[]> command = BuildWriteCommand( address, value, PLCNumber );
+        if (!command.IsSuccess) return command;
+
+        // 鏍稿績浜や簰
+        OperateResultExOne<byte[]> read = ReadFromCoreServer( command.Content );
+        if (!read.IsSuccess) return read;
+
+        // 閿欒鐮佹牎楠� (鍦ˋ鍏煎1E鍗忚涓紝缁撴潫浠g爜鍚庨潰绱ц窡鐨勬槸寮傚父淇℃伅鐨勪唬鐮�)
+        if (read.Content[1] != 0) return new OperateResultExOne<byte[]>( read.Content[1], StringResources.Language.MelsecPleaseReferToManulDocument() );
+
+        // 鎴愬姛
+        return OperateResult.CreateSuccessResult( );
+    }
+
+
+
+    /**
+     * 鍚慞LC涓綅杞厓浠跺啓鍏ool鏁扮粍锛岃繑鍥炲�艰鏄庯紝姣斿浣犲啓鍏100,values[0]瀵瑰簲M100
+     * @param address 瑕佸啓鍏ョ殑鏁版嵁鍦板潃
+     * @param value 瑕佸啓鍏ョ殑瀹為檯鏁版嵁锛岄暱搴︿负8鐨勫�嶆暟
+     * @return 杩斿洖鍐欏叆缁撴灉
+     */
+    public OperateResult Write(String address, boolean value) {
+        return Write(address, new boolean[]{value});
+    }
+
+
+
+    /**
+     * 鍚慞LC涓綅杞厓浠跺啓鍏ool鏁扮粍锛岃繑鍥炲�艰鏄庯紝姣斿浣犲啓鍏100,values[0]瀵瑰簲M100
+     * @param address 瑕佸啓鍏ョ殑鏁版嵁鍦板潃
+     * @param values 瑕佸啓鍏ョ殑瀹為檯鏁版嵁锛屽彲浠ユ寚瀹氫换鎰忕殑闀垮害
+     * @return 杩斿洖鍐欏叆缁撴灉
+     */
+    public OperateResult Write(String address, boolean[] values) {
+        byte[] buffer = new byte[values.length];
+        for (int i = 0; i < values.length; i++) {
+            buffer[i] = values[i] ? (byte) 0x01 : (byte) 0x00;
+        }
+        return Write(address, buffer);
+    }
+
+
+    /**
+     * 鑾峰彇褰撳墠瀵硅薄鐨勫瓧绗︿覆鏍囪瘑褰㈠紡
+     * @return 瀛楃涓蹭俊鎭�
+     */
+    @Override
+    public String toString() {
+        return "MelsecA1ENet";
+    }
+
+
+
+
+
+    /**
+     * 鏍规嵁绫诲瀷鍦板潃闀垮害纭闇�瑕佽鍙栫殑鎸囦护澶�
+     * @param address 璧峰鍦板潃
+     * @param length 闀垮害
+     * @return 甯︽湁鎴愬姛鏍囧織鐨勬寚浠ゆ暟鎹�
+     */
+    public static OperateResultExOne<byte[]> BuildReadCommand(String address, short length) {
+        return BuildReadCommand(address,length,(byte)0xFF);
+    }
+
+    /**
+     * 鏍规嵁绫诲瀷鍦板潃闀垮害纭闇�瑕佽鍙栫殑鎸囦护澶�
+     * @param address 璧峰鍦板潃
+     * @param length 闀垮害
+     * @param plcNumber PLC鍙�
+     * @return 甯︽湁鎴愬姛鏍囧織鐨勬寚浠ゆ暟鎹�
+     */
+    public static OperateResultExOne<byte[]> BuildReadCommand(String address, short length, byte plcNumber) {
+        OperateResultExTwo<MelsecA1EDataType, Short> analysis = MelsecHelper.McA1EAnalysisAddress(address);
+        if (!analysis.IsSuccess) return OperateResultExOne.CreateFailedResult(analysis);
+
+        byte subtitle = analysis.Content1.getDataType() == 0x01 ? (byte)0x00 : (byte)0x01;
+
+        byte[] _PLCCommand = new byte[12];
+        _PLCCommand[0] = subtitle;                              // 鍓爣棰�
+        _PLCCommand[1] = plcNumber;                             // PLC鍙�
+        _PLCCommand[2] = 0x0A;                                  // CPU鐩戣瀹氭椂鍣紙L锛夎繖閲岃缃负0x00,0x0A锛岀瓑寰匔PU杩斿洖鐨勬椂闂翠负10*250ms=2.5绉�
+        _PLCCommand[3] = 0x00;                                  // CPU鐩戣瀹氭椂鍣紙H锛�
+        _PLCCommand[4] = (byte)(analysis.Content2 % 256);       // 璧峰杞厓浠讹紙寮�濮嬭鍙栫殑鍦板潃锛�
+        _PLCCommand[5] = (byte)(analysis.Content2 / 256);
+        _PLCCommand[6] = 0x00;
+        _PLCCommand[7] = 0x00;
+        _PLCCommand[8] = analysis.Content1.getDataCode()[1];    // 杞厓浠朵唬鐮侊紙L锛�
+        _PLCCommand[9] = analysis.Content1.getDataCode()[0];    // 杞厓浠朵唬鐮侊紙H锛�
+        _PLCCommand[10] = (byte)(length % 256);                 // 杞厓浠剁偣鏁�
+        _PLCCommand[11] = 0x00;
+
+        return OperateResultExOne.CreateSuccessResult(_PLCCommand);
+    }
+
+
+
+    /**
+     * 鏍规嵁绫诲瀷鍦板潃浠ュ強闇�瑕佸啓鍏ョ殑鏁版嵁鏉ョ敓鎴愭寚浠ゅご
+     * @param address 璧峰鍦板潃
+     * @param value 鍊�
+     * @return 缁撴灉
+     */
+    public static OperateResultExOne<byte[]> BuildWriteCommand(String address, byte[] value) {
+        return BuildWriteCommand(address,value,(byte)0xFF);
+    }
+
+    /**
+     * 鏍规嵁绫诲瀷鍦板潃浠ュ強闇�瑕佸啓鍏ョ殑鏁版嵁鏉ョ敓鎴愭寚浠ゅご
+     * @param address 璧峰鍦板潃
+     * @param value 鍊�
+     * @param plcNumber PLC鍙�
+     * @return 缁撴灉
+     */
+    public static OperateResultExOne<byte[]> BuildWriteCommand(String address, byte[] value, byte plcNumber) {
+        OperateResultExTwo<MelsecA1EDataType, Short> analysis = MelsecHelper.McA1EAnalysisAddress(address);
+        if (!analysis.IsSuccess) return OperateResultExOne.CreateFailedResult(analysis);
+
+        int length = -1;
+        if (analysis.Content1.getDataType() == 1)
+        {
+            // 鎸夌収浣嶅啓鍏ョ殑鎿嶄綔锛屾暟鎹渶瑕侀噸鏂拌绠�
+            length = value.length;
+            value = MelsecHelper.TransBoolArrayToByteData( value );
+        }
+
+        byte subtitle = analysis.Content1.getDataType() == 0x01 ? (byte)0x02 : (byte)0x03;
+
+        byte[] _PLCCommand = new byte[12 + value.length];
+        _PLCCommand[0] = subtitle;                              // 鍓爣棰�
+        _PLCCommand[1] = plcNumber;                             // PLC鍙�
+        _PLCCommand[2] = 0x0A;                                  // CPU鐩戣瀹氭椂鍣紙L锛夎繖閲岃缃负0x00,0x0A锛岀瓑寰匔PU杩斿洖鐨勬椂闂翠负10*250ms=2.5绉�
+        _PLCCommand[3] = 0x00;                                  // CPU鐩戣瀹氭椂鍣紙H锛�
+        _PLCCommand[4] = (byte)(analysis.Content2 % 256);       // 璧峰杞厓浠讹紙寮�濮嬭鍙栫殑鍦板潃锛�
+        _PLCCommand[5] = (byte)(analysis.Content2 / 256);
+        _PLCCommand[6] = 0x00;
+        _PLCCommand[7] = 0x00;
+        _PLCCommand[8] = analysis.Content1.getDataCode()[1];    // 杞厓浠朵唬鐮侊紙L锛�
+        _PLCCommand[9] = analysis.Content1.getDataCode()[0];    // 杞厓浠朵唬鐮侊紙H锛�
+        _PLCCommand[10] = (byte)(length % 256);                 // 杞厓浠剁偣鏁�
+        _PLCCommand[11] = 0x00;
+
+        // 鍒ゆ柇鏄惁杩涜浣嶆搷浣�
+        if (analysis.Content1.getDataType() == 1) {
+            if (length > 0) {
+                _PLCCommand[10] = (byte)(length % 256);                       // 杞厓浠剁偣鏁�
+            }
+            else {
+                _PLCCommand[10] = (byte)(value.length * 2 % 256);             // 杞厓浠剁偣鏁�
+            }
+        } else {
+            _PLCCommand[10] = (byte)(value.length / 2 % 256);                 // 杞厓浠剁偣鏁�
+        }
+
+        System.arraycopy(value, 0, _PLCCommand, 12, value.length);
+
+        return OperateResultExOne.CreateSuccessResult(_PLCCommand);
+    }
+
+
+    /**
+     * 浠嶱LC鍙嶉鐨勬暟鎹腑鎻愬彇鍑哄疄闄呯殑鏁版嵁鍐呭锛岄渶瑕佷紶鍏ュ弽棣堟暟鎹紝鏄惁浣嶈鍙�
+     * @param response 鍙嶉鐨勬暟鎹唴瀹�
+     * @param isBit 鏄惁浣嶈鍙�
+     * @return 瑙f瀽鍚庣殑缁撴灉瀵硅薄
+     */
+    public static OperateResultExOne<byte[]> ExtractActualData( byte[] response, boolean isBit )
+    {
+        if (isBit)
+        {
+            // 浣嶈鍙�
+            byte[] Content = new byte[(response.length - 2) * 2];
+            for (int i = 2; i < response.length; i++)
+            {
+                if ((response[i] & 0x10) == 0x10)
+                {
+                    Content[(i - 2) * 2 + 0] = 0x01;
+                }
+
+                if ((response[i] & 0x01) == 0x01)
+                {
+                    Content[(i - 2) * 2 + 1] = 0x01;
+                }
+            }
+
+            return OperateResultExOne.CreateSuccessResult( Content );
+        }
+        else
+        {
+            // 瀛楄鍙�
+            byte[] Content = new byte[response.length - 2];
+            System.arraycopy(response,2,Content,0,Content.length);
+
+            return OperateResultExOne.CreateSuccessResult( Content );
+        }
+    }
+
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecHelper.java b/src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecHelper.java
new file mode 100644
index 0000000..a94afa0
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecHelper.java
@@ -0,0 +1,290 @@
+package com.zy.common.HslCommunication.Profinet.Melsec;
+
+import com.zy.common.HslCommunication.Core.Types.OperateResultExTwo;
+import com.zy.common.HslCommunication.Utilities;
+
+/**
+ * 鎵�鏈変笁鑿遍�氳绫荤殑閫氱敤杈呭姪宸ュ叿绫伙紝鍖呭惈浜嗕竴浜涢�氱敤鐨勯潤鎬佹柟娉曪紝鍙互浣跨敤鏈被鏉ヨ幏鍙栦竴浜涘師濮嬬殑鎶ユ枃淇℃伅銆傝缁嗙殑鎿嶄綔鍙傝渚嬪瓙
+ */
+public class MelsecHelper {
+
+    /**
+     * 瑙f瀽A1E鍗忚鏁版嵁鍦板潃
+     * @param address 鏁版嵁鍦板潃
+     * @return 瑙f瀽鍊�
+     */
+    public static OperateResultExTwo<MelsecA1EDataType, Short> McA1EAnalysisAddress( String address )
+    {
+        OperateResultExTwo<MelsecA1EDataType, Short> result = new OperateResultExTwo<MelsecA1EDataType, Short>();
+        try {
+            switch (address.charAt(0)) {
+                case 'X':
+                case 'x': {
+                    result.Content1 = MelsecA1EDataType.X;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecA1EDataType.X.getFromBase());
+                    break;
+                }
+                case 'Y':
+                case 'y': {
+                    result.Content1 = MelsecA1EDataType.Y;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecA1EDataType.Y.getFromBase());
+                    break;
+                }
+                case 'M':
+                case 'm': {
+                    result.Content1 = MelsecA1EDataType.M;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecA1EDataType.M.getFromBase());
+                    break;
+                }
+                case 'S':
+                case 's': {
+                    result.Content1 = MelsecA1EDataType.S;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecA1EDataType.S.getFromBase());
+                    break;
+                }
+                case 'D':
+                case 'd': {
+                    result.Content1 = MelsecA1EDataType.D;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecA1EDataType.D.getFromBase());
+                    break;
+                }
+                case 'R':
+                case 'r': {
+                    result.Content1 = MelsecA1EDataType.R;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecA1EDataType.R.getFromBase());
+                    break;
+                }
+                default:
+                    throw new Exception("杈撳叆鐨勭被鍨嬩笉鏀寔锛岃閲嶆柊杈撳叆");
+            }
+        } catch (Exception ex) {
+            result.Message = "鍦板潃鏍煎紡濉啓閿欒锛�" + ex.getMessage();
+            return result;
+        }
+
+        result.IsSuccess = true;
+        return result;
+    }
+
+    /**
+     * 瑙f瀽鏁版嵁鍦板潃
+     * @param address 鏁版嵁鍦板潃
+     * @return 瑙f瀽鍊�
+     */
+    public static OperateResultExTwo<MelsecMcDataType, Short> McAnalysisAddress( String address )
+    {
+        OperateResultExTwo<MelsecMcDataType, Short> result = new OperateResultExTwo<MelsecMcDataType, Short>();
+        try {
+            switch (address.charAt(0)) {
+                case 'M':
+                case 'm': {
+                    result.Content1 = MelsecMcDataType.M;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecMcDataType.M.getFromBase());
+                    break;
+                }
+                case 'X':
+                case 'x': {
+                    result.Content1 = MelsecMcDataType.X;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecMcDataType.X.getFromBase());
+                    break;
+                }
+                case 'Y':
+                case 'y': {
+                    result.Content1 = MelsecMcDataType.Y;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecMcDataType.Y.getFromBase());
+                    break;
+                }
+                case 'D':
+                case 'd': {
+                    result.Content1 = MelsecMcDataType.D;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecMcDataType.D.getFromBase());
+                    break;
+                }
+                case 'W':
+                case 'w': {
+                    result.Content1 = MelsecMcDataType.W;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecMcDataType.W.getFromBase());
+                    break;
+                }
+                case 'L':
+                case 'l': {
+                    result.Content1 = MelsecMcDataType.L;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecMcDataType.L.getFromBase());
+                    break;
+                }
+                case 'F':
+                case 'f': {
+                    result.Content1 = MelsecMcDataType.F;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecMcDataType.F.getFromBase());
+                    break;
+                }
+                case 'V':
+                case 'v': {
+                    result.Content1 = MelsecMcDataType.V;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecMcDataType.V.getFromBase());
+                    break;
+                }
+                case 'B':
+                case 'b': {
+                    result.Content1 = MelsecMcDataType.B;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecMcDataType.B.getFromBase());
+                    break;
+                }
+                case 'R':
+                case 'r': {
+                    result.Content1 = MelsecMcDataType.R;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecMcDataType.R.getFromBase());
+                    break;
+                }
+                case 'S':
+                case 's': {
+                    result.Content1 = MelsecMcDataType.S;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecMcDataType.S.getFromBase());
+                    break;
+                }
+                case 'Z':
+                case 'z': {
+                    result.Content1 = MelsecMcDataType.Z;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecMcDataType.Z.getFromBase());
+                    break;
+                }
+                case 'T':
+                case 't': {
+                    result.Content1 = MelsecMcDataType.T;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecMcDataType.T.getFromBase());
+                    break;
+                }
+                case 'C':
+                case 'c': {
+                    result.Content1 = MelsecMcDataType.C;
+                    result.Content2 = Short.parseShort(address.substring(1), MelsecMcDataType.C.getFromBase());
+                    break;
+                }
+                default:
+                    throw new Exception("杈撳叆鐨勭被鍨嬩笉鏀寔锛岃閲嶆柊杈撳叆");
+            }
+        } catch (Exception ex) {
+            result.Message = "鍦板潃鏍煎紡濉啓閿欒锛�" + ex.getMessage();
+            return result;
+        }
+
+        result.IsSuccess = true;
+        return result;
+    }
+
+
+    /**
+     * 浠庡瓧鑺傛瀯寤轰竴涓狝SCII鏍煎紡鐨勫湴鍧�瀛楄妭
+     * @param value 瀛楄妭淇℃伅
+     * @return ASCII鏍煎紡鐨勫湴鍧�
+     */
+    public static byte[] BuildBytesFromData(byte value )
+    {
+        return Utilities.getBytes(String.format("%02x",value),"ASCII");
+    }
+
+
+    /**
+     * 浠巗hort鏁版嵁鏋勫缓涓�涓狝SCII鏍煎紡鍦板潃瀛楄妭
+     * @param value short鍊�
+     * @return ASCII鏍煎紡鐨勫湴鍧�
+     */
+    public static byte[] BuildBytesFromData( short value )
+    {
+        return Utilities.getBytes(String.format("%04x",value),"ASCII");
+    }
+
+    /**
+     * 浠巌nt鏁版嵁鏋勫缓涓�涓狝SCII鏍煎紡鍦板潃瀛楄妭
+     * @param value int鍊�
+     * @return ASCII鏍煎紡鐨勫湴鍧�
+     */
+    public static byte[] BuildBytesFromData( int value )
+    {
+        return Utilities.getBytes(String.format("%04x",value),"ASCII");
+    }
+
+
+    /**
+     * 浠庝笁鑿辩殑鍦板潃涓瀯寤篗C鍗忚鐨�6瀛楄妭鐨凙SCII鏍煎紡鐨勫湴鍧�
+     * @param address 涓夎彵鍦板潃
+     * @param type 涓夎彵鐨勬暟鎹被鍨�
+     * @return 6瀛楄妭鐨凙SCII鏍煎紡鐨勫湴鍧�
+     */
+    public static byte[] BuildBytesFromAddress( int address, MelsecMcDataType type )
+    {
+        return Utilities.getBytes(String.format(type.getFromBase() == 10 ? "%06d" : "%06x",address),"ASCII");
+    }
+
+
+    /**
+     * 浠庡瓧鑺傛暟缁勬瀯寤轰竴涓狝SCII鏍煎紡鐨勫湴鍧�瀛楄妭
+     * @param value 瀛楄妭淇℃伅
+     * @return ASCII鏍煎紡鐨勫湴鍧�
+     */
+    public static byte[] BuildBytesFromData( byte[] value )
+    {
+        byte[] buffer = new byte[value.length * 2];
+        for (int i = 0; i < value.length; i++)
+        {
+            byte[] data = BuildBytesFromData( value[i] );
+            buffer[2*i+0] = data[0];
+            buffer[2*i+1] = data[1];
+        }
+        return buffer;
+    }
+
+
+    /**
+     * 灏�0锛�1锛�0锛�1鐨勫瓧鑺傛暟缁勫帇缂╂垚涓夎彵鏍煎紡鐨勫瓧鑺傛暟缁勬潵琛ㄧず寮�鍏抽噺鐨�
+     * @param value 鍘熷鐨勬暟鎹瓧鑺�
+     * @return 鍘嬬缉杩囧悗鐨勬暟鎹瓧鑺�
+     */
+    public static byte[] TransBoolArrayToByteData( byte[] value )
+    {
+        int length = value.length % 2 == 0 ? value.length / 2 : (value.length / 2) + 1;
+        byte[] buffer = new byte[length];
+
+        for (int i = 0; i < length; i++)
+        {
+            if (value[i * 2 + 0] != 0x00) buffer[i] += 0x10;
+            if ((i * 2 + 1) < value.length)
+            {
+                if (value[i * 2 + 1] != 0x00) buffer[i] += 0x01;
+            }
+        }
+
+        return buffer;
+    }
+
+
+    /**
+     * 璁$畻Fx鍗忚鎸囦护鐨勫拰鏍¢獙淇℃伅
+     * @param data 瀛楄妭鏁版嵁
+     * @return 鏍¢獙涔嬪悗鐨勬暟鎹�
+     */
+    public static byte[] FxCalculateCRC( byte[] data )
+    {
+        int sum = 0;
+        for (int i = 1; i < data.length - 2; i++)
+        {
+            sum += data[i];
+        }
+        return BuildBytesFromData( (byte)sum );
+    }
+
+
+    /**
+     * 妫�鏌ユ寚瀹氱殑鍜屾牎楠屾槸鍚︽槸姝g‘鐨�
+     * @param data 瀛楄妭鏁版嵁
+     * @return 鏄惁鎴愬姛
+     */
+    public static boolean CheckCRC( byte[] data )
+    {
+        byte[] crc = FxCalculateCRC( data );
+        if (crc[0] != data[data.length - 2]) return false;
+        if (crc[1] != data[data.length - 1]) return false;
+        return true;
+    }
+
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecMcAsciiNet.java b/src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecMcAsciiNet.java
new file mode 100644
index 0000000..e0278a9
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecMcAsciiNet.java
@@ -0,0 +1,413 @@
+package com.zy.common.HslCommunication.Profinet.Melsec;
+
+import com.zy.common.HslCommunication.Core.IMessage.MelsecQnA3EAsciiMessage;
+import com.zy.common.HslCommunication.Core.Net.NetworkBase.NetworkDeviceBase;
+import com.zy.common.HslCommunication.Core.Transfer.RegularByteTransform;
+import com.zy.common.HslCommunication.Core.Types.OperateResult;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExOne;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExTwo;
+import com.zy.common.HslCommunication.StringResources;
+import com.zy.common.HslCommunication.Utilities;
+
+
+/**
+ * 涓夎彵PLC閫氳绫伙紝閲囩敤Qna鍏煎3E甯у崗璁疄鐜帮紝闇�瑕佸湪PLC渚у厛鐨勪互澶綉妯″潡鍏堣繘琛岄厤缃紝蹇呴』涓篈SCII閫氳鏍煎紡
+ */
+public class MelsecMcAsciiNet extends NetworkDeviceBase<MelsecQnA3EAsciiMessage, RegularByteTransform> {
+
+    /**
+     * 瀹炰緥鍖栦笁鑿辩殑Qna鍏煎3E甯у崗璁殑閫氳瀵硅薄
+     */
+    public MelsecMcAsciiNet() {
+        WordLength = 1;
+    }
+
+
+    /**
+     * 瀹炰緥鍖栦竴涓笁鑿辩殑Qna鍏煎3E甯у崗璁殑閫氳瀵硅薄
+     * @param ipAddress PLC鐨処p鍦板潃
+     * @param port PLC鐨勭鍙�
+     */
+    public MelsecMcAsciiNet(String ipAddress, int port) {
+        WordLength = 1;
+        setIpAddress(ipAddress);
+        setPort(port);
+    }
+
+
+    private byte NetworkNumber = 0x00;                       // 缃戠粶鍙�
+    private byte NetworkStationNumber = 0x00;                // 缃戠粶绔欏彿
+
+    /**
+     * 鑾峰彇缃戠粶鍙�
+     *
+     * @return
+     */
+    public byte getNetworkNumber() {
+        return NetworkNumber;
+    }
+
+    /**
+     * 璁剧疆缃戠粶鍙�
+     *
+     * @param networkNumber
+     */
+    public void setNetworkNumber(byte networkNumber) {
+        NetworkNumber = networkNumber;
+    }
+
+    /**
+     * 鑾峰彇缃戠粶绔欏彿
+     *
+     * @return
+     */
+    public byte getNetworkStationNumber() {
+        return NetworkStationNumber;
+    }
+
+    /**
+     * 璁剧疆缃戠粶绔欏彿
+     *
+     * @param networkStationNumber
+     */
+    public void setNetworkStationNumber(byte networkStationNumber) {
+        NetworkStationNumber = networkStationNumber;
+    }
+
+
+
+
+    /**
+     * 浠庝笁鑿盤LC涓鍙栨兂瑕佺殑鏁版嵁锛岃繑鍥炶鍙栫粨鏋�
+     * @param address 璇诲彇鍦板潃锛屾牸寮忎负"M100","D100","W1A0"
+     * @param length 璇诲彇鐨勬暟鎹暱搴︼紝瀛楁渶澶у��960锛屼綅鏈�澶у��7168
+     * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
+     */
+    @Override
+    public OperateResultExOne<byte[]> Read(String address, short length) {
+        //鑾峰彇鎸囦护
+        OperateResultExOne<byte[]> command = BuildReadCommand( address, length, NetworkNumber, NetworkStationNumber );
+        if (!command.IsSuccess) return command;
+
+        // 鏍稿績浜や簰
+        OperateResultExOne<byte[]> read = ReadFromCoreServer( command.Content );
+        if (!read.IsSuccess) return read;
+
+        // 閿欒浠g爜楠岃瘉
+        short errorCode = Short.parseShort(Utilities.getString(read.Content,18,4,"ASCII"), 16 );
+        if (errorCode != 0) return new OperateResultExOne<>( errorCode, StringResources.Language.MelsecPleaseReferToManulDocument() );
+
+        // 鏁版嵁瑙f瀽锛岄渶瑕佷紶鍏ユ槸鍚︿娇鐢ㄤ綅鐨勫弬鏁�
+        return ExtractActualData( read.Content, command.Content[29] == 0x31 );
+    }
+
+
+
+    /**
+     * 浠庝笁鑿盤LC涓壒閲忚鍙栦綅杞厓浠讹紝杩斿洖璇诲彇缁撴灉
+     * @param address 璧峰鍦板潃
+     * @param length 璇诲彇鐨勯暱搴�
+     * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
+     */
+    public OperateResultExOne<boolean[]> ReadBool(String address, short length) {
+        // 瑙f瀽鍦板潃
+        OperateResultExTwo<MelsecMcDataType, Short> analysis = MelsecHelper.McAnalysisAddress( address );
+        if (!analysis.IsSuccess) return OperateResultExOne.CreateFailedResult( analysis );
+
+        // 浣嶈鍙栨牎楠�
+        if (analysis.Content1.getDataType() == 0x00) return new OperateResultExOne<>( StringResources.Language.MelsecReadBitInfo() );
+
+        // 鏍稿績浜や簰
+        OperateResultExOne<byte[]> read = Read( address, length );
+        if (!read.IsSuccess) return OperateResultExOne.CreateFailedResult( read );
+
+        // 杞寲bool鏁扮粍
+        boolean[] content = new boolean[read.Content.length];
+        for (int i = 0; i < read.Content.length; i++) {
+            content[i] = read.Content[i] == 0x01;
+        }
+        return OperateResultExOne.CreateSuccessResult( content );
+    }
+
+
+
+    /**
+     * 浠庝笁鑿盤LC涓壒閲忚鍙栦綅杞厓浠讹紝杩斿洖璇诲彇缁撴灉
+     * @param address 璧峰鍦板潃
+     * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
+     */
+    public OperateResultExOne<Boolean> ReadBool(String address) {
+        OperateResultExOne<boolean[]> read = ReadBool(address, (short) 1);
+        if (!read.IsSuccess) return OperateResultExOne.<Boolean>CreateFailedResult(read);
+
+        return OperateResultExOne.<Boolean>CreateSuccessResult(read.Content[0]);
+    }
+
+
+    /**
+     * 鍚慞LC鍐欏叆鏁版嵁锛屾暟鎹牸寮忎负鍘熷鐨勫瓧鑺傜被鍨�
+     * @param address 璧峰鍦板潃
+     * @param value 鍘熷鏁版嵁
+     * @return 缁撴灉
+     */
+    @Override
+    public OperateResult Write(String address, byte[] value) {
+        // 瑙f瀽鎸囦护
+        OperateResultExOne<byte[]> command = BuildWriteCommand( address, value, NetworkNumber, NetworkStationNumber );
+        if (!command.IsSuccess) return command;
+
+        // 鏍稿績浜や簰
+        OperateResultExOne<byte[]> read = ReadFromCoreServer( command.Content );
+        if (!read.IsSuccess) return read;
+
+        // 閿欒鐮侀獙璇�
+        short errorCode = Short.parseShort( Utilities.getString( read.Content, 18, 4 ,"ASCII"), 16 );
+        if (errorCode != 0) return new OperateResultExOne<byte[]>( errorCode, StringResources.Language.MelsecPleaseReferToManulDocument() );
+
+        // 鍐欏叆鎴愬姛
+        return OperateResult.CreateSuccessResult( );
+    }
+
+
+    /**
+     * 鍚慞LC涓綅杞厓浠跺啓鍏ool鏁扮粍锛岃繑鍥炲�艰鏄庯紝姣斿浣犲啓鍏100,values[0]瀵瑰簲M100
+     * @param address 瑕佸啓鍏ョ殑鏁版嵁鍦板潃
+     * @param value 瑕佸啓鍏ョ殑瀹為檯鏁版嵁锛宼rue 鎴栬�呮槸 false
+     * @return 杩斿洖鍐欏叆缁撴灉
+     */
+    public OperateResult Write(String address, boolean value) {
+        return Write(address, new boolean[]{value});
+    }
+
+
+    /**
+     * 鍚慞LC涓綅杞厓浠跺啓鍏ool鏁扮粍锛岃繑鍥炲�艰鏄庯紝姣斿浣犲啓鍏100,values[0]瀵瑰簲M100
+     * @param address 瑕佸啓鍏ョ殑鏁版嵁鍦板潃
+     * @param values 瑕佸啓鍏ョ殑瀹為檯鏁版嵁锛屽彲浠ユ寚瀹氫换鎰忕殑闀垮害
+     * @return 杩斿洖鍐欏叆缁撴灉
+     */
+    public OperateResult Write(String address, boolean[] values) {
+        byte[] buffer = new byte[values.length];
+        for (int i = 0; i < values.length; i++) {
+            if (values[i]) buffer[i] = 0x01;
+        }
+        return Write(address, buffer);
+    }
+
+
+    /**
+     * 杩斿洖琛ㄧず褰撳墠瀵硅薄鐨勫瓧绗︿覆
+     * @return 瀛楃涓�
+     */
+    @Override
+    public String toString() {
+        return "MelsecMcNet";
+    }
+
+
+
+    /**
+     * 鏍规嵁绫诲瀷鍦板潃闀垮害纭闇�瑕佽鍙栫殑鎸囦护澶�
+     * @param address 璧峰鍦板潃
+     * @param length 闀垮害
+     * @return 甯︽湁鎴愬姛鏍囧織鐨勬寚浠ゆ暟鎹�
+     */
+    public static OperateResultExOne< byte[]> BuildReadCommand(String address, short length, byte networkNumber, byte networkStationNumber) {
+        OperateResultExTwo<MelsecMcDataType, Short> analysis = MelsecHelper.McAnalysisAddress(address);
+        if (!analysis.IsSuccess) return OperateResultExOne.CreateFailedResult(analysis);
+
+        // 榛樿淇℃伅----娉ㄦ剰锛氶珮浣庡瓧鑺備氦閿�
+
+        try {
+            byte[] _PLCCommand = new byte[42];
+            _PLCCommand[0] = 0x35;                                      // 鍓爣棰�
+            _PLCCommand[1] = 0x30;
+            _PLCCommand[2] = 0x30;
+            _PLCCommand[3] = 0x30;
+            _PLCCommand[4] = MelsecHelper.BuildBytesFromData(networkNumber)[0];                // 缃戠粶鍙�
+            _PLCCommand[5] = MelsecHelper.BuildBytesFromData(networkNumber)[1];
+            _PLCCommand[6] = 0x46;                         // PLC缂栧彿
+            _PLCCommand[7] = 0x46;
+            _PLCCommand[8] = 0x30;                         // 鐩爣妯″潡IO缂栧彿
+            _PLCCommand[9] = 0x33;
+            _PLCCommand[10] = 0x46;
+            _PLCCommand[11] = 0x46;
+            _PLCCommand[12] = MelsecHelper.BuildBytesFromData(networkStationNumber)[0];         // 鐩爣妯″潡绔欏彿
+            _PLCCommand[13] = MelsecHelper.BuildBytesFromData(networkStationNumber)[1];
+            _PLCCommand[14] = 0x30;                         // 璇锋眰鏁版嵁闀垮害
+            _PLCCommand[15] = 0x30;
+            _PLCCommand[16] = 0x31;
+            _PLCCommand[17] = 0x38;
+            _PLCCommand[18] = 0x30;                         // CPU鐩戣瀹氭椂鍣�
+            _PLCCommand[19] = 0x30;
+            _PLCCommand[20] = 0x31;
+            _PLCCommand[21] = 0x30;
+            _PLCCommand[22] = 0x30;                        // 鎵归噺璇诲彇鏁版嵁鍛戒护
+            _PLCCommand[23] = 0x34;
+            _PLCCommand[24] = 0x30;
+            _PLCCommand[25] = 0x31;
+            _PLCCommand[26] = 0x30;                         // 浠ョ偣涓哄崟浣嶈繕鏄瓧涓哄崟浣嶆垚鎵硅鍙�
+            _PLCCommand[27] = 0x30;
+            _PLCCommand[28] = 0x30;
+            _PLCCommand[29] = analysis.Content1.getDataType() == 0 ? (byte) 0x30 : (byte) 0x31;
+            _PLCCommand[30] = (analysis.Content1.getAsciiCode().getBytes("ASCII"))[0];            // 杞厓浠剁被鍨�
+            _PLCCommand[31] = (analysis.Content1.getAsciiCode().getBytes("ASCII"))[1];
+            _PLCCommand[32] = MelsecHelper.BuildBytesFromAddress(analysis.Content2, analysis.Content1)[0];                   // 璧峰鍦板潃鐨勫湴浣�
+            _PLCCommand[33] = MelsecHelper.BuildBytesFromAddress(analysis.Content2, analysis.Content1)[1];
+            _PLCCommand[34] = MelsecHelper.BuildBytesFromAddress(analysis.Content2, analysis.Content1)[2];
+            _PLCCommand[35] = MelsecHelper.BuildBytesFromAddress(analysis.Content2, analysis.Content1)[3];
+            _PLCCommand[36] = MelsecHelper.BuildBytesFromAddress(analysis.Content2, analysis.Content1)[4];
+            _PLCCommand[37] = MelsecHelper.BuildBytesFromAddress(analysis.Content2, analysis.Content1)[5];
+            _PLCCommand[38] = MelsecHelper.BuildBytesFromData(length)[0];                                                      // 杞厓浠剁偣鏁�
+            _PLCCommand[39] = MelsecHelper.BuildBytesFromData(length)[1];
+            _PLCCommand[40] = MelsecHelper.BuildBytesFromData(length)[2];
+            _PLCCommand[41] = MelsecHelper.BuildBytesFromData(length)[3];
+
+            return OperateResultExOne.CreateSuccessResult( _PLCCommand );
+        }
+        catch (Exception ex){
+            return new OperateResultExOne<byte[]>(ex.getMessage());
+        }
+    }
+
+
+    /**
+     * 鏍规嵁绫诲瀷鍦板潃浠ュ強闇�瑕佸啓鍏ョ殑鏁版嵁鏉ョ敓鎴愭寚浠ゅご
+     * @param address 璧峰鍦板潃
+     * @param value 瀹為檯鐨勬暟鎹�
+     * @return 鍛戒护鏁版嵁
+     */
+    public static OperateResultExOne<byte[]> BuildWriteCommand(String address, byte[] value, byte networkNumber, byte networkStationNumber) {
+        OperateResultExTwo<MelsecMcDataType, Short> analysis = MelsecHelper.McAnalysisAddress(address);
+        if (!analysis.IsSuccess) return OperateResultExOne.CreateFailedResult(analysis);
+
+        // 棰勫鐞嗘寚浠�
+        if (analysis.Content1.getDataType() == 0x01)
+        {
+            // 浣嶅啓鍏�
+            byte[] buffer = new byte[value.length];
+            for(int i=0;i<buffer.length;i++){
+                buffer[i] = value[i] == 0x00? (byte)0x30 : (byte)0x31;
+            }
+            value = buffer;
+        }
+        else
+        {
+            // 瀛楀啓鍏�
+            byte[] buffer = new byte[value.length * 2];
+            for (int i = 0; i < value.length / 2; i++)
+            {
+                byte[] tmp = MelsecHelper.BuildBytesFromData( Utilities.getShort( value, i * 2 ) );
+                System.arraycopy(tmp,0,buffer,4*i,4);
+            }
+            value = buffer;
+        }
+
+        byte[] _PLCCommand = new byte[42 + value.length];
+
+        try {
+            _PLCCommand[0] = 0x35;                                      // 鍓爣棰�
+            _PLCCommand[1] = 0x30;
+            _PLCCommand[2] = 0x30;
+            _PLCCommand[3] = 0x30;
+            _PLCCommand[4] = MelsecHelper.BuildBytesFromData(networkNumber)[0];                // 缃戠粶鍙�
+            _PLCCommand[5] = MelsecHelper.BuildBytesFromData(networkNumber)[1];
+            _PLCCommand[6] = 0x46;                         // PLC缂栧彿
+            _PLCCommand[7] = 0x46;
+            _PLCCommand[8] = 0x30;                         // 鐩爣妯″潡IO缂栧彿
+            _PLCCommand[9] = 0x33;
+            _PLCCommand[10] = 0x46;
+            _PLCCommand[11] = 0x46;
+            _PLCCommand[12] = MelsecHelper.BuildBytesFromData(networkStationNumber)[0];         // 鐩爣妯″潡绔欏彿
+            _PLCCommand[13] = MelsecHelper.BuildBytesFromData(networkStationNumber)[1];
+            _PLCCommand[14] = MelsecHelper.BuildBytesFromData((_PLCCommand.length - 18))[0]; // 璇锋眰鏁版嵁闀垮害
+            _PLCCommand[15] = MelsecHelper.BuildBytesFromData((_PLCCommand.length - 18))[1];
+            _PLCCommand[16] = MelsecHelper.BuildBytesFromData((_PLCCommand.length - 18))[2];
+            _PLCCommand[17] = MelsecHelper.BuildBytesFromData((_PLCCommand.length - 18))[3];
+            _PLCCommand[18] = 0x30; // CPU鐩戣瀹氭椂鍣�
+            _PLCCommand[19] = 0x30;
+            _PLCCommand[20] = 0x31;
+            _PLCCommand[21] = 0x30;
+            _PLCCommand[22] = 0x31; // 鎵归噺鍐欏叆鐨勫懡浠�
+            _PLCCommand[23] = 0x34;
+            _PLCCommand[24] = 0x30;
+            _PLCCommand[25] = 0x31;
+            _PLCCommand[26] = 0x30; // 瀛愬懡浠�
+            _PLCCommand[27] = 0x30;
+            _PLCCommand[28] = 0x30;
+            _PLCCommand[29] = analysis.Content1.getDataType() == 0 ? (byte) 0x30 : (byte) 0x31;
+            _PLCCommand[30] = (analysis.Content1.getAsciiCode().getBytes("ASCII"))[0];                          // 杞厓浠剁被鍨�
+            _PLCCommand[31] = (analysis.Content1.getAsciiCode().getBytes("ASCII"))[1];
+            _PLCCommand[32] = MelsecHelper.BuildBytesFromAddress(analysis.Content2, analysis.Content1)[0];                   // 璧峰鍦板潃鐨勫湴浣�
+            _PLCCommand[33] = MelsecHelper.BuildBytesFromAddress(analysis.Content2, analysis.Content1)[1];
+            _PLCCommand[34] = MelsecHelper.BuildBytesFromAddress(analysis.Content2, analysis.Content1)[2];
+            _PLCCommand[35] = MelsecHelper.BuildBytesFromAddress(analysis.Content2, analysis.Content1)[3];
+            _PLCCommand[36] = MelsecHelper.BuildBytesFromAddress(analysis.Content2, analysis.Content1)[4];
+            _PLCCommand[37] = MelsecHelper.BuildBytesFromAddress(analysis.Content2, analysis.Content1)[5];
+
+            // 鍒ゆ柇鏄惁杩涜浣嶆搷浣�
+            if (analysis.Content1.getDataType() == 1) {
+                _PLCCommand[38] = MelsecHelper.BuildBytesFromData( value.length)[0];                                                      // 杞厓浠剁偣鏁�
+                _PLCCommand[39] = MelsecHelper.BuildBytesFromData( value.length)[1];
+                _PLCCommand[40] = MelsecHelper.BuildBytesFromData( value.length)[2];
+                _PLCCommand[41] = MelsecHelper.BuildBytesFromData( value.length)[3];
+            } else {
+                _PLCCommand[38] = MelsecHelper.BuildBytesFromData( (value.length / 4))[0];                                                      // 杞厓浠剁偣鏁�
+                _PLCCommand[39] = MelsecHelper.BuildBytesFromData( (value.length / 4))[1];
+                _PLCCommand[40] = MelsecHelper.BuildBytesFromData( (value.length / 4))[2];
+                _PLCCommand[41] = MelsecHelper.BuildBytesFromData( (value.length / 4))[3];
+            }
+            System.arraycopy(value,0,_PLCCommand,42,value.length);
+
+            return OperateResultExOne.CreateSuccessResult(_PLCCommand);
+
+        }
+        catch (Exception ex){
+            return new OperateResultExOne<>(ex.getMessage());
+        }
+    }
+
+
+    /**
+     * 浠嶱LC鍙嶉鐨勬暟鎹腑鎻愬彇鍑哄疄闄呯殑鏁版嵁鍐呭锛岄渶瑕佷紶鍏ュ弽棣堟暟鎹紝鏄惁浣嶈鍙�
+     * @param response 鍙嶉鐨勬暟鎹唴瀹�
+     * @param isBit 鏄惁浣嶈鍙�
+     * @return 瑙f瀽鍚庣殑缁撴灉瀵硅薄
+     */
+    public static OperateResultExOne<byte[]> ExtractActualData( byte[] response, boolean isBit )
+    {
+        if (isBit)
+        {
+            // 浣嶈鍙�
+            byte[] Content = new byte[response.length - 22];
+            for (int i = 22; i < response.length; i++)
+            {
+                if (response[i] == 0x30)
+                {
+                    Content[i - 22] = 0x00;
+                }
+                else
+                {
+                    Content[i - 22] = 0x01;
+                }
+            }
+
+            return OperateResultExOne.CreateSuccessResult( Content );
+        }
+        else
+        {
+            // 瀛楄鍙�
+            byte[] Content = new byte[(response.length - 22) / 2];
+            for (int i = 0; i < Content.length / 2; i++)
+            {
+                int tmp = Integer.parseInt( Utilities.getString( response, i * 4 + 22, 4 ,"ASCII"), 16 );
+                byte[] buffer = Utilities.getBytes(tmp);
+
+                Content[i*2+0] = buffer[0];
+                Content[i*2+1] = buffer[1];
+            }
+
+            return OperateResultExOne.CreateSuccessResult( Content );
+        }
+    }
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecMcDataType.java b/src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecMcDataType.java
new file mode 100644
index 0000000..2ac9578
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecMcDataType.java
@@ -0,0 +1,122 @@
+package com.zy.common.HslCommunication.Profinet.Melsec;
+
+
+/**
+ * 涓夎彵鐨勬暟鎹被鍨�
+ */
+public class MelsecMcDataType {
+
+
+    /**
+     * 濡傛灉鎮ㄦ竻妤氱被鍨嬩唬鍙凤紝鍙互鏍规嵁鍊艰繘琛屾墿灞�
+     * @param code 鏁版嵁绫诲瀷鐨勪唬鍙�
+     * @param type 0鎴�1锛岄粯璁や负0
+     * @param asciiCode ASCII鏍煎紡鐨勭被鍨嬩俊鎭�
+     * @param fromBase 鎸囩ず鍦板潃鐨勫灏戣繘鍒剁殑锛�10鎴栨槸16
+     */
+    public MelsecMcDataType( byte code, byte type, String asciiCode, int fromBase )
+    {
+        DataCode = code;
+        AsciiCode = asciiCode;
+        FromBase = fromBase;
+        if (type < 2) DataType = type;
+    }
+
+
+
+    private byte DataCode = 0x00;                   // 绫诲瀷浠e彿
+    private byte DataType = 0x00;                   // 鏁版嵁绫诲瀷
+    private String AsciiCode = "";                  // ascii鏍煎紡閫氫俊鐨勫瓧绗�
+    private int FromBase = 0;                       // 绫诲瀷
+
+
+    /**
+     * 鏁版嵁鐨勭被鍨嬩唬鍙�
+     * @return
+     */
+    public byte getDataCode() {
+        return DataCode;
+    }
+
+    /**
+     * 瀛楄闂繕鏄綅璁块棶锛�0琛ㄧず瀛楋紝1琛ㄧず浣�
+     * @return
+     */
+    public byte getDataType() {
+        return DataType;
+    }
+
+    /**
+     * 褰撲互ASCII鏍煎紡閫氳鏃剁殑绫诲瀷鎻忚堪
+     * @return
+     */
+    public String getAsciiCode() {
+        return AsciiCode;
+    }
+
+    /**
+     * 鎸囩ず鍦板潃鏄�10杩涘埗锛岃繕鏄�16杩涘埗鐨�
+     * @return
+     */
+    public int getFromBase() {
+        return FromBase;
+    }
+
+
+    /**
+     * X杈撳叆瀵勫瓨鍣�
+     */
+    public final static MelsecMcDataType X = new MelsecMcDataType( (byte) (0x9C), (byte) (0x01), "X*", 16 );
+    /**
+     * Y杈撳嚭瀵勫瓨鍣�
+     */
+    public final static MelsecMcDataType Y = new MelsecMcDataType( (byte) (0x9D), (byte) (0x01), "Y*", 16 );
+    /**
+     * M涓棿瀵勫瓨鍣�
+     */
+    public final static MelsecMcDataType M = new MelsecMcDataType( (byte) (0x90), (byte) (0x01), "M*", 10 );
+    /**
+     * D鏁版嵁瀵勫瓨鍣�
+     */
+    public final static MelsecMcDataType D = new MelsecMcDataType( (byte) (0xA8), (byte) (0x00), "D*", 10 );
+    /**
+     * W閾炬帴瀵勫瓨鍣�
+     */
+    public final static MelsecMcDataType W = new MelsecMcDataType( (byte) (0xB4), (byte) (0x00), "W*", 16 );
+    /**
+     * L閿佸瓨缁х數鍣�
+     */
+    public final static MelsecMcDataType L = new MelsecMcDataType( (byte) (0x92), (byte) (0x01), "L*", 10 );
+    /**
+     * F鎶ヨ鍣�
+     */
+    public final static MelsecMcDataType F = new MelsecMcDataType( (byte) (0x93), (byte) (0x01), "F*", 10 );
+    /**
+     * V杈规部缁х數鍣�
+     */
+    public final static MelsecMcDataType V = new MelsecMcDataType( (byte) (0x94), (byte) (0x01), "V*", 10 );
+    /**
+     * B閾炬帴缁х數鍣�
+     */
+    public final static MelsecMcDataType B = new MelsecMcDataType( (byte) (0xA0), (byte) (0x01), "B*", 16 );
+    /**
+     * R鏂囦欢瀵勫瓨鍣�
+     */
+    public final static MelsecMcDataType R = new MelsecMcDataType( (byte) (0xAF), (byte) (0x00), "R*", 10 );
+    /**
+     * S姝ヨ繘缁х數鍣�
+     */
+    public final static MelsecMcDataType S = new MelsecMcDataType( (byte) (0x98), (byte) (0x01), "S*", 10 );
+    /**
+     * 鍙樺潃瀵勫瓨鍣�
+     */
+    public final static MelsecMcDataType Z = new MelsecMcDataType( (byte) (0xCC), (byte) (0x00), "Z*", 10 );
+    /**
+     * 瀹氭椂鍣ㄧ殑鍊�
+     */
+    public final static MelsecMcDataType T = new MelsecMcDataType( (byte) (0xC2), (byte) (0x00), "TN", 10 );
+    /**
+     * 璁℃暟鍣ㄧ殑鍊�
+     */
+    public final static MelsecMcDataType C = new MelsecMcDataType( (byte) (0xC5), (byte) (0x00), "CN", 10 );
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecMcNet.java b/src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecMcNet.java
new file mode 100644
index 0000000..baad50e
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Profinet/Melsec/MelsecMcNet.java
@@ -0,0 +1,378 @@
+package com.zy.common.HslCommunication.Profinet.Melsec;
+
+import com.zy.common.HslCommunication.Core.IMessage.MelsecQnA3EBinaryMessage;
+import com.zy.common.HslCommunication.Core.Net.NetworkBase.NetworkDeviceBase;
+import com.zy.common.HslCommunication.Core.Transfer.RegularByteTransform;
+import com.zy.common.HslCommunication.Core.Types.OperateResult;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExOne;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExTwo;
+import com.zy.common.HslCommunication.StringResources;
+import com.zy.common.HslCommunication.Utilities;
+
+/**
+ * 涓夎彵鐨勫疄闄呮暟鎹氦浜掔被
+ */
+public class MelsecMcNet extends NetworkDeviceBase<MelsecQnA3EBinaryMessage,RegularByteTransform> {
+
+
+    /**
+     * 瀹炰緥鍖栦笁鑿辩殑Qna鍏煎3E甯у崗璁殑閫氳瀵硅薄
+     */
+    public MelsecMcNet() {
+        WordLength = 1;
+    }
+
+
+    /**
+     * 瀹炰緥鍖栦竴涓笁鑿辩殑Qna鍏煎3E甯у崗璁殑閫氳瀵硅薄
+     *
+     * @param ipAddress PLCd鐨処p鍦板潃
+     * @param port      PLC鐨勭鍙�
+     */
+    public MelsecMcNet(String ipAddress, int port) {
+        WordLength = 1;
+        super.setIpAddress(ipAddress);
+        super.setPort(port);
+    }
+
+
+    private byte NetworkNumber = 0x00;                       // 缃戠粶鍙�
+    private byte NetworkStationNumber = 0x00;                // 缃戠粶绔欏彿
+
+    /**
+     * 鑾峰彇缃戠粶鍙�
+     *
+     * @return 缃戠粶鍙�
+     */
+    public byte getNetworkNumber() {
+        return NetworkNumber;
+    }
+
+    /**
+     * 璁剧疆缃戠粶鍙�
+     *
+     * @param networkNumber 缃戠粶鍙�
+     */
+    public void setNetworkNumber(byte networkNumber) {
+        NetworkNumber = networkNumber;
+    }
+
+    /**
+     * 鑾峰彇缃戠粶绔欏彿
+     *
+     * @return 缃戠粶绔欏彿
+     */
+    public byte getNetworkStationNumber() {
+        return NetworkStationNumber;
+    }
+
+    /**
+     * 璁剧疆缃戠粶绔欏彿
+     *
+     * @param networkStationNumber 缃戠粶绔欏彿
+     */
+    public void setNetworkStationNumber(byte networkStationNumber) {
+        NetworkStationNumber = networkStationNumber;
+    }
+
+
+
+    /**
+     * 浠庝笁鑿盤LC涓鍙栨兂瑕佺殑鏁版嵁锛岃繑鍥炶鍙栫粨鏋�
+     * @param address 璇诲彇鍦板潃锛屾牸寮忎负"M100","D100","W1A0"
+     * @param length 璇诲彇鐨勬暟鎹暱搴︼紝瀛楁渶澶у��960锛屼綅鏈�澶у��7168
+     * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
+     */
+    @Override
+    public OperateResultExOne<byte[]> Read(String address, short length) {
+        // 鑾峰彇鎸囦护
+        OperateResultExOne<byte[]> command = BuildReadCommand( address, length, NetworkNumber, NetworkStationNumber );
+        if (!command.IsSuccess) return OperateResultExOne.CreateFailedResult( command );
+
+        // 鏍稿績浜や簰
+        OperateResultExOne<byte[]> read = ReadFromCoreServer( command.Content );
+        if (!read.IsSuccess) return OperateResultExOne.CreateFailedResult( read );
+
+        // 閿欒浠g爜楠岃瘉
+        int errorCode = Utilities.getShort(read.Content, 9);
+        if (errorCode != 0) return new OperateResultExOne<>( errorCode, StringResources.Language.MelsecPleaseReferToManulDocument() );
+
+        // 鏁版嵁瑙f瀽锛岄渶瑕佷紶鍏ユ槸鍚︿娇鐢ㄤ綅鐨勫弬鏁�
+        return ExtractActualData( read.Content, command.Content[13] == 1 );
+    }
+
+
+
+
+    /**
+     * 浠庝笁鑿盤LC涓壒閲忚鍙栦綅杞厓浠讹紝杩斿洖璇诲彇缁撴灉
+     * @param address 璧峰鍦板潃
+     * @param length 璇诲彇鐨勯暱搴�
+     * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
+     */
+    public OperateResultExOne<boolean[]> ReadBool(String address, short length) {
+        // 瑙f瀽鍦板潃
+        OperateResultExTwo<MelsecMcDataType, Short> analysis = MelsecHelper.McAnalysisAddress( address );
+        if (!analysis.IsSuccess) return OperateResultExOne.CreateFailedResult( analysis );
+
+        // 浣嶈鍙栨牎楠�
+        if (analysis.Content1.getDataType() == 0x00) return new OperateResultExOne<boolean[]>( 0, StringResources.Language.MelsecReadBitInfo() );
+
+        // 鏍稿績浜や簰
+        OperateResultExOne<byte[]> read = Read( address, length );
+        if (!read.IsSuccess) return OperateResultExOne.CreateFailedResult( read );
+
+        // 杞寲bool鏁扮粍
+        boolean[] result = new boolean[read.Content.length];
+        for(int i=0;i<result.length;i++){
+            if(read.Content[i] == 0x01) result[i] = true;
+        }
+        return OperateResultExOne.CreateSuccessResult( result );
+    }
+
+
+
+    /**
+     * 浠庝笁鑿盤LC涓壒閲忚鍙栦綅杞厓浠讹紝杩斿洖璇诲彇缁撴灉
+     * @param address 璧峰鍦板潃
+     * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
+     */
+    public OperateResultExOne<Boolean> ReadBool(String address) {
+        OperateResultExOne<boolean[]> read = ReadBool(address, (short) 1);
+        if (!read.IsSuccess) return OperateResultExOne.CreateFailedResult(read);
+
+        return OperateResultExOne.CreateSuccessResult(read.Content[0]);
+    }
+
+
+
+
+
+    /**
+     * 鍚慞LC鍐欏叆鏁版嵁锛屾暟鎹牸寮忎负鍘熷鐨勫瓧鑺傜被鍨�
+     * @param address 璧峰鍦板潃
+     * @param value 鍘熷鏁版嵁
+     * @return 缁撴灉
+     */
+    @Override
+    public OperateResult Write(String address, byte[] value) {
+        // 瑙f瀽鎸囦护
+        OperateResultExOne<byte[]> command = BuildWriteCommand( address, value, NetworkNumber, NetworkStationNumber );
+        if (!command.IsSuccess) return command;
+
+        // 鏍稿績浜や簰
+        OperateResultExOne<byte[]> read = ReadFromCoreServer( command.Content );
+        if (!read.IsSuccess) return read;
+
+        // 閿欒鐮佹牎楠�
+        short ErrorCode = Utilities.getShort(read.Content, 9);
+        if (ErrorCode != 0) return new OperateResultExOne<byte[]>( ErrorCode, StringResources.Language.MelsecPleaseReferToManulDocument() );
+
+        // 鎴愬姛
+        return OperateResult.CreateSuccessResult( );
+    }
+
+
+
+    /**
+     * 鍚慞LC涓綅杞厓浠跺啓鍏ool鏁扮粍锛岃繑鍥炲�艰鏄庯紝姣斿浣犲啓鍏100,values[0]瀵瑰簲M100
+     * @param address 瑕佸啓鍏ョ殑鏁版嵁鍦板潃
+     * @param value 瑕佸啓鍏ョ殑瀹為檯鏁版嵁锛岄暱搴︿负8鐨勫�嶆暟
+     * @return 杩斿洖鍐欏叆缁撴灉
+     */
+    public OperateResult Write(String address, boolean value) {
+        return Write(address, new boolean[]{value});
+    }
+
+
+
+    /**
+     * 鍚慞LC涓綅杞厓浠跺啓鍏ool鏁扮粍锛岃繑鍥炲�艰鏄庯紝姣斿浣犲啓鍏100,values[0]瀵瑰簲M100
+     * @param address 瑕佸啓鍏ョ殑鏁版嵁鍦板潃
+     * @param values 瑕佸啓鍏ョ殑瀹為檯鏁版嵁锛屽彲浠ユ寚瀹氫换鎰忕殑闀垮害
+     * @return 杩斿洖鍐欏叆缁撴灉
+     */
+    public OperateResult Write(String address, boolean[] values) {
+        byte[] buffer = new byte[values.length];
+        for (int i = 0; i < values.length; i++) {
+            buffer[i] = values[i] ? (byte) 0x01 : (byte) 0x00;
+        }
+        return Write(address, buffer);
+    }
+
+
+    /**
+     * 鑾峰彇褰撳墠瀵硅薄鐨勫瓧绗︿覆鏍囪瘑褰㈠紡
+     * @return 瀛楃涓蹭俊鎭�
+     */
+    @Override
+    public String toString() {
+        return "MelsecMcNet";
+    }
+
+
+
+
+
+    /**
+     * 鏍规嵁绫诲瀷鍦板潃闀垮害纭闇�瑕佽鍙栫殑鎸囦护澶�
+     * @param address 璧峰鍦板潃
+     * @param length 闀垮害
+     * @return 甯︽湁鎴愬姛鏍囧織鐨勬寚浠ゆ暟鎹�
+     */
+    public static OperateResultExOne<byte[]> BuildReadCommand(String address, short length) {
+        return BuildReadCommand(address,length,(byte) 0,(byte)0);
+    }
+
+    /**
+     * 鏍规嵁绫诲瀷鍦板潃闀垮害纭闇�瑕佽鍙栫殑鎸囦护澶�
+     * @param address 璧峰鍦板潃
+     * @param length 闀垮害
+     * @param networkNumber 缃戠粶鍙�
+     * @param networkStationNumber 缃戠粶绔欏彿
+     * @return 甯︽湁鎴愬姛鏍囧織鐨勬寚浠ゆ暟鎹�
+     */
+    public static OperateResultExOne<byte[]> BuildReadCommand(String address, short length, byte networkNumber, byte networkStationNumber) {
+        OperateResultExTwo<MelsecMcDataType, Short> analysis = MelsecHelper.McAnalysisAddress(address);
+        if (!analysis.IsSuccess) return OperateResultExOne.CreateFailedResult(analysis);
+
+        byte[] _PLCCommand = new byte[21];
+        _PLCCommand[0] = 0x50;                         // 鍓爣棰�
+        _PLCCommand[1] = 0x00;
+        _PLCCommand[2] = networkNumber;                // 缃戠粶鍙�
+        _PLCCommand[3] = (byte) (0xFF);                         // PLC缂栧彿
+        _PLCCommand[4] = (byte) (0xFF);
+        _PLCCommand[5] = 0x03;
+        _PLCCommand[6] = networkStationNumber;         // 鐩爣妯″潡绔欏彿
+        _PLCCommand[7] = 0x0C;                         // 璇锋眰鏁版嵁闀垮害
+        _PLCCommand[8] = 0x00;
+        _PLCCommand[9] = 0x0A;                         // CPU鐩戣瀹氭椂鍣�
+        _PLCCommand[10] = 0x00;
+        _PLCCommand[11] = 0x01;                        // 鎵归噺璇诲彇鏁版嵁鍛戒护
+        _PLCCommand[12] = 0x04;
+        _PLCCommand[13] = analysis.Content1.getDataType();               // 浠ョ偣涓哄崟浣嶈繕鏄瓧涓哄崟浣嶆垚鎵硅鍙�
+        _PLCCommand[14] = 0x00;
+        _PLCCommand[15] = (byte) (analysis.Content2 % 256);       // 璧峰鍦板潃鐨勫湴浣�
+        _PLCCommand[16] = (byte) (analysis.Content2 / 256);
+        _PLCCommand[17] = 0x00;
+        _PLCCommand[18] = analysis.Content1.getDataCode();               // 鎸囨槑璇诲彇鐨勬暟鎹�
+        _PLCCommand[19] = (byte) (length % 256);        // 杞厓浠堕暱搴︾殑鍦颁綅
+        _PLCCommand[20] = (byte) (length / 256);
+
+        return OperateResultExOne.CreateSuccessResult(_PLCCommand);
+    }
+
+
+
+    /**
+     * 鏍规嵁绫诲瀷鍦板潃浠ュ強闇�瑕佸啓鍏ョ殑鏁版嵁鏉ョ敓鎴愭寚浠ゅご
+     * @param address 璧峰鍦板潃
+     * @param value 鍊�
+     * @return 缁撴灉
+     */
+    public static OperateResultExOne<byte[]> BuildWriteCommand(String address, byte[] value) {
+        return BuildWriteCommand(address,value,(byte)0,(byte)0);
+    }
+
+    /**
+     * 鏍规嵁绫诲瀷鍦板潃浠ュ強闇�瑕佸啓鍏ョ殑鏁版嵁鏉ョ敓鎴愭寚浠ゅご
+     * @param address 璧峰鍦板潃
+     * @param value 鍊�
+     * @param networkNumber 缃戠粶鍙�
+     * @param networkStationNumber 缃戠粶绔欏彿
+     * @return 缁撴灉
+     */
+    public static OperateResultExOne<byte[]> BuildWriteCommand(String address, byte[] value, byte networkNumber, byte networkStationNumber) {
+        OperateResultExTwo<MelsecMcDataType, Short> analysis = MelsecHelper.McAnalysisAddress(address);
+        if (!analysis.IsSuccess) return OperateResultExOne.CreateFailedResult(analysis);
+
+        int length = -1;
+        if (analysis.Content1.getDataType() == 1)
+        {
+            // 鎸夌収浣嶅啓鍏ョ殑鎿嶄綔锛屾暟鎹渶瑕侀噸鏂拌绠�
+            length = value.length;
+            value = MelsecHelper.TransBoolArrayToByteData( value );
+        }
+
+        byte[] _PLCCommand = new byte[21 + value.length];
+        _PLCCommand[0] = 0x50;                                          // 鍓爣棰�
+        _PLCCommand[1] = 0x00;
+        _PLCCommand[2] = networkNumber;                                 // 缃戠粶鍙�
+        _PLCCommand[3] = (byte) (0xFF);                                          // PLC缂栧彿
+        _PLCCommand[4] = (byte) (0xFF);                                          // 鐩爣妯″潡IO缂栧彿
+        _PLCCommand[5] = 0x03;
+        _PLCCommand[6] = networkStationNumber;                          // 鐩爣妯″潡绔欏彿
+
+        _PLCCommand[7] = (byte) ((_PLCCommand.length - 9) % 256);        // 璇锋眰鏁版嵁闀垮害
+        _PLCCommand[8] = (byte) ((_PLCCommand.length - 9) / 256);
+        ;
+        _PLCCommand[9] = 0x0A;                                          // CPU鐩戣瀹氭椂鍣�
+        _PLCCommand[10] = 0x00;
+        _PLCCommand[11] = 0x01;                                         // 鎵归噺璇诲彇鏁版嵁鍛戒护
+        _PLCCommand[12] = 0x14;
+        _PLCCommand[13] = analysis.Content1.getDataType();                   // 浠ョ偣涓哄崟浣嶈繕鏄瓧涓哄崟浣嶆垚鎵硅鍙�
+        _PLCCommand[14] = 0x00;
+        _PLCCommand[15] = (byte) (analysis.Content2 % 256);
+        ;            // 璧峰鍦板潃鐨勫湴浣�
+        _PLCCommand[16] = (byte) (analysis.Content2 / 256);
+        _PLCCommand[17] = 0x00;
+        _PLCCommand[18] = analysis.Content1.getDataCode();                   // 鎸囨槑鍐欏叆鐨勬暟鎹�
+
+        // 鍒ゆ柇鏄惁杩涜浣嶆搷浣�
+        if (analysis.Content1.getDataType() == 1) {
+            if (length > 0) {
+                _PLCCommand[19] = (byte) (length % 256);                 // 杞厓浠堕暱搴︾殑鍦颁綅
+                _PLCCommand[20] = (byte) (length / 256);
+            } else {
+                _PLCCommand[19] = (byte) (value.length * 2 % 256);        // 杞厓浠堕暱搴︾殑鍦颁綅
+                _PLCCommand[20] = (byte) (value.length * 2 / 256);
+            }
+        } else {
+            _PLCCommand[19] = (byte) (value.length / 2 % 256);            // 杞厓浠堕暱搴︾殑鍦颁綅
+            _PLCCommand[20] = (byte) (value.length / 2 / 256);
+        }
+
+        System.arraycopy(value, 0, _PLCCommand, 21, value.length);
+
+        return OperateResultExOne.CreateSuccessResult(_PLCCommand);
+    }
+
+
+    /**
+     * 浠嶱LC鍙嶉鐨勬暟鎹腑鎻愬彇鍑哄疄闄呯殑鏁版嵁鍐呭锛岄渶瑕佷紶鍏ュ弽棣堟暟鎹紝鏄惁浣嶈鍙�
+     * @param response 鍙嶉鐨勬暟鎹唴瀹�
+     * @param isBit 鏄惁浣嶈鍙�
+     * @return 瑙f瀽鍚庣殑缁撴灉瀵硅薄
+     */
+    public static OperateResultExOne<byte[]> ExtractActualData( byte[] response, boolean isBit )
+    {
+        if (isBit)
+        {
+            // 浣嶈鍙�
+            byte[] Content = new byte[(response.length - 11) * 2];
+            for (int i = 11; i < response.length; i++)
+            {
+                if ((response[i] & 0x10) == 0x10)
+                {
+                    Content[(i - 11) * 2 + 0] = 0x01;
+                }
+
+                if ((response[i] & 0x01) == 0x01)
+                {
+                    Content[(i - 11) * 2 + 1] = 0x01;
+                }
+            }
+
+            return OperateResultExOne.CreateSuccessResult( Content );
+        }
+        else
+        {
+            // 瀛楄鍙�
+            byte[] Content = new byte[response.length - 11];
+            System.arraycopy(response,11,Content,0,Content.length);
+
+            return OperateResultExOne.CreateSuccessResult( Content );
+        }
+    }
+
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Profinet/Omron/OmronFinsDataType.java b/src/main/java/com/zy/common/HslCommunication/Profinet/Omron/OmronFinsDataType.java
new file mode 100644
index 0000000..a700693
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Profinet/Omron/OmronFinsDataType.java
@@ -0,0 +1,66 @@
+package com.zy.common.HslCommunication.Profinet.Omron;
+
+/**
+ * 娆у榫欑殑Fins鍗忚鐨勬暟鎹被鍨�
+ */
+public class OmronFinsDataType
+{
+    /**
+     * 瀹炰緥鍖栦竴涓狥ins鐨勬暟鎹被鍨�
+     * @param bitCode 浣嶆搷浣滅殑鎸囦护
+     * @param wordCode 瀛楁搷浣滅殑鎸囦护
+     */
+    public OmronFinsDataType( byte bitCode, byte wordCode )
+    {
+        BitCode = bitCode;
+        WordCode = wordCode;
+
+    }
+
+    /**
+     * 鑾峰彇杩涜浣嶆搷浣滅殑鎸囦护
+     * @return
+     */
+    public byte getBitCode() {
+        return BitCode;
+    }
+
+    /**
+     * 杩涜瀛楁搷浣滅殑鎸囦护
+     * @return
+     */
+    public byte getWordCode() {
+        return WordCode;
+    }
+
+
+    private byte BitCode = 0;
+    private byte WordCode = 0;
+
+
+
+    /**
+     * DM Area
+     */
+    public static final OmronFinsDataType DM = new OmronFinsDataType( (byte) 0x02, (byte) 0x82 );
+
+    /**
+     * CIO Area
+     */
+    public static final OmronFinsDataType CIO = new OmronFinsDataType(  (byte)0x30,  (byte)0xB0 );
+
+    /**
+     * Work Area
+     */
+    public static final OmronFinsDataType WR = new OmronFinsDataType(  (byte)0x31,  (byte)0xB1 );
+
+    /**
+     * Holding Bit Area
+     */
+    public static final OmronFinsDataType HR = new OmronFinsDataType(  (byte)0x32,  (byte)0xB2 );
+
+    /**
+     * Auxiliary Bit Area
+     */
+    public static final OmronFinsDataType AR = new OmronFinsDataType(  (byte)0x33,  (byte)0xB3 );
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Profinet/Omron/OmronFinsNet.java b/src/main/java/com/zy/common/HslCommunication/Profinet/Omron/OmronFinsNet.java
new file mode 100644
index 0000000..486f415
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Profinet/Omron/OmronFinsNet.java
@@ -0,0 +1,529 @@
+package com.zy.common.HslCommunication.Profinet.Omron;
+
+import com.zy.common.HslCommunication.Core.IMessage.FinsMessage;
+import com.zy.common.HslCommunication.Core.Net.NetworkBase.NetworkDeviceBase;
+import com.zy.common.HslCommunication.Core.Transfer.ReverseWordTransform;
+import com.zy.common.HslCommunication.Core.Types.OperateResult;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExOne;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExTwo;
+import com.zy.common.HslCommunication.StringResources;
+import com.zy.common.HslCommunication.Utilities;
+
+import java.net.Socket;
+
+/**
+ * 娆у榫橣ins甯у崗璁�氳绫�
+ */
+public class OmronFinsNet extends NetworkDeviceBase<FinsMessage,ReverseWordTransform> {
+    /**
+     * 瀹炰緥鍖栦竴涓濮嗛緳Fins甯у崗璁殑閫氳瀵硅薄
+     */
+    public OmronFinsNet() {
+        WordLength = 1;
+    }
+
+
+    /**
+     * 瀹炰緥鍖栦竴涓濮嗛緳Fins甯у崗璁殑閫氳瀵硅薄
+     * @param ipAddress PLCd鐨処p鍦板潃
+     * @param port PLC鐨勭鍙�
+     */
+    public OmronFinsNet(String ipAddress, int port) {
+        WordLength = 1;
+        setIpAddress(ipAddress);
+        setPort(port);
+    }
+
+
+    /**
+     * 淇℃伅鎺у埗瀛楁锛岄粯璁�0x80
+     */
+    public byte ICF = (byte) 0x80;
+
+    /**
+     * 绯荤粺浣跨敤鐨勫唴閮ㄤ俊鎭�
+     */
+    public byte RSV = 0x00;
+
+    /**
+     * 缃戠粶灞備俊鎭紝榛樿0x02锛屽鏋滄湁鍏眰娑堟伅锛屽氨璁剧疆涓�0x07
+     */
+    public byte GCT = 0x02;
+
+    /**
+     * PLC鐨勭綉缁滃彿鍦板潃锛岄粯璁�0x00
+     */
+    public byte DNA = 0x00;
+
+
+    /**
+     * PLC鐨勮妭鐐瑰湴鍧�锛岄粯璁�0x13
+     */
+    public byte DA1 = 0x13;
+
+    /**
+     * PLC鐨勫崟鍏冨彿鍦板潃
+     */
+    public byte DA2 = 0x00;
+
+    /**
+     * 涓婁綅鏈虹殑缃戠粶鍙峰湴鍧�
+     */
+    public byte SNA = 0x00;
+
+
+    private byte computerSA1 = 0x0B;
+
+    /**
+     * 涓婁綅鏈虹殑鑺傜偣鍦板潃锛岄粯璁�0x0B
+     *
+     * @return byte鏁版嵁
+     */
+    public byte getSA1() {
+        return computerSA1;
+    }
+
+    /**
+     * 璁剧疆涓婁綅鏈虹殑鑺傜偣鍦板潃锛岄粯璁�0x0B
+     *
+     * @param computerSA1
+     */
+    public void setSA1(byte computerSA1) {
+        this.computerSA1 = computerSA1;
+        handSingle[19] = computerSA1;
+    }
+
+
+    /**
+     * 涓婁綅鏈虹殑鍗曞厓鍙峰湴鍧�
+     */
+    public byte SA2 = 0x00;
+
+    /**
+     * 璁惧鐨勬爣璇嗗彿
+     */
+    public byte SID = 0x00;
+
+
+
+    /**
+     * 灏嗘櫘閫氱殑鎸囦护鎵撳寘鎴愬畬鏁寸殑鎸囦护
+     * @param cmd 鎸囦护
+     * @return 瀛楄妭
+     */
+    private byte[] PackCommand(byte[] cmd) {
+        byte[] buffer = new byte[26 + cmd.length];
+        System.arraycopy(handSingle, 0, buffer, 0, 4);
+
+        byte[] tmp = Utilities.getBytes(buffer.length - 8);
+        Utilities.bytesReverse(tmp);    // 缈昏浆鏁扮粍
+
+        System.arraycopy(tmp, 0, buffer, 4, tmp.length);
+        buffer[11] = 0x02;
+
+        buffer[16] = ICF;
+        buffer[17] = RSV;
+        buffer[18] = GCT;
+        buffer[19] = DNA;
+        buffer[20] = DA1;
+        buffer[21] = DA2;
+        buffer[22] = SNA;
+        buffer[23] = getSA1();
+        buffer[24] = SA2;
+        buffer[25] = SID;
+        System.arraycopy(cmd, 0, buffer, 26, cmd.length);
+
+        return buffer;
+    }
+
+
+
+    /**
+     * 鏍规嵁绫诲瀷鍦板潃闀垮害纭闇�瑕佽鍙栫殑鎸囦护澶�
+     * @param address 璧峰鍦板潃
+     * @param length 闀垮害
+     * @param isBit 鏄惁鏄綅璇诲彇
+     * @return 甯︽湁鎴愬姛鏍囧織鐨勬寚浠ゆ暟鎹�
+     */
+    private OperateResultExOne<byte[]> BuildReadCommand(String address, int length, boolean isBit) {
+        OperateResultExTwo<OmronFinsDataType, byte[]> analysis = AnalysisAddress(address, isBit);
+        if (!analysis.IsSuccess) return OperateResultExOne.<byte[]>CreateFailedResult(analysis);
+
+        byte[] _PLCCommand = new byte[8];
+        _PLCCommand[0] = 0x01;
+        _PLCCommand[1] = 0x01;
+        if (isBit) {
+            _PLCCommand[2] = analysis.Content1.getBitCode();
+        } else {
+            _PLCCommand[2] = analysis.Content1.getWordCode();
+        }
+
+        System.arraycopy(analysis.Content2, 0, _PLCCommand, 3, analysis.Content2.length);
+        _PLCCommand[6] = (byte) (length / 256);
+        _PLCCommand[7] = (byte) (length % 256);
+
+        return OperateResultExOne.CreateSuccessResult( PackCommand( _PLCCommand ) );
+    }
+
+
+    /**
+     *
+     * @param address 鏍规嵁绫诲瀷鍦板潃浠ュ強闇�瑕佸啓鍏ョ殑鏁版嵁鏉ョ敓鎴愭寚浠ゅご
+     * @param value 璧峰鍦板潃
+     * @param isBit 鏄惁鏄綅鎿嶄綔
+     * @return 缁撴灉
+     */
+    private OperateResultExOne<byte[]> BuildWriteCommand(String address, byte[] value, boolean isBit) {
+        OperateResultExTwo<OmronFinsDataType, byte[]> analysis = AnalysisAddress(address, isBit);
+        if (!analysis.IsSuccess) return OperateResultExOne.<byte[]>CreateFailedResult(analysis);
+
+        byte[] _PLCCommand = new byte[8 + value.length];
+        _PLCCommand[0] = 0x01;    // 璇诲彇瀛樺偍鍖烘暟鎹�
+        _PLCCommand[1] = 0x02;
+        if (isBit) {
+            _PLCCommand[2] = analysis.Content1.getBitCode();
+        } else {
+            _PLCCommand[2] = analysis.Content1.getWordCode();
+        }
+
+        System.arraycopy(analysis.Content2, 0, _PLCCommand, 3, analysis.Content2.length);
+
+        if (isBit) {
+            _PLCCommand[6] = (byte) (value.length / 256);
+            _PLCCommand[7] = (byte) (value.length % 256);
+        } else {
+            _PLCCommand[6] = (byte) (value.length / 2 / 256);
+            _PLCCommand[7] = (byte) (value.length / 2 % 256);
+        }
+
+        System.arraycopy(value, 0, _PLCCommand, 8, value.length);
+
+        return OperateResultExOne.CreateSuccessResult( PackCommand( _PLCCommand ) );
+    }
+
+
+    /**
+     * 鍦ㄨ繛鎺ヤ笂娆у榫橮LC鍚庯紝闇�瑕佽繘琛屼竴姝ユ彙鎵嬪崗璁�
+     * @param socket 缃戠粶濂楁帴瀛�
+     * @return 缁撴灉瀵硅薄
+     */
+    @Override
+    protected OperateResult InitializationOnConnect(Socket socket) {
+        // handSingle灏辨槸鎻℃墜淇″彿瀛楄妭
+        OperateResultExTwo<byte[], byte[]> read = ReadFromCoreServerBase(socket, handSingle);
+        if (!read.IsSuccess) return read;
+
+        // 妫�鏌ヨ繑鍥炵殑鐘舵��
+        byte[] buffer = new byte[4];
+        buffer[0] = read.Content2[7];
+        buffer[1] = read.Content2[6];
+        buffer[2] = read.Content2[5];
+        buffer[3] = read.Content2[4];
+        int status = Utilities.getInt(buffer, 0);
+        if (status != 0) return new OperateResult( status, GetStatusDescription( status ) );
+
+        // 鎻愬彇PLC鐨勮妭鐐瑰湴鍧�
+        if (read.Content2.length >= 16) DA1 = read.Content2[15];
+
+        return OperateResult.CreateSuccessResult();
+    }
+
+
+    /**
+     * 浠庢濮嗛緳PLC涓鍙栨兂瑕佺殑鏁版嵁锛岃繑鍥炶鍙栫粨鏋滐紝璇诲彇鍗曚綅涓哄瓧
+     * @param address 璇诲彇鍦板潃锛屾牸寮忎负"D100","C100","W100","H100","A100"
+     * @param length 璇诲彇鐨勬暟鎹暱搴︼紝瀛楁渶澶у��960锛屼綅鏈�澶у��7168
+     * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
+     */
+    @Override
+    public OperateResultExOne<byte[]> Read(String address, short length) {
+        //鑾峰彇鎸囦护
+        OperateResultExOne<byte[]> command = BuildReadCommand(address, length, false);
+        if (!command.IsSuccess) return OperateResultExOne.<byte[]>CreateFailedResult(command);
+
+        // 鏍稿績鏁版嵁浜や簰
+        OperateResultExOne<byte[]> read = ReadFromCoreServer(command.Content);
+        if (!read.IsSuccess) return OperateResultExOne.<byte[]>CreateFailedResult(read);
+
+        // 鏁版嵁鏈夋晥鎬у垎鏋�
+        OperateResultExOne<byte[]> valid = ResponseValidAnalysis(read.Content, true);
+        if (!valid.IsSuccess) return OperateResultExOne.<byte[]>CreateFailedResult(valid);
+
+        // 璇诲彇鍒颁簡姝g‘鐨勬暟鎹�
+        return OperateResultExOne.CreateSuccessResult(valid.Content);
+    }
+
+
+
+    /**
+     * 浠庢濮嗛緳PLC涓壒閲忚鍙栦綅杞厓浠讹紝杩斿洖璇诲彇缁撴灉
+     * @param address 璇诲彇鍦板潃锛屾牸寮忎负"D100","C100","W100","H100","A100"
+     * @param length 璇诲彇鐨勯暱搴�
+     * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
+     */
+    public OperateResultExOne<boolean[]> ReadBool(String address, short length) {
+        //鑾峰彇鎸囦护
+        OperateResultExOne<byte[]> command = BuildReadCommand(address, length, true);
+        if (!command.IsSuccess) return OperateResultExOne.<boolean[]>CreateFailedResult(command);
+
+        // 鏍稿績鏁版嵁浜や簰
+        OperateResultExOne<byte[]> read = ReadFromCoreServer(command.Content);
+        if (!read.IsSuccess) return OperateResultExOne.<boolean[]>CreateFailedResult(read);
+
+        // 鏁版嵁鏈夋晥鎬у垎鏋�
+        OperateResultExOne<byte[]> valid = ResponseValidAnalysis(read.Content, true);
+        if (!valid.IsSuccess) return OperateResultExOne.<boolean[]>CreateFailedResult(valid);
+
+        // 杩斿洖姝g‘鐨勬暟鎹俊鎭�
+        boolean[] buffer = new boolean[valid.Content.length];
+        for (int i = 0; i < valid.Content.length; i++) {
+            buffer[i] = valid.Content[i] != 0x00;
+        }
+        return OperateResultExOne.CreateSuccessResult(buffer);
+    }
+
+
+
+    /**
+     * 浠庢濮嗛緳PLC涓壒閲忚鍙栦綅杞厓浠讹紝杩斿洖璇诲彇缁撴灉
+     * @param address 璇诲彇鍦板潃锛屾牸寮忎负"D100.0","C100.15","W100.7","H100.4","A100.9"
+     * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
+     */
+    public OperateResultExOne<Boolean> ReadBool(String address) {
+        OperateResultExOne<boolean[]> read = ReadBool(address, (short) 1);
+        if (read.IsSuccess) {
+            return OperateResultExOne.CreateSuccessResult(read.Content[0]);
+        } else {
+            return OperateResultExOne.<Boolean>CreateFailedResult(read);
+        }
+    }
+
+    /**
+     * 鍚慞LC鍐欏叆鏁版嵁锛屾暟鎹牸寮忎负鍘熷鐨勫瓧鑺傜被鍨�
+     * @param address 璧峰鍦板潃
+     * @param value 鍘熷鏁版嵁
+     * @return 缁撴灉
+     */
+    @Override
+    public OperateResult Write(String address, byte[] value) {
+        //鑾峰彇鎸囦护
+        OperateResultExOne<byte[]> command = BuildWriteCommand(address, value, false);
+        if (!command.IsSuccess) return command;
+
+        // 鏍稿績鏁版嵁浜や簰
+        OperateResultExOne<byte[]> read = ReadFromCoreServer(command.Content);
+        if (!read.IsSuccess) return read;
+
+        // 鏁版嵁鏈夋晥鎬у垎鏋�
+        OperateResultExOne<byte[]> valid = ResponseValidAnalysis(read.Content, false);
+        if (!valid.IsSuccess) return valid;
+
+        // 鎴愬姛
+        return OperateResult.CreateSuccessResult();
+    }
+
+
+    /**
+     * 鍚慞LC涓綅杞厓浠跺啓鍏ool鏁扮粍锛岃繑鍥炲�艰鏄庯紝姣斿浣犲啓鍏100,values[0]瀵瑰簲D100.0
+     * @param address 瑕佸啓鍏ョ殑鏁版嵁鍦板潃
+     * @param value 瑕佸啓鍏ョ殑瀹為檯鏁版嵁锛岄暱搴︿负8鐨勫�嶆暟
+     * @return 杩斿洖鍐欏叆缁撴灉
+     */
+    public OperateResult Write(String address, boolean value) {
+        return Write(address, new boolean[]{value});
+    }
+
+
+    /**
+     * 鍚慞LC涓綅杞厓浠跺啓鍏ool鏁扮粍锛岃繑鍥炲�艰鏄庯紝姣斿浣犲啓鍏100,values[0]瀵瑰簲D100.0
+     * @param address 瑕佸啓鍏ョ殑鏁版嵁鍦板潃
+     * @param values 瑕佸啓鍏ョ殑瀹為檯鏁版嵁锛屽彲浠ユ寚瀹氫换鎰忕殑闀垮害
+     * @return 杩斿洖鍐欏叆缁撴灉
+     */
+    public OperateResult Write(String address, boolean[] values) {
+        OperateResult result = new OperateResult();
+
+        byte[] buffer = new byte[values.length];
+        for (int i = 0; i < buffer.length; i++) {
+            buffer[i] = values[i] ? (byte) 0x01 : (byte) 0x00;
+        }
+
+        // 鑾峰彇鎸囦护
+        OperateResultExOne<byte[]> command = BuildWriteCommand(address, buffer, true);
+        if (!command.IsSuccess) return command;
+
+        // 鏍稿績鏁版嵁浜や簰
+        OperateResultExOne<byte[]> read = ReadFromCoreServer(command.Content);
+        if (!read.IsSuccess) return read;
+
+        // 鏁版嵁鏈夋晥鎬у垎鏋�
+        OperateResultExOne<byte[]> valid = ResponseValidAnalysis(read.Content, false);
+        if (!valid.IsSuccess) return valid;
+
+        // 鍐欏叆鎴愬姛
+        return OperateResult.CreateSuccessResult();
+    }
+
+
+    // 鎻℃墜淇″彿
+    // 46494E530000000C0000000000000000000000D6
+    private final byte[] handSingle = new byte[]
+            {
+                    0x46, 0x49, 0x4E, 0x53, // FINS
+                    0x00, 0x00, 0x00, 0x0C, // 鍚庨潰鐨勫懡浠ら暱搴�
+                    0x00, 0x00, 0x00, 0x00, // 鍛戒护鐮�
+                    0x00, 0x00, 0x00, 0x00, // 閿欒鐮�
+                    0x00, 0x00, 0x00, 0x01  // 鑺傜偣鍙�
+            };
+
+
+    /**
+     * 杩斿洖琛ㄧず褰撳墠瀵硅薄鐨勫瓧绗︿覆
+     *
+     * @return 瀛楃涓�
+     */
+    @Override
+    public String toString() {
+        return "OmronFinsNet";
+    }
+
+
+
+
+    /**
+     * 瑙f瀽鏁版嵁鍦板潃锛孫mron鎵嬪唽绗�188椤�
+     * @param address 鏁版嵁鍦板潃
+     * @param isBit 鏄惁鏄綅鍦板潃
+     * @return 缁撴灉绫诲璞�
+     */
+    public static OperateResultExTwo<OmronFinsDataType, byte[]> AnalysisAddress(String address, boolean isBit) {
+        OperateResultExTwo<OmronFinsDataType, byte[]> result = new OperateResultExTwo<OmronFinsDataType, byte[]>();
+        try {
+            switch (address.charAt(0)) {
+                case 'D':
+                case 'd': {
+                    // DM鍖烘暟鎹�
+                    result.Content1 = OmronFinsDataType.DM;
+                    break;
+                }
+                case 'C':
+                case 'c': {
+                    // CIO鍖烘暟鎹�
+                    result.Content1 = OmronFinsDataType.CIO;
+                    break;
+                }
+                case 'W':
+                case 'w': {
+                    // WR鍖�
+                    result.Content1 = OmronFinsDataType.WR;
+                    break;
+                }
+                case 'H':
+                case 'h': {
+                    // HR鍖�
+                    result.Content1 = OmronFinsDataType.HR;
+                    break;
+                }
+                case 'A':
+                case 'a': {
+                    // AR鍖�
+                    result.Content1 = OmronFinsDataType.AR;
+                    break;
+                }
+                default:
+                    throw new Exception(StringResources.Language.NotSupportedDataType());
+            }
+
+            if (isBit) {
+                // 浣嶆搷浣�
+                String[] splits = address.substring(1).split("\\.");
+                int addr = Integer.parseInt(splits[0]);
+                result.Content2 = new byte[3];
+                result.Content2[0] = Utilities.getBytes(addr)[1];
+                result.Content2[1] = Utilities.getBytes(addr)[0];
+
+                if (splits.length > 1) {
+                    result.Content2[2] = Byte.parseByte(splits[1]);
+                    if (result.Content2[2] > 15) {
+                        throw new Exception(StringResources.Language.OmronAddressMustBeZeroToFiveteen());
+                    }
+                }
+            } else {
+                // 瀛楁搷浣�
+                int addr = Integer.parseInt(address.substring(1));
+                result.Content2 = new byte[3];
+                result.Content2[0] = Utilities.getBytes(addr)[1];
+                result.Content2[1] = Utilities.getBytes(addr)[0];
+            }
+        } catch (Exception ex) {
+            result.Message = ex.getMessage();
+            return result;
+        }
+
+        result.IsSuccess = true;
+        return result;
+    }
+
+    /**
+     * 瀵逛簬PLC鐨勫弽棣堟暟鎹紝杩涜楠岃瘉
+     * @param response PLC鍙嶉鏁版嵁
+     * @param isRead 鏄惁澶勪簬璇诲彇鐘舵��
+     * @return 鎴愬姛鐨勬暟鎹粨鏋�
+     */
+    public static OperateResultExOne<byte[]> ResponseValidAnalysis(byte[] response, boolean isRead) {
+        // 鏁版嵁鏈夋晥鎬у垎鏋�
+        if (response.length >= 16) {
+            // 鎻愬彇閿欒鐮�
+            byte[] buffer = new byte[4];
+            buffer[0] = response[15];
+            buffer[1] = response[14];
+            buffer[2] = response[13];
+            buffer[3] = response[12];
+
+            int err = Utilities.getInt(buffer, 0);
+            if (err > 0) return new OperateResultExOne<byte[]>(err, GetStatusDescription(err));
+
+            if (response.length >= 30) {
+                err = response[28] * 256 + response[29];
+                if (err > 0)  return new OperateResultExOne<byte[]>(err,StringResources.Language.OmronReceiveDataError());
+
+                if (!isRead) {
+                    // 鍐欏叆鎿嶄綔
+                    return OperateResultExOne.CreateSuccessResult(new byte[0]);
+                } else {
+                    // 璇诲彇鎿嶄綔
+                    byte[] content = new byte[response.length - 30];
+                    if (content.length > 0) {
+                        System.arraycopy(response, 30, content, 0, content.length);
+                    }
+                    return OperateResultExOne.CreateSuccessResult(content);
+                }
+            }
+        }
+
+        return new OperateResultExOne<byte[]>( StringResources.Language.OmronReceiveDataError() );
+    }
+
+    /**
+     * 鑾峰彇閿欒淇℃伅鐨勫瓧绗︿覆鎻忚堪鏂囨湰
+     * @param err 閿欒鐮�
+     * @return 鏂囨湰鎻忚堪
+     */
+    public static String GetStatusDescription( int err )
+    {
+        switch (err)
+        {
+            case 0: return StringResources.Language.OmronStatus0();
+            case 1: return StringResources.Language.OmronStatus1();
+            case 2: return StringResources.Language.OmronStatus2();
+            case 3: return StringResources.Language.OmronStatus3();
+            case 20: return StringResources.Language.OmronStatus20();
+            case 21: return StringResources.Language.OmronStatus21();
+            case 22: return StringResources.Language.OmronStatus22();
+            case 23: return StringResources.Language.OmronStatus23();
+            case 24: return StringResources.Language.OmronStatus24();
+            case 25: return StringResources.Language.OmronStatus25();
+            default: return StringResources.Language.UnknownError();
+        }
+    }
+}
diff --git a/src/main/java/com/zy/common/HslCommunication/Profinet/Siemens/SiemensFetchWriteNet.java b/src/main/java/com/zy/common/HslCommunication/Profinet/Siemens/SiemensFetchWriteNet.java
new file mode 100644
index 0000000..d1c787c
--- /dev/null
+++ b/src/main/java/com/zy/common/HslCommunication/Profinet/Siemens/SiemensFetchWriteNet.java
@@ -0,0 +1,330 @@
+package com.zy.common.HslCommunication.Profinet.Siemens;
+
+import com.zy.common.HslCommunication.BasicFramework.SoftBasic;
+import com.zy.common.HslCommunication.Core.IMessage.FetchWriteMessage;
+import com.zy.common.HslCommunication.Core.Net.NetworkBase.NetworkDeviceBase;
+import com.zy.common.HslCommunication.Core.Transfer.ReverseBytesTransform;
+import com.zy.common.HslCommunication.Core.Types.OperateResult;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExOne;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExThree;
+import com.zy.common.HslCommunication.StringResources;
+
+/**
+ * 浣跨敤浜咶etch/Write鍗忚鏉ュ拰瑗块棬瀛愯繘琛岄�氳锛岃绉嶆柟娉曢渶瑕佸湪PLC渚ц繘琛屼竴浜涢厤缃�
+ */
+public class SiemensFetchWriteNet extends NetworkDeviceBase<FetchWriteMessage, ReverseBytesTransform> {
+
+    /**
+     * 瀹炰緥鍖栦竴涓タ闂ㄥ瓙鐨凢etch/Write鍗忚鐨勯�氳瀵硅薄
+     */
+    public SiemensFetchWriteNet() {
+        WordLength = 2;
+    }
+
+
+    /**
+     * 瀹炰緥鍖栦竴涓タ闂ㄥ瓙鐨凢etch/Write鍗忚鐨勯�氳瀵硅薄
+     *
+     * @param ipAddress PLC鐨処p鍦板潃
+     * @param port      PLC鐨勭鍙�
+     */
+    public SiemensFetchWriteNet(String ipAddress, int port) {
+        WordLength = 2;
+        setIpAddress(ipAddress);
+        setPort(port);
+    }
+
+
+    /**
+     * 浠嶱LC璇诲彇鏁版嵁锛屽湴鍧�鏍煎紡涓篒100锛孮100锛孌B20.100锛孧100锛孴100锛孋100锛屼互瀛楄妭涓哄崟浣�
+     *
+     * @param address 璧峰鍦板潃锛屾牸寮忎负I100锛孧100锛孮100锛孌B20.100锛孴100锛孋100
+     * @param length  璇诲彇鐨勬暟閲忥紝浠ュ瓧鑺備负鍗曚綅
+     * @return 甯︽湁鎴愬姛鏍囧織鐨勫瓧鑺備俊鎭�
+     */
+    @Override
+    public OperateResultExOne<byte[]> Read(String address, short length) {
+        OperateResultExOne<byte[]> result = new OperateResultExOne<byte[]>();
+        OperateResultExOne<byte[]> command = BuildReadCommand(address, length);
+        if (!command.IsSuccess) {
+            result.CopyErrorFromOther(command);
+            return result;
+        }
+
+        OperateResultExOne<byte[]> read = ReadFromCoreServer(command.Content);
+        if (read.IsSuccess) {
+            if (read.Content[8] == 0x00) {
+                // 鍒嗘瀽缁撴灉
+                byte[] buffer = new byte[read.Content.length - 16];
+                System.arraycopy(read.Content, 16, buffer, 0, buffer.length);
+
+                result.Content = buffer;
+                result.IsSuccess = true;
+            } else {
+                result.ErrorCode = read.Content[8];
+                result.Message = "鍙戠敓浜嗗紓甯革紝鍏蜂綋淇℃伅鏌ユ壘Fetch/Write鍗忚鏂囨。";
+            }
+        } else {
+            result.ErrorCode = read.ErrorCode;
+            result.Message = read.Message;
+        }
+
+        return result;
+    }
+
+
+    /**
+     * 璇诲彇鎸囧畾鍦板潃鐨刡yte鏁版嵁
+     *
+     * @param address 璧峰鍦板潃锛屾牸寮忎负I100锛孧100锛孮100锛孌B20.100
+     * @return 杩斿洖鍐欏叆缁撴灉
+     */
+    public OperateResultExOne<Byte> ReadByte(String address) {
+        return GetByteResultFromBytes(Read(address, (short) 1));
+    }
+
+
+    /**
+     * 灏嗘暟鎹啓鍏ュ埌PLC鏁版嵁锛屽湴鍧�鏍煎紡涓篒100锛孮100锛孌B20.100锛孧100锛屼互瀛楄妭涓哄崟浣�
+     *
+     * @param address 璧峰鍦板潃锛屾牸寮忎负I100锛孧100锛孮100锛孌B20.100
+     * @param value   鍐欏叆鐨勬暟鎹紝闀垮害鏍规嵁data鐨勯暱搴︽潵鎸囩ず
+     * @return 杩斿洖鍐欏叆缁撴灉
+     */
+    @Override
+    public OperateResult Write(String address, byte[] value) {
+        OperateResult result = new OperateResult();
+
+        OperateResultExOne<byte[]> command = BuildWriteCommand(address, value);
+        if (!command.IsSuccess) {
+            result.CopyErrorFromOther(command);
+            return result;
+        }
+
+
+        OperateResultExOne<byte[]> write = ReadFromCoreServer(command.Content);
+        if (write.IsSuccess) {
+            if (write.Content[8] != 0x00) {
+                // 鍐欏叆寮傚父
+                result.Message = "鍐欏叆鏁版嵁寮傚父锛屼唬鍙蜂负锛�" + String.valueOf(write.Content[8]);
+            } else {
+                result.IsSuccess = true;  // 鍐欏叆鎴愬姛
+            }
+        } else {
+            result.ErrorCode = write.ErrorCode;
+            result.Message = write.Message;
+        }
+        return result;
+    }
+
+    /**
+     * 鍚慞LC涓啓鍏ool鏁扮粍锛岃繑鍥炲�艰鏄庯紝姣斿浣犲啓鍏100,閭d箞data[0]瀵瑰簲M100.0
+     *
+     * @param address 瑕佸啓鍏ョ殑鏁版嵁鍦板潃
+     * @param values  瑕佸啓鍏ョ殑瀹為檯鏁版嵁锛岄暱搴︿负8鐨勫�嶆暟
+     * @return 杩斿洖鍐欏叆缁撴灉
+     */
+    public OperateResult Write(String address, boolean[] values) {
+        return Write(address, SoftBasic.BoolArrayToByte(values));
+    }
+
+
+    /**
+     * 鍚慞LC涓啓鍏yte鏁版嵁锛岃繑鍥炲�艰鏄�
+     *
+     * @param address 瑕佸啓鍏ョ殑鏁版嵁鍦板潃
+     * @param value   瑕佸啓鍏ョ殑瀹為檯鏁版嵁
+     * @return 杩斿洖鍐欏叆缁撴灉
+     */
+    public OperateResult Write(String address, byte value) {
+        return Write(address, new byte[]{value});
+    }
+
+
+    /**
+     * 杩斿洖琛ㄧず褰撳墠瀵硅薄鐨勫瓧绗︿覆
+     *
+     * @return 瀛楃涓�
+     */
+    @Override
+    public String toString() {
+        return "SiemensFetchWriteNet";
+    }
+
+
+
+
+    /**
+     * 璁$畻鐗规畩鐨勫湴鍧�淇℃伅
+     *
+     * @param address 瀛楃涓蹭俊鎭�
+     * @return 瀹為檯鍊�
+     */
+    public static int CalculateAddressStarted(String address) {
+        if (address.indexOf('.') < 0) {
+            return Integer.parseInt(address);
+        } else {
+            String[] temp = address.split("\\.");
+            return Integer.parseInt(temp[0]);
+        }
+    }
+
+
+    /**
+     * 瑙f瀽鏁版嵁鍦板潃锛岃В鏋愬嚭鍦板潃绫诲瀷锛岃捣濮嬪湴鍧�锛孌B鍧楃殑鍦板潃
+     *
+     * @param address 鏁版嵁鍦板潃
+     * @return 瑙f瀽鍑哄湴鍧�绫诲瀷锛岃捣濮嬪湴鍧�锛孌B鍧楃殑鍦板潃
+     */
+    public static OperateResultExThree<Byte, Integer, Integer> AnalysisAddress(String address) {
+        OperateResultExThree<Byte, Integer, Integer> result = new OperateResultExThree<Byte, Integer, Integer>();
+        try {
+            result.Content3 = 0;
+            if (address.indexOf(0) == 'I') {
+                result.Content1 = 0x03;
+                result.Content2 = CalculateAddressStarted(address.substring(1));
+            } else if (address.indexOf(0) == 'Q') {
+                result.Content1 = 0x04;
+                result.Content2 = CalculateAddressStarted(address.substring(1));
+            } else if (address.indexOf(0) == 'M') {
+                result.Content1 = 0x02;
+                result.Content2 = CalculateAddressStarted(address.substring(1));
+            } else if (address.indexOf(0) == 'D' || address.substring(0, 2).equals("DB")) {
+                result.Content1 = 0x01;
+                String[] adds = address.split("\\.");
+                if (address.indexOf(1) == 'B') {
+                    result.Content3 = Integer.parseInt(adds[0].substring(2));
+                } else {
+                    result.Content3 = Integer.parseInt(adds[0].substring(1));
+                }
+
+                if (result.Content3 > 255) {
+                    result.Message = StringResources.Language.SiemensDBAddressNotAllowedLargerThan255();
+                    return result;
+                }
+
+                result.Content2 = CalculateAddressStarted(address.substring(address.indexOf('.') + 1));
+            } else if (address.indexOf(0) == 'T') {
+                result.Content1 = 0x07;
+                result.Content2 = CalculateAddressStarted(address.substring(1));
+            } else if (address.indexOf(0) == 'C') {
+                result.Content1 = 0x06;
+                result.Content2 = CalculateAddressStarted(address.substring(1));
+            } else {
+                return new OperateResultExThree<Byte, Integer, Integer>(StringResources.Language.NotSupportedDataType());
+            }
+        } catch (Exception ex) {
+            result.Message = ex.getMessage();
+            return result;
+        }
+
+        result.IsSuccess = true;
+        return result;
+    }
+
+
+    /**
+     * 鐢熸垚涓�涓鍙栧瓧鏁版嵁鎸囦护澶寸殑閫氱敤鏂规硶
+     *
+     * @param address 鍦板潃
+     * @param count   闀垮害
+     * @return 甯︾粨鏋滄爣璇嗙殑鎸囦护
+     */
+    public static OperateResultExOne<byte[]> BuildReadCommand(String address, int count) {
+        OperateResultExThree<Byte, Integer, Integer> analysis = AnalysisAddress(address);
+        if (!analysis.IsSuccess) return  OperateResultExOne.<byte[]>CreateFailedResult(analysis);
+
+        byte[] _PLCCommand = new byte[16];
+        _PLCCommand[0] = 0x53;
+        _PLCCommand[1] = 0x35;
+        _PLCCommand[2] = 0x10;
+        _PLCCommand[3] = 0x01;
+        _PLCCommand[4] = 0x03;
+        _PLCCommand[5] = 0x05;
+        _PLCCommand[6] = 0x03;
+        _PLCCommand[7] = 0x08;
+
+        // 鎸囧畾鏁版嵁鍖�
+        _PLCCommand[8] = analysis.Content1;
+        _PLCCommand[9] = analysis.Content3.byteValue();
+
+        // 鎸囧畾鏁版嵁鍦板潃
+        _PLCCommand[10] = (byte) (analysis.Content2 / 256);
+        _PLCCommand[11] = (byte) (analysis.Content2 % 256);
+
+        if (analysis.Content1 == 0x01 || analysis.Content1 == 0x06 || analysis.Content1 == 0x07) {
+            if (count % 2 != 0) {
+                return new OperateResultExOne<byte[]>(StringResources.Language.SiemensReadLengthMustBeEvenNumber());
+            } else {
+                // 鎸囧畾鏁版嵁闀垮害
+                _PLCCommand[12] = (byte) (count / 2 / 256);
+                _PLCCommand[13] = (byte) (count / 2 % 256);
+            }
+        } else {
+            // 鎸囧畾鏁版嵁闀垮害
+            _PLCCommand[12] = (byte) (count / 256);
+            _PLCCommand[13] = (byte) (count % 256);
+        }
+
+        _PLCCommand[14] = (byte) 0xff;
+        _PLCCommand[15] = 0x02;
+
+        return OperateResultExOne.CreateSuccessResult(_PLCCommand);
+    }
+
+
+    /**
+     * 鐢熸垚涓�涓啓鍏ュ瓧鑺傛暟鎹殑鎸囦护
+     *
+     * @param address 鍦板潃
+     * @param data    鏁版嵁
+     * @return 甯︾粨鏋滄爣璇嗙殑鎸囦护
+     */
+    public static OperateResultExOne<byte[]> BuildWriteCommand(String address, byte[] data) {
+        if (data == null) data = new byte[0];
+        OperateResultExThree<Byte, Integer, Integer> analysis = AnalysisAddress(address);
+        if (!analysis.IsSuccess) return OperateResultExOne.<byte[]>CreateFailedResult(analysis);
+
+
+        byte[] _PLCCommand = new byte[16 + data.length];
+        _PLCCommand[0] = 0x53;
+        _PLCCommand[1] = 0x35;
+        _PLCCommand[2] = 0x10;
+        _PLCCommand[3] = 0x01;
+        _PLCCommand[4] = 0x03;
+        _PLCCommand[5] = 0x03;
+        _PLCCommand[6] = 0x03;
+        _PLCCommand[7] = 0x08;
+
+        // 鎸囧畾鏁版嵁鍖�
+        _PLCCommand[8] = analysis.Content1;
+        _PLCCommand[9] = analysis.Content3.byteValue();
+
+        // 鎸囧畾鏁版嵁鍦板潃
+        _PLCCommand[10] = (byte) (analysis.Content2 / 256);
+        _PLCCommand[11] = (byte) (analysis.Content2 % 256);
+
+        if (analysis.Content1 == 0x01 || analysis.Content1 == 0x06 || analysis.Content1 == 0x07) {
+            if (data.length % 2 != 0) {
+                return new OperateResultExOne<byte[]>(StringResources.Language.SiemensReadLengthMustBeEvenNumber());
+            } else {
+                // 鎸囧畾鏁版嵁闀垮害
+                _PLCCommand[12] = (byte) (data.length / 2 / 256);
+                _PLCCommand[13] = (byte) (data.length / 2 % 256);
+            }
+        } else {
+            // 鎸囧畾鏁版嵁闀垮害
+            _PLCCommand[12] = (byte) (data.length / 256);
+            _PLCCommand[13] = (byte) (data.length % 256);
+        }
+
+        _PLCCommand[14] = (byte) 0xff;
+        _PLCCommand[15] = 0x02;
+
+        // 鏀剧疆鏁版嵁
+        System.arraycopy(data, 0, _PLCCommand, 16, data.length);
+
+        return OperateResultExOne.<byte[]>CreateSuccessResult(_PLCCommand);
+    }
+
+}
diff --git a/src/main/java/com/zy/gateway/core/domain/siemens/SiemensPLCS.java b/src/main/java/com/zy/common/HslCommunication/Profinet/Siemens/SiemensPLCS.java
similarity index 83%
rename from src/main/java/com/zy/gateway/core/domain/siemens/SiemensPLCS.java
rename to src/main/java/com/zy/common/HslCommunication/Profinet/Siemens/SiemensPLCS.java
index 6d8a759..0956dfb 100644
--- a/src/main/java/com/zy/gateway/core/domain/siemens/SiemensPLCS.java
+++ b/src/main/java/com/zy/common/HslCommunication/Profinet/Siemens/SiemensPLCS.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.domain.siemens;
+package com.zy.common.HslCommunication.Profinet.Siemens;
 
 /**
  * 瑗块棬瀛愮殑PLC绫诲瀷锛岀洰鍓嶆敮鎸佺殑璁块棶绫诲瀷
diff --git a/src/main/java/com/zy/gateway/core/net/siemens/SiemensS7Net.java b/src/main/java/com/zy/common/HslCommunication/Profinet/Siemens/SiemensS7Net.java
similarity index 97%
rename from src/main/java/com/zy/gateway/core/net/siemens/SiemensS7Net.java
rename to src/main/java/com/zy/common/HslCommunication/Profinet/Siemens/SiemensS7Net.java
index ed1e73a..0ec720e 100644
--- a/src/main/java/com/zy/gateway/core/net/siemens/SiemensS7Net.java
+++ b/src/main/java/com/zy/common/HslCommunication/Profinet/Siemens/SiemensS7Net.java
@@ -1,16 +1,15 @@
-package com.zy.gateway.core.net.siemens;
+package com.zy.common.HslCommunication.Profinet.Siemens;
 
-import com.zy.gateway.core.StringResources;
-import com.zy.gateway.core.base.SoftBasic;
-import com.zy.gateway.core.domain.OperateResult;
-import com.zy.gateway.core.domain.OperateResultExOne;
-import com.zy.gateway.core.domain.OperateResultExThree;
-import com.zy.gateway.core.domain.OperateResultExTwo;
-import com.zy.gateway.core.domain.siemens.S7Message;
-import com.zy.gateway.core.domain.siemens.SiemensPLCS;
-import com.zy.gateway.core.net.NetworkDeviceBase;
-import com.zy.gateway.core.transfer.ReverseBytesTransform;
-import com.zy.gateway.core.utils.Utilities;
+import com.zy.common.HslCommunication.BasicFramework.SoftBasic;
+import com.zy.common.HslCommunication.Core.IMessage.S7Message;
+import com.zy.common.HslCommunication.Core.Net.NetworkBase.NetworkDeviceBase;
+import com.zy.common.HslCommunication.Core.Transfer.ReverseBytesTransform;
+import com.zy.common.HslCommunication.Core.Types.OperateResult;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExOne;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExThree;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExTwo;
+import com.zy.common.HslCommunication.StringResources;
+import com.zy.common.HslCommunication.Utilities;
 
 import java.io.ByteArrayOutputStream;
 import java.net.Socket;
@@ -195,7 +194,7 @@
             return OperateResultExOne.CreateSuccessResult(buffer);
         }
         else {
-            return new OperateResultExOne<byte[]>(read.ErrorCode, StringResources.Language.SiemensDataLengthCheckFailed());
+            return new OperateResultExOne<byte[]>(read.ErrorCode,StringResources.Language.SiemensDataLengthCheckFailed());
         }
     }
 
diff --git a/src/main/java/com/zy/gateway/core/utils/Utilities.java b/src/main/java/com/zy/common/HslCommunication/Utilities.java
similarity index 99%
rename from src/main/java/com/zy/gateway/core/utils/Utilities.java
rename to src/main/java/com/zy/common/HslCommunication/Utilities.java
index c001703..a811842 100644
--- a/src/main/java/com/zy/gateway/core/utils/Utilities.java
+++ b/src/main/java/com/zy/common/HslCommunication/Utilities.java
@@ -1,4 +1,4 @@
-package com.zy.gateway.core.utils;
+package com.zy.common.HslCommunication;
 
 
 import java.io.ByteArrayOutputStream;
diff --git a/src/main/java/com/zy/common/Main.java b/src/main/java/com/zy/common/Main.java
new file mode 100644
index 0000000..ab86c2f
--- /dev/null
+++ b/src/main/java/com/zy/common/Main.java
@@ -0,0 +1,376 @@
+package com.zy.common;
+
+import com.zy.common.HslCommunication.Core.Net.NetHandle;
+import com.zy.common.HslCommunication.Core.Transfer.DataFormat;
+import com.zy.common.HslCommunication.Core.Types.ActionOperateExThree;
+import com.zy.common.HslCommunication.Core.Types.ActionOperateExTwo;
+import com.zy.common.HslCommunication.Core.Types.OperateResult;
+import com.zy.common.HslCommunication.Core.Types.OperateResultExOne;
+import com.zy.common.HslCommunication.Enthernet.ComplexNet.NetComplexClient;
+import com.zy.common.HslCommunication.Enthernet.PushNet.NetPushClient;
+import com.zy.common.HslCommunication.Enthernet.SimplifyNet.NetSimplifyClient;
+import com.zy.common.HslCommunication.ModBus.ModbusTcpNet;
+import com.zy.common.HslCommunication.Profinet.Melsec.MelsecA1ENet;
+import com.zy.common.HslCommunication.Profinet.Melsec.MelsecMcAsciiNet;
+import com.zy.common.HslCommunication.Profinet.Melsec.MelsecMcNet;
+import com.zy.common.HslCommunication.Profinet.Siemens.SiemensPLCS;
+import com.zy.common.HslCommunication.Profinet.Siemens.SiemensS7Net;
+
+import java.util.Arrays;
+
+public class Main {
+
+    public static void main(String[] args) throws InterruptedException {
+        SiemesTest();
+        try {
+            //Constructor[] aa = Integer.class.getDeclaredConstructors();
+            //int i = (Integer) (aa[1].newInstance("1"));
+            //System.out.println(Utilities.bytes2HexString( Utilities.getBytes(String.format("%04x",100),"ASCII")));
+            //System.out.println(i);
+
+            //System.out.println(Arrays.toString("123".split("\\." )));
+            //ModbusTcpTets();
+            //MelsecMcNet melsec_net = new MelsecMcNet("192.168.8.12", 6001);
+            //System.out.println(melsec_net.ReadInt16("D100").Content);
+
+            SiemensS7Net siemensS7Net = new SiemensS7Net(SiemensPLCS.S1200,"192.168.8.12");
+            OperateResult write = siemensS7Net.Write("M200",(short)200);
+
+            if(!write.IsSuccess){
+                System.out.println("Write failed:"+write.Message);
+            }
+
+            OperateResultExOne<Short> read = siemensS7Net.ReadInt16("M200");
+            if(read.IsSuccess){
+                System.out.println("Value:"+read.Content.toString());
+            }
+            else {
+                System.out.println("Read failed:"+read.Message);
+            }
+        }
+        catch (Exception ex){
+            System.out.println(ex.getMessage());
+        }
+        Thread.sleep(1000);
+    }
+
+
+    /**
+     * 绠�鍗曠綉缁滃鎴风
+     */
+    public static void NetSimplifyClientTest() {
+        NetSimplifyClient client = new NetSimplifyClient("127.0.0.1", 12345);
+        OperateResultExOne<String> read = client.ReadFromServer(new NetHandle(2), "娴嬭瘯鏁版嵁");
+        if (read.IsSuccess) {
+            System.out.println(read.Content);
+        } else {
+            System.out.println("璇诲彇澶辫触锛�" + read.Message);
+        }
+    }
+
+    /**
+     * 涓夎彵   A
+     */
+    private static void MelsecA1ETest() {
+        MelsecA1ENet melsec_net = new MelsecA1ENet("192.168.0.100", 5000);
+        melsec_net.SetPersistentConnection();
+
+        boolean[] M100 = melsec_net.ReadBool("M100", (short) 1).Content;           // 璇诲彇M100鏄惁閫氾紝鍗佽繘鍒跺湴鍧�
+        boolean[] X20 = melsec_net.ReadBool("X20", (short) 1).Content;             // 璇诲彇X20鏄惁閫氾紝鍏繘鍒跺湴鍧�
+        boolean[] Y20 = melsec_net.ReadBool("Y20", (short) 1).Content;             // 璇诲彇Y20鏄惁閫氾紝鍏繘鍒跺湴鍧�
+        short short_D1000 = melsec_net.ReadInt16("D1000").Content;                 // 璇诲彇D1000鐨剆hort鍊�
+        int int_D1000 = melsec_net.ReadInt32("D1000").Content;                     // 璇诲彇D1000-D1001缁勬垚鐨刬nt鏁版嵁
+        float float_D1000 = melsec_net.ReadFloat("D1000").Content;                 // 璇诲彇D1000-D1001缁勬垚鐨刦loat鏁版嵁
+        long long_D1000 = melsec_net.ReadInt64("D1000").Content;                   // 璇诲彇D1000-D1003缁勬垚鐨刲ong鏁版嵁
+        double double_D1000 = melsec_net.ReadDouble("D1000").Content;              // 璇诲彇D1000-D1003缁勬垚鐨刣ouble鏁版嵁
+        String str_D1000 = melsec_net.ReadString("D1000", (short) 10).Content;     // 璇诲彇D1000-D1009缁勬垚鐨勬潯鐮佹暟鎹�
+
+
+        melsec_net.Write("M100", new boolean[]{true});                            // 鍐欏叆M100涓洪��
+        melsec_net.Write("Y20", new boolean[]{true});                             // 鍐欏叆Y20涓洪��
+        melsec_net.Write("X20", new boolean[]{true});                             // 鍐欏叆X20涓洪��
+        melsec_net.Write("D1000", (short) 1234);                                  // 鍐欏叆D1000  short鍊�  ,W3C0,R3C0 鏁堟灉鏄竴鏍风殑
+        melsec_net.Write("D1000", 1234566);                                // 鍐欏叆D1000  int鍊�
+        melsec_net.Write("D1000", 123.456f);                               // 鍐欏叆D1000  float鍊�
+        melsec_net.Write("D1000", 123.456d);                               // 鍐欏叆D1000  double鍊�
+        melsec_net.Write("D1000", 123456661235123534L);                    // 鍐欏叆D1000  long鍊�
+        melsec_net.Write("D1000", "K123456789");                           // 鍐欏叆D1000  string鍊�
+
+
+        OperateResultExOne<boolean[]> read = melsec_net.ReadBool("M100", (short) 10);
+        if (read.IsSuccess) {
+            boolean m100 = read.Content[0];
+            boolean m101 = read.Content[1];
+            boolean m102 = read.Content[2];
+            boolean m103 = read.Content[3];
+            boolean m104 = read.Content[4];
+            boolean m105 = read.Content[5];
+            boolean m106 = read.Content[6];
+            boolean m107 = read.Content[7];
+            boolean m108 = read.Content[8];
+            boolean m109 = read.Content[9];
+        } else {
+            System.out.print("璇诲彇澶辫触锛�" + read.Message);
+        }
+
+
+        OperateResultExOne<byte[]> read1 = melsec_net.Read("D100", (short) 5);
+        if (read1.IsSuccess) {
+            short D100 = melsec_net.getByteTransform().TransInt16(read1.Content, 0);
+            short D101 = melsec_net.getByteTransform().TransInt16(read1.Content, 2);
+            short D102 = melsec_net.getByteTransform().TransInt16(read1.Content, 4);
+            short D103 = melsec_net.getByteTransform().TransInt16(read1.Content, 6);
+            short D104 = melsec_net.getByteTransform().TransInt16(read1.Content, 8);
+        } else {
+            System.out.print("璇诲彇澶辫触锛�" + read1.Message);
+        }
+
+
+        //瑙f瀽澶嶆潅鏁版嵁
+        OperateResultExOne<byte[]> read3 = melsec_net.Read("D4000", (short) 10);
+        if (read3.IsSuccess) {
+            double 娓╁害 = melsec_net.getByteTransform().TransInt16(read3.Content, 0) / 10d;//绱㈠紩寰堥噸瑕�
+            double 鍘嬪姏 = melsec_net.getByteTransform().TransInt16(read3.Content, 2) / 100d;
+            boolean IsRun = melsec_net.getByteTransform().TransInt16(read3.Content, 4) == 1;
+            int 浜ч噺 = melsec_net.getByteTransform().TransInt32(read3.Content, 6);
+            String 瑙勬牸 = melsec_net.getByteTransform().TransString(read3.Content, 10, 10, "ascii");
+        } else {
+            System.out.print("璇诲彇澶辫触锛�" + read3.Message);
+        }
+
+        // 鍐欏叆娴嬭瘯锛孧100-M104 鍐欏叆娴嬭瘯 姝ゅ鍐欏叆鍚嶮100:閫� M101:鏂� M102:鏂� M103:閫� M104:閫�
+        boolean[] values = new boolean[]{true, false, false, true, true};
+        OperateResult write = melsec_net.Write("M100", values);
+        if (write.IsSuccess) {
+            System.out.print("鍐欏叆鎴愬姛");
+        } else {
+            System.out.print("鍐欏叆澶辫触锛�" + write.Message);
+        }
+
+
+        OperateResultExOne<Boolean> read2 = melsec_net.ReadBool("M100");
+        if (read2.IsSuccess) {
+            System.out.println(read2.Content);
+        } else {
+            System.out.println("璇诲彇澶辫触锛�" + read.Message);
+        }
+    }
+
+    /**
+     * 涓夎彵   Q
+     */
+    private static void MelsecTest() {
+        MelsecMcNet melsec_net = new MelsecMcNet("192.168.1.192", 6001);
+
+
+        boolean[] M100 = melsec_net.ReadBool("M100", (short) 1).Content;            // 璇诲彇M100鏄惁閫氾紝鍗佽繘鍒跺湴鍧�
+        boolean[] X1A0 = melsec_net.ReadBool("X1A0", (short) 1).Content;            // 璇诲彇X1A0鏄惁閫氾紝鍗佸叚杩涘埗鍦板潃
+        boolean[] Y1A0 = melsec_net.ReadBool("Y1A0", (short) 1).Content;            // 璇诲彇Y1A0鏄惁閫氾紝鍗佸叚杩涘埗鍦板潃
+        boolean[] B1A0 = melsec_net.ReadBool("B1A0", (short) 1).Content;            // 璇诲彇B1A0鏄惁閫氾紝鍗佸叚杩涘埗鍦板潃
+        short short_D1000 = melsec_net.ReadInt16("D1000").Content;                 // 璇诲彇D1000鐨剆hort鍊�  ,W3C0,R3C0 鏁堟灉鏄竴鏍风殑
+        int int_D1000 = melsec_net.ReadInt32("D1000").Content;                     // 璇诲彇D1000-D1001缁勬垚鐨刬nt鏁版嵁
+        float float_D1000 = melsec_net.ReadFloat("D1000").Content;                 // 璇诲彇D1000-D1001缁勬垚鐨刦loat鏁版嵁
+        long long_D1000 = melsec_net.ReadInt64("D1000").Content;                   // 璇诲彇D1000-D1003缁勬垚鐨刲ong鏁版嵁
+        double double_D1000 = melsec_net.ReadDouble("D1000").Content;              // 璇诲彇D1000-D1003缁勬垚鐨刣ouble鏁版嵁
+        String str_D1000 = melsec_net.ReadString("D1000", (short) 10).Content;     // 璇诲彇D1000-D1009缁勬垚鐨勬潯鐮佹暟鎹�
+
+
+        melsec_net.Write("M100", new boolean[]{true});                          // 鍐欏叆M100涓洪��
+        melsec_net.Write("Y1A0", new boolean[]{true});                        // 鍐欏叆Y1A0涓洪��
+        melsec_net.Write("X1A0", new boolean[]{true});                        // 鍐欏叆X1A0涓洪��
+        melsec_net.Write("B1A0", new boolean[]{true});                        // 鍐欏叆B1A0涓洪��
+        melsec_net.Write("D1000", (short) 1234);                                   // 鍐欏叆D1000  short鍊�  ,W3C0,R3C0 鏁堟灉鏄竴鏍风殑
+        melsec_net.Write("D1000", 1234566);                                // 鍐欏叆D1000  int鍊�
+        melsec_net.Write("D1000", 123.456f);                               // 鍐欏叆D1000  float鍊�
+        melsec_net.Write("D1000", 123.456d);                               // 鍐欏叆D1000  double鍊�
+        melsec_net.Write("D1000", 123456661235123534L);                    // 鍐欏叆D1000  long鍊�
+        melsec_net.Write("D1000", "K123456789");                           // 鍐欏叆D1000  string鍊�
+
+
+        OperateResultExOne<boolean[]> read = melsec_net.ReadBool("M100", (short) 10);
+        if (read.IsSuccess) {
+            boolean m100 = read.Content[0];
+            boolean m101 = read.Content[1];
+            boolean m102 = read.Content[2];
+            boolean m103 = read.Content[3];
+            boolean m104 = read.Content[4];
+            boolean m105 = read.Content[5];
+            boolean m106 = read.Content[6];
+            boolean m107 = read.Content[7];
+            boolean m108 = read.Content[8];
+            boolean m109 = read.Content[9];
+        } else {
+            System.out.print("璇诲彇澶辫触锛�" + read.Message);
+        }
+
+
+        OperateResultExOne<byte[]> read1 = melsec_net.Read("D100", (short) 5);
+        if (read1.IsSuccess) {
+            short D100 = melsec_net.getByteTransform().TransByte(read1.Content, 0);
+            short D101 = melsec_net.getByteTransform().TransByte(read1.Content, 2);
+            short D102 = melsec_net.getByteTransform().TransByte(read1.Content, 4);
+            short D103 = melsec_net.getByteTransform().TransByte(read1.Content, 6);
+            short D104 = melsec_net.getByteTransform().TransByte(read1.Content, 8);
+        } else {
+            System.out.print("璇诲彇澶辫触锛�" + read1.Message);
+        }
+
+
+        //瑙f瀽澶嶆潅鏁版嵁
+        OperateResultExOne<byte[]> read3 = melsec_net.Read("D4000", (short) 10);
+        if (read3.IsSuccess) {
+            double 娓╁害 = melsec_net.getByteTransform().TransInt16(read3.Content, 0) / 10d;//绱㈠紩寰堥噸瑕�
+            double 鍘嬪姏 = melsec_net.getByteTransform().TransInt16(read3.Content, 2) / 100d;
+            boolean IsRun = melsec_net.getByteTransform().TransInt16(read3.Content, 4) == 1;
+            int 浜ч噺 = melsec_net.getByteTransform().TransInt32(read3.Content, 6);
+            String 瑙勬牸 = melsec_net.getByteTransform().TransString(read3.Content, 10, 10, "ascii");
+        } else {
+            System.out.print("璇诲彇澶辫触锛�" + read3.Message);
+        }
+
+        // 鍐欏叆娴嬭瘯锛孧100-M104 鍐欏叆娴嬭瘯 姝ゅ鍐欏叆鍚嶮100:閫� M101:鏂� M102:鏂� M103:閫� M104:閫�
+        boolean[] values = new boolean[]{true, false, false, true, true};
+        OperateResult write = melsec_net.Write("M100", values);
+        if (write.IsSuccess) {
+            System.out.print("鍐欏叆鎴愬姛");
+        } else {
+            System.out.print("鍐欏叆澶辫触锛�" + write.Message);
+        }
+
+
+        OperateResultExOne<Boolean> read2 = melsec_net.ReadBool("M100");
+        if (read2.IsSuccess) {
+            System.out.println(read2.Content);
+        } else {
+            System.out.println("璇诲彇澶辫触锛�" + read.Message);
+        }
+    }
+
+    /**
+     * 涓夎彵   Q   ASCII閫氳鏍煎紡
+     */
+    private  static void MelsecAsciiTest(){
+
+        MelsecMcAsciiNet melsec = new MelsecMcAsciiNet("192.168.1.192",6001);
+        OperateResultExOne<short[]> read = melsec.ReadInt16("D100",(short) 2);
+        if(read.IsSuccess)
+        {
+            System.out.println(Arrays.toString(read.Content));
+        }
+        else {
+            System.out.println(read.ToMessageShowString());
+        }
+    }
+
+
+    /**
+     * 鍥涢棬瀛�
+     */
+    private static void SiemesTest(){
+        SiemensS7Net siemens_net = new SiemensS7Net(SiemensPLCS.S1200,"192.168.1.195");
+        OperateResult connect = siemens_net.ConnectServer();
+        if(connect.IsSuccess){
+            System.out.println("connect success!");
+        }
+        else {
+            System.out.println("failed:"+connect.Message);
+        }
+        siemens_net.ConnectClose();
+
+        // 涓婇潰鏄垵濮嬪寲
+        System.out.println(siemens_net.ReadByte("M100").Content);
+
+        byte m100_byte = siemens_net.ReadByte("M100").Content;
+        short m100_short = siemens_net.ReadInt16("M100").Content;
+        int m100_int = siemens_net.ReadInt32("M100").Content;
+        long m100_long = siemens_net.ReadInt64("M100").Content;
+        float m100_float = siemens_net.ReadFloat("M100").Content;
+        double m100_double = siemens_net.ReadDouble("M100").Content;
+        String m100_string = siemens_net.ReadString("M100",(short) 10).Content;
+
+        siemens_net.Write("M100",(byte) 123);
+        siemens_net.Write("M100",(short) 123);
+        siemens_net.Write("M100",(int) 123);
+        siemens_net.Write("M100",(long) 123);
+        siemens_net.Write("M100", 123.456f);
+        siemens_net.Write("M100", 123.456d);
+        siemens_net.Write("M100","1234567890");
+
+        OperateResultExOne<byte[]> read = siemens_net.Read( "M100", (short) 10 );
+        {
+            if(read.IsSuccess)
+            {
+                byte m100 = read.Content[0];
+                byte m101 = read.Content[1];
+                byte m102 = read.Content[2];
+                byte m103 = read.Content[3];
+                byte m104 = read.Content[4];
+                byte m105 = read.Content[5];
+                byte m106 = read.Content[6];
+                byte m107 = read.Content[7];
+                byte m108 = read.Content[8];
+                byte m109 = read.Content[9];
+            }
+            else
+            {
+                // 鍙戠敓浜嗗紓甯�
+            }
+        }
+
+    }
+
+    private static void PushNetTest() {
+        NetPushClient client = new NetPushClient("127.0.0.1", 23467, "A");
+        OperateResult connect = client.CreatePush(new ActionOperateExTwo<NetPushClient,String>(){
+            @Override
+            public void Action(NetPushClient content1, String content2) {
+                System.out.println(content2);
+            }
+        });
+        if (connect.IsSuccess) {
+            System.out.println("杩炴帴鎴愬姛!");
+        } else {
+            System.out.println("杩炴帴澶辫触!"+connect.Message);
+        }
+    }
+
+    private static void ModbusTcpTets(){
+        ModbusTcpNet modbusTcpNet = new ModbusTcpNet("127.0.0.1",502,(byte) 0x01);
+        // 褰撲綘闇�瑕佹寚瀹氭牸寮忕殑鏁版嵁瑙f瀽鏃讹紝灏遍渶瑕佽缃笅闈㈢殑杩欎釜淇℃伅
+        modbusTcpNet.setDataFormat(DataFormat.BADC);
+        OperateResultExOne<Double> read = modbusTcpNet.ReadDouble("s=2;x=4;200");
+        if(read.IsSuccess){
+            System.out.println(read.Content);
+        }
+        else {
+            System.out.println(read.Message);
+        }
+
+        modbusTcpNet.Write("100",new int[]{12345,-12345});
+    }
+
+    private static void NetComplexClientTest(){
+        System.out.println("Hello World!绛夊緟10s鍏抽棴");
+        NetComplexClient client = new NetComplexClient();
+        client.setIpAddress("127.0.0.1");
+        client.setPort(12346);
+        client.setClientAlias("娴嬭瘯1");
+        client.AcceptString= new ActionOperateExThree<NetComplexClient,NetHandle,String>(){
+            @Override
+            public void Action(NetComplexClient content1, NetHandle content2, String content3) {
+                System.out.println("Handle:"+content2.get_CodeValue()+"  Value:"+content3);
+            }
+        };
+
+
+        client.ClientStart();
+
+//        client.Send(new NetHandle(1),"asdasdi闃挎柉杈鹃樋鏂揪");
+//        System.out.println(client.getDelayTime());
+//        Thread.sleep(100000);
+//        client.ClientClose();
+
+
+    }
+
+}
diff --git a/src/main/java/com/zy/common/web/AuthController.java b/src/main/java/com/zy/common/web/AuthController.java
index 0195788..badc290 100644
--- a/src/main/java/com/zy/common/web/AuthController.java
+++ b/src/main/java/com/zy/common/web/AuthController.java
@@ -65,7 +65,7 @@
         if (user.getStatus()!=1){
             return R.parse(CodeRes.USER_10002);
         }
-        if (!Cools.md5(user.getPassword()).equals(password)){
+        if (!user.getPassword().equals(password)){
             return R.parse(CodeRes.USER_10003);
         }
         String token = Cools.enToken(System.currentTimeMillis() + mobile, user.getPassword());
diff --git a/src/main/java/com/zy/gateway/Test.java b/src/main/java/com/zy/gateway/Test.java
deleted file mode 100644
index 7cd3041..0000000
--- a/src/main/java/com/zy/gateway/Test.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package com.zy.gateway;
-
-import com.zy.gateway.core.domain.OperateResult;
-import com.zy.gateway.core.domain.OperateResultExOne;
-import com.zy.gateway.core.domain.siemens.SiemensPLCS;
-import com.zy.gateway.core.net.siemens.SiemensS7Net;
-
-/**
- * Created by vincent on 2020-06-04
- */
-public class Test {
-
-    public static void main(String[] args) throws InterruptedException {
-        SiemesTest();
-        try {
-
-            SiemensS7Net siemensS7Net = new SiemensS7Net(SiemensPLCS.S300,"192.168.1.102");
-            OperateResult write = siemensS7Net.Write("M200",(short)200);
-
-            if(!write.IsSuccess){
-                System.out.println("Write failed:"+write.Message);
-            }
-
-            OperateResultExOne<Short> read = siemensS7Net.ReadInt16("M200");
-            if(read.IsSuccess){
-                System.out.println("Value:"+read.Content.toString());
-            }
-            else {
-                System.out.println("Read failed:"+read.Message);
-            }
-        }
-        catch (Exception ex){
-            System.out.println(ex.getMessage());
-        }
-        Thread.sleep(1000);
-    }
-
-    private static void SiemesTest(){
-        SiemensS7Net siemens_net = new SiemensS7Net(SiemensPLCS.S300,"192.168.1.102");
-        OperateResult connect = siemens_net.ConnectServer();
-        if(connect.IsSuccess){
-            System.out.println("connect success!");
-        }
-        else {
-            System.out.println("failed:"+connect.Message);
-        }
-        siemens_net.ConnectClose();
-
-        // 涓婇潰鏄垵濮嬪寲
-        System.out.println(siemens_net.ReadByte("M100").Content);
-
-        byte m100_byte = siemens_net.ReadByte("M100").Content;
-        short m100_short = siemens_net.ReadInt16("M100").Content;
-        int m100_int = siemens_net.ReadInt32("M100").Content;
-        long m100_long = siemens_net.ReadInt64("M100").Content;
-        float m100_float = siemens_net.ReadFloat("M100").Content;
-        double m100_double = siemens_net.ReadDouble("M100").Content;
-        String m100_string = siemens_net.ReadString("M100",(short) 10).Content;
-
-        siemens_net.Write("M100",(byte) 123);
-        siemens_net.Write("M100",(short) 123);
-        siemens_net.Write("M100",(int) 123);
-        siemens_net.Write("M100",(long) 123);
-        siemens_net.Write("M100", 123.456f);
-        siemens_net.Write("M100", 123.456d);
-        siemens_net.Write("M100","1234567890");
-
-        OperateResultExOne<byte[]> read = siemens_net.Read( "M100", (short) 10 );
-        {
-            if(read.IsSuccess)
-            {
-                byte m100 = read.Content[0];
-                byte m101 = read.Content[1];
-                byte m102 = read.Content[2];
-                byte m103 = read.Content[3];
-                byte m104 = read.Content[4];
-                byte m105 = read.Content[5];
-                byte m106 = read.Content[6];
-                byte m107 = read.Content[7];
-                byte m108 = read.Content[8];
-                byte m109 = read.Content[9];
-            }
-            else
-            {
-                // 鍙戠敓浜嗗紓甯�
-            }
-        }
-
-    }
-}
diff --git a/src/main/java/com/zy/gateway/core/IReadWriteNet.java b/src/main/java/com/zy/gateway/core/IReadWriteNet.java
deleted file mode 100644
index 8c809b2..0000000
--- a/src/main/java/com/zy/gateway/core/IReadWriteNet.java
+++ /dev/null
@@ -1,227 +0,0 @@
-package com.zy.gateway.core;
-
-import com.zy.gateway.core.domain.IDataTransfer;
-import com.zy.gateway.core.domain.OperateResult;
-import com.zy.gateway.core.domain.OperateResultExOne;
-
-/**
- * 鎵�鏈夎澶囦氦浜掔被鐨勭粺涓�鐨勮鍐欐帴鍙�
- */
-public interface IReadWriteNet {
-
-    /**
-     * 鎵归噺璇诲彇搴曞眰鐨勬暟鎹俊鎭紝闇�瑕佹寚瀹氬湴鍧�鍜岄暱搴︼紝鍏蜂綋鐨勭粨鏋滃彇鍐充簬瀹炵幇
-     * @param address 鍦板潃淇℃伅
-     * @param length 鏁版嵁闀垮害
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨刡yte[]鏁扮粍
-     */
-    OperateResultExOne<byte[]> Read(String address, short length);
-
-    /**
-     * 璇诲彇16浣嶇殑鏈夌鍙锋暣鍨�
-     * @param address 璧峰鍦板潃
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨剆hort鏁版嵁
-     */
-    OperateResultExOne<Short> ReadInt16(String address);
-
-    /**
-     * 璇诲彇16浣嶇殑鏈夌鍙锋暣鍨嬫暟缁�
-     * @param address 璧峰鍦板潃
-     * @param length 璇诲彇鐨勬暟缁勯暱搴�
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨剆hort鏁扮粍
-     */
-    OperateResultExOne<short []> ReadInt16(String address, short length);
-
-    /**
-     * 璇诲彇32浣嶇殑鏈夌鍙锋暣鍨�
-     * @param address 璧峰鍦板潃
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨刬nt鏁版嵁
-     */
-    OperateResultExOne<Integer> ReadInt32(String address);
-
-    /**
-     * 璇诲彇32浣嶆湁绗﹀彿鏁村瀷鐨勬暟缁�
-     * @param address 璧峰鍦板潃
-     * @param length 鏁扮粍闀垮害
-     * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
-     */
-    OperateResultExOne<int[]> ReadInt32(String address, short length);
-
-    /**
-     * 璇诲彇64浣嶇殑鏈夌鍙锋暣鍨�
-     * @param address 璧峰鍦板潃
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨刲ong鏁版嵁
-     */
-    OperateResultExOne<Long> ReadInt64(String address);
-
-    /**
-     * 璇诲彇64浣嶇殑鏈夌鍙锋暣鍨嬫暟缁�
-     * @param address 璧峰鍦板潃
-     * @param length 鏁扮粍闀垮害
-     * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
-     */
-    OperateResultExOne<long[]> ReadInt64(String address, short length);
-
-    /**
-     * 璇诲彇鍗曟诞鐐圭簿搴︾殑鏁版嵁
-     * @param address 璧峰鍦板潃
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨刦loat鏁版嵁
-     */
-    OperateResultExOne<Float> ReadFloat(String address);
-
-    /**
-     * 璇诲彇鍗曟诞鐐圭簿搴︾殑鏁扮粍
-     * @param address 璧峰鍦板潃
-     * @param length 鏁扮粍闀垮害
-     * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
-     */
-    OperateResultExOne<float[]> ReadFloat(String address, short length);
-
-    /**
-     * 璇诲彇鍙屾诞鐐圭簿搴︾殑鏁版嵁
-     * @param address 璧峰鍦板潃
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨刣ouble鏁版嵁
-     */
-    OperateResultExOne<Double> ReadDouble(String address);
-
-
-    /**
-     * 璇诲彇鍙屾诞鐐圭簿搴︾殑鏁版嵁鐨勬暟缁�
-     * @param address 璧峰鍦板潃
-     * @param length 鏁扮粍闀垮害
-     * @return 甯︽垚鍔熸爣蹇楃殑缁撴灉鏁版嵁瀵硅薄
-     */
-    OperateResultExOne<double[]> ReadDouble(String address, short length);
-
-    /**
-     * 璇诲彇瀛楃涓叉暟鎹�
-     * @param address 璧峰鍦板潃
-     * @param length 鏁版嵁闀垮害
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨剆tring鏁版嵁
-     */
-    OperateResultExOne<String> ReadString(String address, short length);
-
-
-    /**
-     * 璇诲彇鑷畾涔夌殑鏁版嵁绫诲瀷锛岄渶瑕佺户鎵胯嚜IDataTransfer鎺ュ彛
-     * @param address 璧峰鍦板潃
-     * @param <T> 鑷畾涔夌殑绫诲瀷
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨勮嚜瀹氫箟绫诲瀷鏁版嵁
-     */
-    <T extends IDataTransfer> OperateResultExOne<T> ReadCustomer(String address, Class<T> tClass);
-
-
-
-
-
-
-
-
-    /**
-     * 鍐欏叆short鏁版嵁
-     * @param address 璧峰鍦板潃
-     * @param value 鍐欏叆鍊�
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨勭粨鏋滅被瀵硅薄
-     */
-    OperateResult Write(String address, short value);
-
-    /**
-     * 鍐欏叆short鏁扮粍
-     * @param address 璧峰鍦板潃
-     * @param values 鍐欏叆鍊�
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨勭粨鏋滅被瀵硅薄
-     */
-    OperateResult Write(String address, short[] values);
-
-    /**
-     * 鍐欏叆int鏁版嵁
-     * @param address 璧峰鍦板潃
-     * @param value 鍐欏叆鍊�
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨勭粨鏋滅被瀵硅薄
-     */
-    OperateResult Write(String address, int value);
-
-    /**
-     * 鍐欏叆int[]鏁扮粍
-     * @param address 璧峰鍦板潃
-     * @param values 鍐欏叆鍊�
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨勭粨鏋滅被瀵硅薄
-     */
-    OperateResult Write(String address, int[] values);
-
-    /**
-     * 鍐欏叆long鏁版嵁
-     * @param address 璧峰鍦板潃
-     * @param value 鍐欏叆鍊�
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨勭粨鏋滅被瀵硅薄
-     */
-    OperateResult Write(String address, long value);
-
-    /**
-     * 鍐欏叆long鏁扮粍
-     * @param address 璧峰鍦板潃
-     * @param values 鍐欏叆鍊�
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨勭粨鏋滅被瀵硅薄
-     */
-    OperateResult Write(String address, long[] values);
-
-    /**
-     * 鍐欏叆float鏁版嵁
-     * @param address 璧峰鍦板潃
-     * @param value 鍐欏叆鍊�
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨勭粨鏋滅被瀵硅薄
-     */
-    OperateResult Write(String address, float value);
-
-    /**
-     * 鍐欏叆float鏁扮粍
-     * @param address 璧峰鍦板潃
-     * @param values 鍐欏叆鍊�
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨勭粨鏋滅被瀵硅薄
-     */
-    OperateResult Write(String address, float[] values);
-
-    /**
-     * 鍐欏叆double鏁版嵁
-     * @param address 璧峰鍦板潃
-     * @param value 鍐欏叆鍊�
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨勭粨鏋滅被瀵硅薄
-     */
-    OperateResult Write(String address, double value);
-
-    /**
-     * 鍐欏叆double鏁扮粍
-     * @param address 璧峰鍦板潃
-     * @param values 鍐欏叆鍊�
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨勭粨鏋滅被瀵硅薄
-     */
-    OperateResult Write(String address, double[] values);
-
-    /**
-     * 鍐欏叆瀛楃涓蹭俊鎭紝缂栫爜涓篈SCII
-     * @param address 璧峰鍦板潃
-     * @param value 鍐欏叆鍊�
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨勭粨鏋滅被瀵硅薄
-     */
-    OperateResult Write(String address, String value);
-
-
-    /**
-     * 鍐欏叆瀛楃涓蹭俊鎭紝缂栫爜涓篈SCII
-     * @param address 璧峰鍦板潃
-     * @param value 鍐欏叆鍊�
-     * @param length 鍐欏叆鐨勫瓧绗︿覆鐨勯暱搴�
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨勭粨鏋滅被瀵硅薄
-     */
-    OperateResult Write(String address, String value, int length);
-
-    /**
-     * 鍐欏叆鑷畾涔夌被鍨嬬殑鏁版嵁锛岃绫诲瀷蹇呴』缁ф壙鑷狪DataTransfer鎺ュ彛
-     * @param address 璧峰鍦板潃
-     * @param value 鍐欏叆鍊�
-     * @param <T> 绫诲瀷瀵硅薄
-     * @return 甯︽湁鎴愬姛鏍囪瘑鐨勭粨鏋滅被瀵硅薄
-     */
-    <T extends IDataTransfer> OperateResult WriteCustomer(String address, T value);
-
-}
diff --git a/src/main/java/com/zy/gateway/pipeline/Bootstrap.java b/src/main/java/com/zy/gateway/pipeline/Bootstrap.java
deleted file mode 100644
index b9d6fb3..0000000
--- a/src/main/java/com/zy/gateway/pipeline/Bootstrap.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.zy.gateway.pipeline;
-
-
-/**
- * Created by vincent on 2020-06-04
- */
-public interface Bootstrap {
-
-    void serverStart() throws Exception;
-
-    void destroy();
-}
diff --git a/src/main/java/com/zy/gateway/pipeline/HandlerInitializer.java b/src/main/java/com/zy/gateway/pipeline/HandlerInitializer.java
deleted file mode 100644
index cdd15bd..0000000
--- a/src/main/java/com/zy/gateway/pipeline/HandlerInitializer.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.zy.gateway.pipeline;
-
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelHandler;
-import io.netty.channel.ChannelInitializer;
-import io.netty.handler.timeout.IdleStateHandler;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-
-/**
- * handler绠¢亾
- * 鎺у埗鎵�鏈塶etty handler娴佸悜
- * 寰呭畬鎴�: 鍔ㄦ�佺鐞唄andler
- * Created by vincent on 2019-04-02
- */
-@Component
-@ChannelHandler.Sharable
-public class HandlerInitializer extends ChannelInitializer<Channel> {
-
-    @Autowired
-    private PipelineProperties pipelineProperties;
-
-    /**
-     * Set some channel handlers on channel pipeline
-     */
-    @Override
-    protected void initChannel(Channel channel) {
-        channel.pipeline()
-                // 蹇冭烦
-                .addLast(new IdleStateHandler(pipelineProperties.getHeartSeconds(), 0, 0))
-//                // 缂栫爜鍣�
-//                .addLast(protocolEncoder)
-//                // 瑙g爜鍣�
-//                .addLast(new ProtocolDecoder(4096))
-//                // 鏍¢獙鐮佸鐞嗗櫒
-//                .addLast(validateHandler)
-//                // 璁よ瘉澶勭悊鍣�
-//                .addLast(vehAuthHandler)
-//                // 涓氬姟澶勭悊鍣�
-//                .addLast(gbPackageServerHandler)
-//                // 閫氶亾淇濇姢鍣�
-//                .addLast(protectorHandler)
-        ;
-
-        // Channel灞�閮ㄥ彉閲忥紝鐩稿綋浜庣嚎绋嬬殑ThreadLocal
-//        initAttrTrack(channel);
-    }
-
-
-}
diff --git a/src/main/java/com/zy/gateway/pipeline/PipelineBootstrap.java b/src/main/java/com/zy/gateway/pipeline/PipelineBootstrap.java
deleted file mode 100644
index f8ccf06..0000000
--- a/src/main/java/com/zy/gateway/pipeline/PipelineBootstrap.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package com.zy.gateway.pipeline;
-
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.buffer.PooledByteBufAllocator;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.util.ResourceLeakDetector;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
-
-/**
- * 杈撻�佽澶囩綉鍏冲紩瀵肩被
- * Created by vincent on 2020-06-04
- */
-@Component
-public class PipelineBootstrap implements Bootstrap {
-
-    private static Logger log = LoggerFactory.getLogger(PipelineBootstrap.class);
-
-    private Channel channel;
-    private ServerBootstrap bootstrap;
-    private EventLoopGroup bossGroup;
-    private EventLoopGroup workerGroup;
-    @Autowired
-    private PipelineProperties pipelineProperties;
-    @Autowired
-    private HandlerInitializer handlerInitializer;
-
-    {
-        bootstrap = new ServerBootstrap();
-        bossGroup = new NioEventLoopGroup(1);
-        workerGroup = new NioEventLoopGroup();
-    }
-
-    /**
-     * 缃戝叧鍚姩鍒濆鍖�
-     */
-    @Override
-    @PostConstruct
-    public void serverStart() throws Exception {
-        bootstrap.group(bossGroup, workerGroup)
-                .channel(NioServerSocketChannel.class)
-                .childHandler(handlerInitializer)
-                .option(ChannelOption.SO_BACKLOG, pipelineProperties.getBacklog())
-                .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)
-                .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)
-                .childOption(ChannelOption.SO_KEEPALIVE, pipelineProperties.isKeepAlive())
-                .childOption(ChannelOption.SO_SNDBUF, pipelineProperties.getSndbuf())
-                .childOption(ChannelOption.SO_RCVBUF, pipelineProperties.getRcvbuf());
-
-        ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.ADVANCED);
-
-        log.info("TCP server started successfully, port锛歿}", pipelineProperties.getTcpPort());
-
-        channel = bootstrap.bind(pipelineProperties.getTcpPort()).sync().channel();
-    }
-
-    @Override
-    @PreDestroy
-    public void destroy() {
-        if (channel != null && channel.isActive()) {
-            channel.close();
-        }
-        if (bossGroup != null) {
-            bossGroup.shutdownGracefully();
-        }
-        if (workerGroup != null) {
-            workerGroup.shutdownGracefully();
-        }
-        log.info("TCP server stopped successfully, port: {}", pipelineProperties.getTcpPort());
-    }
-}
-
diff --git a/src/main/java/com/zy/gateway/pipeline/PipelineProperties.java b/src/main/java/com/zy/gateway/pipeline/PipelineProperties.java
deleted file mode 100644
index a2d1a1f..0000000
--- a/src/main/java/com/zy/gateway/pipeline/PipelineProperties.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package com.zy.gateway.pipeline;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Configuration;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-/**
- * vc绯荤粺閰嶇疆
- * Created by luxiaotao on 2018/10/15
- */
-@Configuration
-@ConfigurationProperties(prefix = "pipeline")
-public class PipelineProperties {
-
-    public static String HOST_NAME;
-
-    static {
-        try {
-            HOST_NAME = InetAddress.getLocalHost().getHostName();
-        } catch (UnknownHostException e) {
-            System.err.println("find hostname err");
-        }
-    }
-
-    private int tcpPort;
-
-    private int heartSeconds;
-
-    private int backlog;
-
-    private boolean keepAlive;
-
-    private int sndbuf;
-
-    private int rcvbuf;
-
-    private boolean printPacLog;
-
-    public int getTcpPort() {
-        return tcpPort;
-    }
-
-    public void setTcpPort(int tcpPort) {
-        this.tcpPort = tcpPort;
-    }
-
-    public int getHeartSeconds() {
-        return heartSeconds;
-    }
-
-    public void setHeartSeconds(int heartSeconds) {
-        this.heartSeconds = heartSeconds;
-    }
-
-    public int getBacklog() {
-        return backlog;
-    }
-
-    public void setBacklog(int backlog) {
-        this.backlog = backlog;
-    }
-
-    public boolean isKeepAlive() {
-        return keepAlive;
-    }
-
-    public void setKeepAlive(boolean keepAlive) {
-        this.keepAlive = keepAlive;
-    }
-
-    public int getSndbuf() {
-        return sndbuf;
-    }
-
-    public void setSndbuf(int sndbuf) {
-        this.sndbuf = sndbuf;
-    }
-
-    public int getRcvbuf() {
-        return rcvbuf;
-    }
-
-    public void setRcvbuf(int rcvbuf) {
-        this.rcvbuf = rcvbuf;
-    }
-
-    public boolean isPrintPacLog() {
-        return printPacLog;
-    }
-
-    public void setPrintPacLog(final boolean printPacLog) {
-        this.printPacLog = printPacLog;
-    }
-}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 57185ff..8861d2e 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -13,7 +13,7 @@
 #    password: xltys1995
     # sql-server
     driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
-    url: jdbc:sqlserver://127.0.0.1:1433;databasename=dlasrs
+    url: jdbc:sqlserver://127.0.0.1:1433;databasename=jsasrs
     username: sa
     password: sa@123
   mvc:
diff --git a/src/main/webapp/static/js/common.js b/src/main/webapp/static/js/common.js
index c44918f..bda3a25 100644
--- a/src/main/webapp/static/js/common.js
+++ b/src/main/webapp/static/js/common.js
@@ -2,8 +2,7 @@
 // var baseUrl = "/wcs";
 // 娴嬭瘯
 var baseUrl = "";
-// 绯荤粺杩愯鐘舵��
-var systemRunning = true;
+
 
 // 璧嬪��
 function setVal(el, val) {
diff --git a/src/main/webapp/views/console.html b/src/main/webapp/views/console.html
index 2675738..7a7e438 100644
--- a/src/main/webapp/views/console.html
+++ b/src/main/webapp/views/console.html
@@ -638,7 +638,7 @@
 
     // 绯荤粺杩愯寮�鍏�
     function systemSwitch() {
-        if (systemRunning){
+        if (parent.systemRunning){
             layer.prompt({title: '璇疯緭鍏ュ彛浠わ紝骞跺仠姝� WCS 绯荤粺', formType: 1,   shadeClose: true}, function(pass, idx){
                 layer.close(idx);
                 doSwitch(0, pass); // 鍋滄wcs绯荤粺
@@ -669,11 +669,11 @@
                     if (res.data.status) {
                         $('#system-icon').attr("class", "system-icon-open");
                         $('#system-run-desc').html("绯荤粺杩愯涓�...");
-                        systemRunning = true;
+                        parent.systemRunning = true;
                     } else {
                         $('#system-icon').attr("class", "system-icon-close");
                         $('#system-run-desc').html("绯荤粺宸插仠姝�!");
-                        systemRunning = false;
+                        parent.systemRunning = false;
                     }
                 } else if (res.code === 403){
                     window.location.href = baseUrl+"/login";
@@ -696,11 +696,11 @@
                     if (res.data.status) {
                         $('#system-icon').attr("class", "system-icon-open");
                         $('#system-run-desc').html("绯荤粺杩愯涓�...");
-                        systemRunning = true;
+                        parent.systemRunning = true;
                     } else {
                         $('#system-icon').attr("class", "system-icon-close");
                         $('#system-run-desc').html("绯荤粺宸插仠姝�!");
-                        systemRunning = false;
+                        parent.systemRunning = false;
                     }
                 } else if (res.code === 403){
                     window.location.href = baseUrl+"/login";
diff --git a/src/main/webapp/views/crn.html b/src/main/webapp/views/crn.html
index ec56bd0..abbf01c 100644
--- a/src/main/webapp/views/crn.html
+++ b/src/main/webapp/views/crn.html
@@ -200,7 +200,7 @@
 
     // 鍒ゆ柇鎵嬪姩鎿嶄綔妯″潡鏄惁鍙敤
     function operatorBlockShow() {
-        if (systemRunning) {
+        if (parent.systemRunning) {
             $('.crn-operation').css("opacity", "0.5");
             $('.crn-operation-shade').show();
             $('.crn-operation-shade-span').show();
diff --git a/src/main/webapp/views/index.html b/src/main/webapp/views/index.html
index fc3a206..0acdf60 100644
--- a/src/main/webapp/views/index.html
+++ b/src/main/webapp/views/index.html
@@ -44,6 +44,9 @@
       localStorage.removeItem("token");
       window.location.href = baseUrl + "/login";
   }
+
+  // 绯荤粺杩愯鐘舵��
+  var systemRunning = true;
 </script>
 </html>
 

--
Gitblit v1.9.1