From d14cdaf28222bfef468185e34de7c823f1436b19 Mon Sep 17 00:00:00 2001
From: 严智鑫 <test>
Date: 星期五, 13 六月 2025 17:56:24 +0800
Subject: [PATCH] 设备交互模块化组件 初步完成

---
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMenuMapper.java                              |   17 
 ShangHaiMesParent/JsonFile/PlcLoad.json                                                                                       |  134 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/SysUser.java                                    |   67 
 ShangHaiMesParent/.idea/.gitignore                                                                                            |    8 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/service/PlcAgreement.java                                          |  113 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/MD5.java                                                     |   36 
 ShangHaiMesParent/.idea/compiler.xml                                                                                          |   39 
 ShangHaiMesParent/.idea/uiDesigner.xml                                                                                        |  124 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/controller/SysUserController.java                      |   93 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMenuMapper.xml                           |    5 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/modbus/ModbusTcpServer.java                    |  419 +
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/MachineService.java                      |   19 
 .idea/misc.xml                                                                                                                |   16 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginSuccessHandler.java                         |   38 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/Parameters.java                         |   23 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/ReturnValue.java                        |   13 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/loadLogicS7.json                                 |  165 
 ShangHaiMesParent/moduleService/pom.xml                                                                                       |   80 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/DatabaseDesignDocUtil.java                                   |   97 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/application-dev.yml                                       |   32 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRoleMenu.java                                    |   36 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/Logic.java                              |   20 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/IndustrialServer.java      |   16 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAccessDeniedHandler.java                      |   35 
 ShangHaiMesParent/common/pom.xml                                                                                              |  217 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/config/WebSocketConfig.java                                 |   21 
 ShangHaiMesParent/common/springsecurity/src/main/resources/application-prod.yml                                               |   15 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/service/SysMenuService.java                                |   66 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/entity/ProtocolType.java                         |   41 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/logicalRelationship.json                         |   17 
 .idea/jarRepositories.xml                                                                                                     |   30 
 ShangHaiMesParent/.idea/jarRepositories.xml                                                                                   |   35 
 .idea/uiDesigner.xml                                                                                                          |  124 
 ShangHaiMesParent/gateway/src/main/java/com/mes/GateWayApplication.java                                                       |   20 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/application-prod.yml                                      |   32 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMapper.xml                               |    5 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/AccountMapper.java                        |   16 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/FastJsonRedisSerializer.java                       |   55 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleService.java                                |   51 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/application.yml                                           |   33 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/service/Communication.java                                         |   36 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/s7/S7Server.java                               |  434 +
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/shelfS7.json                                     |  244 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/ModbusAddressParser.java         |   54 
 .idea/ShangHaiMES.iml                                                                                                         |    9 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/common/ReadFile.java                                   |   40 
 ShangHaiMesParent/JsonFile/PlcCacheGlass.json                                                                                 |   64 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/PlcTypeService.java                      |   16 
 ShangHaiMesParent/common/servicebase/pom.xml                                                                                  |   32 
 .idea/compiler.xml                                                                                                            |   27 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/LoginUser.java                                  |   94 
 ShangHaiMesParent/.idea/inspectionProfiles/Project_Default.xml                                                                |   26 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/IndustrialDataHandler.java |   17 
 ShangHaiMesParent/JsonFile/PlcFlipSlice.json                                                                                  |  148 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserServiceImpl.java                   |  271 +
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/xml/AccountMapper.xml                     |    5 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/filter/JwtAuthenticationTokenFilter.java                 |   80 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/Api.java                   |  232 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/plcConnectModuleApplication.java                       |   33 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/s7/S7ClientOld.java                            |  185 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/LogicItem.java                          |   22 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/exception/ServiceException.java                             |   14 
 ShangHaiMesParent/common/springsecurity/pom.xml                                                                               |   40 
 ShangHaiMesParent/gateway/pom.xml                                                                                             |   40 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/common/JsonConversion.java                             |   18 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/ExampleDataHandler.java                        |  169 
 ShangHaiMesParent/readMe.md                                                                                                   |   18 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/JwtUtil.java                                       |   55 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/application-cz.yml                                        |   32 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/entity/request/GeneralRequest.java                                 |   17 
 ShangHaiMesParent/common/springsecurity/src/main/resources/application-loc.yml                                                |   15 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/LogicConfig.java                        |   19 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMapper.java                                  |   16 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/AccountService.java                      |   16 
 ShangHaiMesParent/common/servicebase/servicebase1.iml                                                                         |   11 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/config/MybatisPlusConfig.java                               |   30 
 ShangHaiMesParent/moduleService/plcConnectModule/pom.xml                                                                      |   43 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/modbus/ModbusTcpClient.java                    |  374 +
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/controller/SysMenuController.java                          |   83 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/shelf.json                                       |  244 
 ShangHaiMesParent/moduleService/plcConnectModule/src/test/test.iml                                                            |   11 
 ShangHaiMesParent/JsonFile/PlcLamination.json                                                                                 |   86 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleMenuService.java                            |   16 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/config/TokenWebSecurityConfig.java                       |   94 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/main.iml                                                            |   14 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRole.java                                        |   50 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/xml/PlcTypeMapper.xml                     |    5 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserRoleServiceImpl.java               |   20 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/ModbusRtuAddressParser.java      |   15 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/entity/vo/SysRoleVO.java                                   |   44 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleMenuServiceImpl.java                   |   20 
 ShangHaiMesParent/.idea/misc.xml                                                                                              |   18 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/impl/ProtocolTypeServiceImpl.java        |   23 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/config/Swagger2Config.java                                  |   78 
 ShangHaiMesParent/JsonFile/PlcSilkScreen.json                                                                                 |  184 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/xml/SysUserRoleMapper.xml                       |    5 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/AppRunnerConfig.java                                   |   48 
 ShangHaiMesParent/common/servicebase/src/main/resources/banner.txt                                                            |   32 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/controller/SysRoleController.java                          |   67 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/entity/Machine.java                              |   74 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleServiceImpl.java                       |  139 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/ProtocolTypeMapper.java                   |   16 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/SysUserRole.java                                |   38 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/s7/S7Client.java                               |  615 ++
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/controller/AccountController.java                |   37 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/impl/AccountServiceImpl.java             |   23 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/impl/MachineServiceImpl.java             |   50 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/shelfLogic.json                                  |   85 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/S7OldAddressParser.java          |   82 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/protocol/ProtocolType.java                     |    8 
 ShangHaiMesParent/JsonFile/PlcMarking.json                                                                                    |  318 +
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/InitUtil.java                                                |  104 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/modbus/ModbusIpClient.java                     |  461 +
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/CodeGet.java                                                 |   84 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/ApiService.java            |   44 
 .idea/encodings.xml                                                                                                           |   15 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/impl/PlcTypeServiceImpl.java             |   26 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/ModbusIpAddressParser.java       |   20 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/PlcParameters.java                      |   20 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/Result.java                                                  |   56 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/device/PlcBitInfo.java                                             |   85 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/entity/Account.java                              |   51 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java                                           |  172 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/ResponseUtil.java                                            |   28 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/ResultCodeEnum.java                                          |   33 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/device/PlcBitObject.java                                           |  124 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/mapper/SysMenuMapper.java                                  |   20 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/xml/SysUserMapper.xml                           |    5 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/xml/ProtocolTypeMapper.xml                |    5 
 ShangHaiMesParent/.idea/encodings.xml                                                                                         |   22 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/exception/GlobalExceptionHandler.java                       |   32 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/device/PlcParameterInfo.java                                       |  126 
 ShangHaiMesParent/gateway/gateway1.iml                                                                                        |   11 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/service/PlcParameter.java                                          |  154 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAuthenticationEntryPoint.java                 |   33 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/loadLogic2.json                                  |  165 
 ShangHaiMesParent/pom.xml                                                                                                     |   74 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/service/ModbusTcp.java                                             |  223 
 ShangHaiMesParent/common/springsecurity/springsecurity1.iml                                                                   |   13 
 ShangHaiMesParent/gateway/src/main/resources/application.yml                                                                  |   20 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/device/PlcParameterObject.java                                     |  254 +
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/entity/SysMenu.java                                        |   87 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/IndustrialClient.java      |   27 
 .idea/.gitignore                                                                                                              |    8 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/SysUserRoleMapper.java                          |   17 
 ShangHaiMesParent/JsonFile/PlcCleaning.json                                                                                   |   22 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/entity/PlcType.java                              |   41 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/WebSocketServer.java                                         |  174 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/ProtocolTypeService.java                 |   17 
 ShangHaiMesParent/common/springsecurity/src/main/resources/application-dev.yml                                                |   15 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/WebUtils.java                                      |   30 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/vo/SysUserVO.java                               |   63 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtLogoutSuccessHandler.java                     |   40 
 ShangHaiMesParent/JsonFile/PlcLoad2.json                                                                                      |  134 
 ShangHaiMesParent/JsonFile/PlcRotate.json                                                                                     |  169 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/HexUtil.java                                                 |  269 +
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/logback-spring.xml                                        |  170 
 ShangHaiMesParent/gateway/src/main/java/com/mes/config/MyCorsConfig.java                                                      |   34 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/loadLogic.json                                   |  165 
 ShangHaiMesParent/JsonFile/PlcEdging.json                                                                                     |  190 
 ShangHaiMesParent/moduleService/plcConnectModule/src/test/java/com/mes/plcConnectModuleApplicationTest.java                   |  161 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/SysUserService.java                            |  110 
 .idea/vcs.xml                                                                                                                 |    6 
 .idea/modules.xml                                                                                                             |    8 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/SysUserMapper.java                              |   18 
 ShangHaiMesParent/common/springsecurity/src/main/resources/mapper/SysMenuMapper.xml                                           |   15 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginFailureHandler.java                         |   31 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/HexConversion.java                                           |  112 
 ShangHaiMesParent/.idea/vcs.xml                                                                                               |    6 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/S7control.java                                               |  489 +
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/Thread/MachineThread.java                      |  394 +
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/protocol/ProtocolAddress.java                  |   38 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/config/RedisConfig.java                                  |   37 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/service/impl/SysMenuServiceImpl.java                       |  148 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/modbus/ModbusIpServer.java                     |  393 +
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/SysUserRoleService.java                        |   17 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/common/RestTemplateConfig.java                         |   13 
 ShangHaiMesParent/.idea/modules.xml                                                                                           |    8 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/xml/MachineMapper.xml                     |    5 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/PlcTypeMapper.java                        |   16 
 ShangHaiMesParent/.idea/libraries/springsecurity_1_0_SNAPSHOT.xml                                                             |    9 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/S7AddressParser.java             |   82 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/UserInfoUtils.java                                 |   26 
 ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/RedisUtil.java                                     |  235 
 ShangHaiMesParent/.idea/libraries/servicebase_1_0_SNAPSHOT.xml                                                                |    9 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/MachineMapper.java                        |   24 
 ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/handler/MyMetaObjectHandler.java                            |   22 
 ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/AddressParser.java         |   10 
 188 files changed, 14,655 insertions(+), 0 deletions(-)

diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..35410ca
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# 榛樿蹇界暐鐨勬枃浠�
+/shelf/
+/workspace.xml
+# 鍩轰簬缂栬緫鍣ㄧ殑 HTTP 瀹㈡埛绔姹�
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/ShangHaiMES.iml b/.idea/ShangHaiMES.iml
new file mode 100644
index 0000000..d6ebd48
--- /dev/null
+++ b/.idea/ShangHaiMES.iml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..870f0b9
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile default="true" name="Default" enabled="true" />
+      <profile name="Maven default annotation processors profile" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <module name="plcConnect" />
+        <module name="servicebase" />
+        <module name="gateway" />
+      </profile>
+    </annotationProcessing>
+    <bytecodeTargetLevel>
+      <module name="springsecurity" target="1.8" />
+    </bytecodeTargetLevel>
+  </component>
+  <component name="JavacSettings">
+    <option name="ADDITIONAL_OPTIONS_OVERRIDE">
+      <module name="gateway" options="-parameters" />
+      <module name="plcConnect" options="-parameters" />
+      <module name="servicebase" options="-parameters" />
+      <module name="springsecurity" options="-parameters" />
+    </option>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..7389ec6
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/ShangHaiMesParent/common/servicebase/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ShangHaiMesParent/common/springsecurity/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ShangHaiMesParent/common/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ShangHaiMesParent/common/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ShangHaiMesParent/gateway/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ShangHaiMesParent/moduleService/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ShangHaiMesParent/moduleService/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ShangHaiMesParent/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/ShangHaiMesParent/src/main/resources" charset="UTF-8" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 0000000..8c84b40
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://repo.maven.apache.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jboss.community" />
+      <option name="name" value="JBoss Community repository" />
+      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="nexus-aliyun" />
+      <option name="name" value="Nexus aliyun" />
+      <option name="url" value="https://maven.aliyun.com/repository/public" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="spring" />
+      <option name="name" value="spring" />
+      <option name="url" value="https://maven.aliyun.com/repository/spring" />
+    </remote-repository>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..c3ad037
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/JiuMuMesParent/pom.xml" />
+        <option value="$PROJECT_DIR$/JiuMuMesParent/common/springsecurity/pom.xml" />
+        <option value="$PROJECT_DIR$/ShangHaiMesParent/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..0134c79
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/ShangHaiMES.iml" filepath="$PROJECT_DIR$/.idea/ShangHaiMES.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
new file mode 100644
index 0000000..2b63946
--- /dev/null
+++ b/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Palette2">
+    <group name="Swing">
+      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
+      </item>
+      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
+        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
+        <initial-values>
+          <property name="text" value="Button" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="RadioButton" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="CheckBox" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="Label" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
+          <preferred-size width="-1" height="20" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
+      </item>
+    </group>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/ShangHaiMesParent/.idea/.gitignore b/ShangHaiMesParent/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/ShangHaiMesParent/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/ShangHaiMesParent/.idea/compiler.xml b/ShangHaiMesParent/.idea/compiler.xml
new file mode 100644
index 0000000..c182859
--- /dev/null
+++ b/ShangHaiMesParent/.idea/compiler.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile default="true" name="Default" enabled="true" />
+      <profile name="Maven default annotation processors profile" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <module name="springsecurity" />
+        <module name="servicebase" />
+        <module name="deviceInteraction" />
+        <module name="gateway" />
+      </profile>
+    </annotationProcessing>
+    <bytecodeTargetLevel>
+      <module name="cacheGlass" target="1.8" />
+      <module name="cacheVerticalGlass" target="1.8" />
+      <module name="glassStorage" target="1.8" />
+      <module name="loadGlass" target="1.8" />
+      <module name="temperingGlass" target="1.8" />
+      <module name="unLoadGlass" target="1.8" />
+    </bytecodeTargetLevel>
+  </component>
+  <component name="JavacSettings">
+    <option name="ADDITIONAL_OPTIONS_OVERRIDE">
+      <module name="cacheGlass" options="-parameters" />
+      <module name="cacheVerticalGlass" options="-parameters" />
+      <module name="deviceInteraction" options="-parameters" />
+      <module name="gateway" options="-parameters" />
+      <module name="glassStorage" options="-parameters" />
+      <module name="loadGlass" options="-parameters" />
+      <module name="servicebase" options="-parameters" />
+      <module name="springsecurity" options="-parameters" />
+      <module name="temperingGlass" options="-parameters" />
+      <module name="unLoadGlass" options="-parameters" />
+    </option>
+  </component>
+</project>
\ No newline at end of file
diff --git a/ShangHaiMesParent/.idea/encodings.xml b/ShangHaiMesParent/.idea/encodings.xml
new file mode 100644
index 0000000..5c2a03a
--- /dev/null
+++ b/ShangHaiMesParent/.idea/encodings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/common/servicebase/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/common/springsecurity/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/common/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/common/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/gateway/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/moduleService/CacheGlassModule/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/moduleService/CacheVerticalGlassModule/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/moduleService/DeviceInteractionModule/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/moduleService/GlassStorageModule/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/moduleService/LoadGlassModule/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/moduleService/TemperingGlassModule/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/moduleService/UnLoadGlassModule/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/moduleService/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/moduleService/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/../../Work/鍖楃幓/apache-maven-3.3.9/repository/org/springframework/boot/spring-boot-starter-parent/2.1.8.RELEASE/src/main/resources" charset="UTF-8" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/ShangHaiMesParent/.idea/inspectionProfiles/Project_Default.xml b/ShangHaiMesParent/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..f771f65
--- /dev/null
+++ b/ShangHaiMesParent/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,26 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="AliAccessStaticViaInstance" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAbstractClassShouldStartWithAbstractNaming" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidApacheBeanUtilsCopy" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidCallStaticSimpleDateFormat" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidComplexCondition" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidNewDateGetTime" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidPatternCompileInMethod" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidUseTimer" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaClassMustHaveAuthor" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaLockShouldWithTryFinally" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaMethodTooLong" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaPackageNaming" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaSneakyThrowsWithoutExceptionType" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaTestClassShouldEndWithTestNaming" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaTransactionMustHaveRollback" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaUseRightCaseForDateFormat" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="DuplicatedCode" enabled="true" level="WEAK WARNING" enabled_by_default="true">
+      <Languages>
+        <language minSize="106" name="Java" />
+      </Languages>
+    </inspection_tool>
+  </profile>
+</component>
\ No newline at end of file
diff --git a/ShangHaiMesParent/.idea/jarRepositories.xml b/ShangHaiMesParent/.idea/jarRepositories.xml
new file mode 100644
index 0000000..159ba94
--- /dev/null
+++ b/ShangHaiMesParent/.idea/jarRepositories.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://repo.maven.apache.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="http://maven.aliyun.com/nexus/content/groups/public" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jboss.community" />
+      <option name="name" value="JBoss Community repository" />
+      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="nexus-aliyun" />
+      <option name="name" value="Nexus aliyun" />
+      <option name="url" value="https://maven.aliyun.com/repository/public" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="spring" />
+      <option name="name" value="spring" />
+      <option name="url" value="https://maven.aliyun.com/repository/spring" />
+    </remote-repository>
+  </component>
+</project>
\ No newline at end of file
diff --git a/ShangHaiMesParent/.idea/libraries/servicebase_1_0_SNAPSHOT.xml b/ShangHaiMesParent/.idea/libraries/servicebase_1_0_SNAPSHOT.xml
new file mode 100644
index 0000000..0d5faa0
--- /dev/null
+++ b/ShangHaiMesParent/.idea/libraries/servicebase_1_0_SNAPSHOT.xml
@@ -0,0 +1,9 @@
+<component name="libraryTable">
+  <library name="servicebase-1.0-SNAPSHOT">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/common/servicebase/target/servicebase-1.0-SNAPSHOT.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES />
+  </library>
+</component>
\ No newline at end of file
diff --git a/ShangHaiMesParent/.idea/libraries/springsecurity_1_0_SNAPSHOT.xml b/ShangHaiMesParent/.idea/libraries/springsecurity_1_0_SNAPSHOT.xml
new file mode 100644
index 0000000..37bbab6
--- /dev/null
+++ b/ShangHaiMesParent/.idea/libraries/springsecurity_1_0_SNAPSHOT.xml
@@ -0,0 +1,9 @@
+<component name="libraryTable">
+  <library name="springsecurity-1.0-SNAPSHOT">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/common/springsecurity/target/springsecurity-1.0-SNAPSHOT.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES />
+  </library>
+</component>
\ No newline at end of file
diff --git a/ShangHaiMesParent/.idea/misc.xml b/ShangHaiMesParent/.idea/misc.xml
new file mode 100644
index 0000000..fb4de18
--- /dev/null
+++ b/ShangHaiMesParent/.idea/misc.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+        <option value="$PROJECT_DIR$/common/springsecurity/pom.xml" />
+      </list>
+    </option>
+    <option name="ignoredFiles">
+      <set>
+        <option value="$PROJECT_DIR$/moduleService/CacheVerticalGlassModule/pom.xml" />
+      </set>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
+</project>
\ No newline at end of file
diff --git a/ShangHaiMesParent/.idea/modules.xml b/ShangHaiMesParent/.idea/modules.xml
new file mode 100644
index 0000000..51856b6
--- /dev/null
+++ b/ShangHaiMesParent/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/moduleService/CacheGlassModule/cacheGlass.iml" filepath="$PROJECT_DIR$/moduleService/CacheGlassModule/cacheGlass.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file
diff --git a/ShangHaiMesParent/.idea/uiDesigner.xml b/ShangHaiMesParent/.idea/uiDesigner.xml
new file mode 100644
index 0000000..2b63946
--- /dev/null
+++ b/ShangHaiMesParent/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Palette2">
+    <group name="Swing">
+      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
+      </item>
+      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
+        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
+        <initial-values>
+          <property name="text" value="Button" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="RadioButton" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="CheckBox" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="Label" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
+          <preferred-size width="-1" height="20" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
+      </item>
+    </group>
+  </component>
+</project>
\ No newline at end of file
diff --git a/ShangHaiMesParent/.idea/vcs.xml b/ShangHaiMesParent/.idea/vcs.xml
new file mode 100644
index 0000000..6c0b863
--- /dev/null
+++ b/ShangHaiMesParent/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/ShangHaiMesParent/JsonFile/PlcCacheGlass.json b/ShangHaiMesParent/JsonFile/PlcCacheGlass.json
new file mode 100644
index 0000000..01969b7
--- /dev/null
+++ b/ShangHaiMesParent/JsonFile/PlcCacheGlass.json
@@ -0,0 +1,64 @@
+{
+   "plcAddressBegin":"DB11.0",
+   "plcAddressLenght":"80",
+   "dataType":"word",
+   "parameteInfor":[
+      {
+         "codeId": "A06_request_word",
+         "addressIndex":"0",
+         "addressLenght":"2", 
+         "ratio":"1", 
+         "unit":"m/min"    
+      },
+      {
+          "codeId": "A05_scanning_ID",
+          "addressIndex":"2",
+          "addressLenght":"30",
+          "ratio":"1",
+          "unit":""
+       },
+       {
+          "codeId": "Current_slot",
+          "addressIndex":"36",
+          "addressLenght":"2",
+          "ratio":"1",
+          "unit":""
+       },
+        {
+          "codeId": "MES_confirmation_word",
+          "addressIndex":"38",
+          "addressLenght":"2",
+          "ratio":"1",
+          "unit":""
+       },
+       {
+          "codeId": "A08_glass_status",
+          "addressIndex":"68",
+          "addressLenght":"2",
+          "ratio":"1",
+          "unit":""
+       },
+       {
+          "codeId": "A10_glass_status",
+          "addressIndex":"70",
+          "addressLenght":"2",
+          "ratio":"1",
+          "unit":""
+       },
+       {
+          "codeId": "A09_prohibit_film_production",
+          "addressIndex":"72",
+          "addressLenght":"2",
+          "ratio":"1",
+          "unit":""
+       }
+       ,
+       {
+          "codeId": "A10_prohibit_film_production",
+          "addressIndex":"74",
+          "addressLenght":"2",
+          "ratio":"1",
+          "unit":""
+       }
+   ]
+}
diff --git a/ShangHaiMesParent/JsonFile/PlcCleaning.json b/ShangHaiMesParent/JsonFile/PlcCleaning.json
new file mode 100644
index 0000000..da2a580
--- /dev/null
+++ b/ShangHaiMesParent/JsonFile/PlcCleaning.json
@@ -0,0 +1,22 @@
+{
+   "plcAddressBegin":"DB1.8000",
+   "plcAddressLenght":"84",
+   "dataType":"word",
+   "parameteInfor":[
+       {
+         "codeId": "edgSpeed",
+         "addressIndex": "48",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "thinness",
+         "addressIndex": "50",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       }
+
+   ]
+}
diff --git a/ShangHaiMesParent/JsonFile/PlcEdging.json b/ShangHaiMesParent/JsonFile/PlcEdging.json
new file mode 100644
index 0000000..41bf3e5
--- /dev/null
+++ b/ShangHaiMesParent/JsonFile/PlcEdging.json
@@ -0,0 +1,190 @@
+{
+   "plcAddressBegin":"0000",
+   "plcAddressLength":"50",
+   "requestHead":"000100000006010300000032",
+   "parameterInfo":[
+       {
+         "codeId": "plcRequest",
+         "addressIndex": "0",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "plcRequestID",
+         "addressIndex": "2",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "plcReport",
+         "addressIndex": "10",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "plcReportID",
+         "addressIndex": "12",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+     {
+       "codeId": "plcReport2",
+       "addressIndex": "16",
+       "addressLength": "2",
+       "type": "word",
+       "unit": ""
+     },
+     {
+       "codeId": "plcReportID2",
+       "addressIndex": "18",
+       "addressLength": "2",
+       "type": "word",
+       "unit": ""
+     },
+       {
+         "codeId": "mesSend",
+         "addressIndex": "20",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "mesSendID",
+         "addressIndex": "22",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "length",
+         "addressIndex": "24",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "width",
+         "addressIndex": "26",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "thickness",
+         "addressIndex": "28",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "mesConfirm",
+         "addressIndex": "38",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "mesConfirmID",
+         "addressIndex": "40",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+     {
+       "codeId": "mesConfirm2",
+       "addressIndex": "46",
+       "addressLength": "2",
+       "type": "word",
+       "unit": ""
+     },
+     {
+       "codeId": "mesConfirmID2",
+       "addressIndex": "48",
+       "addressLength": "2",
+       "type": "word",
+       "unit": ""
+     },
+       {
+         "codeId": "alarmStatus",
+         "addressIndex": "58",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmWord1",
+         "addressIndex": "60",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmWord2",
+         "addressIndex": "62",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmWord3",
+         "addressIndex": "64",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "machineStatusWord",
+         "addressIndex": "68",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut2",
+         "addressIndex": "70",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut3",
+         "addressIndex": "72",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut4",
+         "addressIndex": "74",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut5",
+         "addressIndex": "76",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut6",
+         "addressIndex": "78",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut7",
+         "addressIndex": "80",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       }
+     ]
+
+}
diff --git a/ShangHaiMesParent/JsonFile/PlcFlipSlice.json b/ShangHaiMesParent/JsonFile/PlcFlipSlice.json
new file mode 100644
index 0000000..036eb1f
--- /dev/null
+++ b/ShangHaiMesParent/JsonFile/PlcFlipSlice.json
@@ -0,0 +1,148 @@
+{
+   "plcAddressBegin":"DB100.0",
+   "plcAddressLenght":"568",
+   "dataType":"word",
+   "parameteInfor":[
+       {
+         "codeId": "plcRequest",
+         "addressIndex": "0",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "plcRequestID",
+         "addressIndex": "2",
+         "addressLenght": "256",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "plcRequestType",
+         "addressIndex": "258",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby20",
+         "addressIndex": "260",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby21",
+         "addressIndex": "262",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "plcReport",
+         "addressIndex": "264",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "plcReportID",
+         "addressIndex": "266",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby25",
+         "addressIndex": "268",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby26",
+         "addressIndex": "270",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby27",
+         "addressIndex": "272",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "mesSend",
+         "addressIndex": "274",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "mesSendID",
+         "addressIndex": "276",
+         "addressLenght": "256",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "length",
+         "addressIndex": "532",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+     {
+       "codeId": "width",
+       "addressIndex": "534",
+       "addressLenght": "2",
+       "ratio": "1",
+       "unit": ""
+     },
+     {
+       "codeId": "thickness",
+       "addressIndex": "536",
+       "addressLenght": "2",
+       "ratio": "1",
+       "unit": ""
+     },
+     {
+       "codeId": "standby28",
+       "addressIndex": "538",
+       "addressLenght": "2",
+       "ratio": "1",
+       "unit": ""
+     },
+       {
+         "codeId": "mesSendType",
+         "addressIndex": "540",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby30",
+         "addressIndex": "542",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby31",
+         "addressIndex": "544",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby32",
+         "addressIndex": "546",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       }
+
+   ]
+}
diff --git a/ShangHaiMesParent/JsonFile/PlcLamination.json b/ShangHaiMesParent/JsonFile/PlcLamination.json
new file mode 100644
index 0000000..b30baf0
--- /dev/null
+++ b/ShangHaiMesParent/JsonFile/PlcLamination.json
@@ -0,0 +1,86 @@
+{
+   "plcAddressBegin":"DB44.0",
+   "plcAddressLenght":"22",
+   "dataType":"word",
+   "parameteInfor":[
+       {
+         "codeId": "plcRequest",
+         "addressIndex": "0",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "plcReport",
+         "addressIndex": "2",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "mesSend",
+         "addressIndex": "4",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+
+       {
+         "codeId": "mesSendID",
+         "addressIndex": "6",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "length",
+         "addressIndex": "8",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+     {
+       "codeId": "width",
+       "addressIndex": "10",
+       "addressLenght": "2",
+       "ratio": "1",
+       "unit": ""
+     },
+     {
+       "codeId": "thickness",
+       "addressIndex": "12",
+       "addressLenght": "2",
+       "ratio": "1",
+       "unit": ""
+     },
+       {
+         "codeId": "mesConfirm",
+         "addressIndex": "14",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "mesConfirmID",
+         "addressIndex": "16",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmStatus",
+         "addressIndex": "18",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "machineStatusWord",
+         "addressIndex": "20",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       }
+
+   ]
+}
diff --git a/ShangHaiMesParent/JsonFile/PlcLoad.json b/ShangHaiMesParent/JsonFile/PlcLoad.json
new file mode 100644
index 0000000..9bc560c
--- /dev/null
+++ b/ShangHaiMesParent/JsonFile/PlcLoad.json
@@ -0,0 +1,134 @@
+{
+   "plcAddressBegin":"0000",
+   "plcAddressLength":"50",
+   "requestHead":"000100000006010300000032",
+   "parameterInfo":[
+       {
+         "codeId": "plcRequest",
+         "addressIndex": "0",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "plcRequestID",
+         "addressIndex": "2",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "plcReport",
+         "addressIndex": "10",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "plcReportID",
+         "addressIndex": "12",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "mesSend",
+         "addressIndex": "20",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "mesSendCount",
+         "addressIndex": "22",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "mesConfirm",
+         "addressIndex": "40",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmStatus",
+         "addressIndex": "62",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmWord1",
+         "addressIndex": "64",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmWord2",
+         "addressIndex": "66",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmWord3",
+         "addressIndex": "68",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "machineStatusWord",
+         "addressIndex": "70",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut2",
+         "addressIndex": "72",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut3",
+         "addressIndex": "74",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut4",
+         "addressIndex": "76",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut5",
+         "addressIndex": "78",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut6",
+         "addressIndex": "80",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut7",
+         "addressIndex": "82",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       }
+     ]
+
+}
diff --git a/ShangHaiMesParent/JsonFile/PlcLoad2.json b/ShangHaiMesParent/JsonFile/PlcLoad2.json
new file mode 100644
index 0000000..9b7feb1
--- /dev/null
+++ b/ShangHaiMesParent/JsonFile/PlcLoad2.json
@@ -0,0 +1,134 @@
+{
+   "plcAddressBegin":"0000",
+   "plcAddressLength":"50",
+   "requestHead":"000100000006010300000032",
+   "parameterInfo":[
+       {
+         "codeId": "plcRequest",
+         "addressIndex": "2",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "plcRequestID",
+         "addressIndex": "4",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "plcReport",
+         "addressIndex": "10",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "plcReportID",
+         "addressIndex": "12",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "mesSend",
+         "addressIndex": "20",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "mesSendCount",
+         "addressIndex": "22",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "mesConfirm",
+         "addressIndex": "40",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmStatus",
+         "addressIndex": "62",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmWord1",
+         "addressIndex": "64",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmWord2",
+         "addressIndex": "66",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmWord3",
+         "addressIndex": "68",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "machineStatusWord",
+         "addressIndex": "70",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut2",
+         "addressIndex": "72",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut3",
+         "addressIndex": "74",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut4",
+         "addressIndex": "76",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut5",
+         "addressIndex": "78",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut6",
+         "addressIndex": "80",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut7",
+         "addressIndex": "82",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       }
+     ]
+
+}
diff --git a/ShangHaiMesParent/JsonFile/PlcMarking.json b/ShangHaiMesParent/JsonFile/PlcMarking.json
new file mode 100644
index 0000000..3436006
--- /dev/null
+++ b/ShangHaiMesParent/JsonFile/PlcMarking.json
@@ -0,0 +1,318 @@
+{
+   "plcAddressBegin":"DB14.0",
+   "plcAddressLenght":"1096",
+   "dataType":"word",
+   "parameteInfor":[
+       {
+         "codeId": "plcRequest",
+         "addressIndex": "0",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "plcRequestID",
+         "addressIndex": "2",
+         "addressLenght": "4",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby19",
+         "addressIndex": "6",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby20",
+         "addressIndex": "8",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby21",
+         "addressIndex": "10",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "plcReport",
+         "addressIndex": "12",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "plcReportID",
+         "addressIndex": "14",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby25",
+         "addressIndex": "18",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby26",
+         "addressIndex": "20",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby27",
+         "addressIndex": "22",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "mesSend",
+         "addressIndex": "24",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+
+       {
+         "codeId": "mesSendID",
+         "addressIndex": "26",
+         "addressLenght": "4",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "drawingMark",
+         "addressIndex": "30",
+         "addressLenght": "256",
+         "ratio": "1",
+         "unit": ""
+       },
+     {
+       "codeId": "drawingMark2",
+       "addressIndex": "258",
+       "addressLenght": "256",
+       "ratio": "1",
+       "unit": ""
+     },
+     {
+       "codeId": "drawingMark3",
+       "addressIndex": "542",
+       "addressLenght": "256",
+       "ratio": "1",
+       "unit": ""
+     },
+     {
+       "codeId": "drawingMark4",
+       "addressIndex": "798",
+       "addressLenght": "236",
+       "ratio": "1",
+       "unit": ""
+     },
+
+       {
+         "codeId": "isMark",
+         "addressIndex": "1034",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "width(OutOfService)",
+         "addressIndex": "1036",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "length(OutOfService)",
+         "addressIndex": "1038",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "thickness(OutOfService)",
+         "addressIndex": "1040",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "sumCount(OutOfService)",
+         "addressIndex": "1042",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby34",
+         "addressIndex": "1044",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "markingMode",
+         "addressIndex": "1046",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby36",
+         "addressIndex": "1048",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "mesConfirm",
+         "addressIndex": "1050",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "mesConfirmID",
+         "addressIndex": "1052",
+         "addressLenght": "4",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby39",
+         "addressIndex": "1056",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby40",
+         "addressIndex": "1058",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby41",
+         "addressIndex": "1060",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby42",
+         "addressIndex": "1062",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby43",
+         "addressIndex": "1064",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby44",
+         "addressIndex": "1066",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "MesTaskStatus",
+         "addressIndex": "1068",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby46",
+         "addressIndex": "1070",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmStatus",
+         "addressIndex": "1072",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmWord1",
+         "addressIndex": "1074",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmWord2",
+         "addressIndex": "1076",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmWord3",
+         "addressIndex": "1078",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmWord4",
+         "addressIndex": "1080",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "machineStatusWord",
+         "addressIndex": "1082",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut2",
+         "addressIndex": "1084",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut3",
+         "addressIndex": "1086",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut4",
+         "addressIndex": "1088",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut5",
+         "addressIndex": "1090",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       }
+
+   ]
+}
diff --git a/ShangHaiMesParent/JsonFile/PlcRotate.json b/ShangHaiMesParent/JsonFile/PlcRotate.json
new file mode 100644
index 0000000..19d1be1
--- /dev/null
+++ b/ShangHaiMesParent/JsonFile/PlcRotate.json
@@ -0,0 +1,169 @@
+{
+   "plcAddressBegin":"DB100.0",
+   "plcAddressLenght":"554",
+   "dataType":"word",
+   "parameteInfor":[
+       {
+         "codeId": "plcRequest",
+         "addressIndex": "0",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "plcRequestID",
+         "addressIndex": "2",
+         "addressLenght": "256",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "plcRequestType",
+         "addressIndex": "258",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby20",
+         "addressIndex": "260",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby21",
+         "addressIndex": "262",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "plcReport",
+         "addressIndex": "264",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "plcReportID",
+         "addressIndex": "266",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby25",
+         "addressIndex": "268",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby26",
+         "addressIndex": "270",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby27",
+         "addressIndex": "272",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "mesSend",
+         "addressIndex": "274",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "mesSendID",
+         "addressIndex": "276",
+         "addressLenght": "256",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "length",
+         "addressIndex": "532",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+     {
+       "codeId": "width",
+       "addressIndex": "534",
+       "addressLenght": "2",
+       "ratio": "1",
+       "unit": ""
+     },
+     {
+       "codeId": "thickness",
+       "addressIndex": "536",
+       "addressLenght": "2",
+       "ratio": "1",
+       "unit": ""
+     },
+     {
+       "codeId": "rotateType",
+       "addressIndex": "538",
+       "addressLenght": "2",
+       "ratio": "1",
+       "unit": ""
+     },
+       {
+         "codeId": "mesSendType",
+         "addressIndex": "540",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby30",
+         "addressIndex": "542",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby31",
+         "addressIndex": "544",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+       {
+         "codeId": "standby32",
+         "addressIndex": "546",
+         "addressLenght": "2",
+         "ratio": "1",
+         "unit": ""
+       },
+     {
+       "codeId": "mesConfirm",
+       "addressIndex": "548",
+       "addressLenght": "2",
+       "ratio": "1",
+       "unit": ""
+     },
+     {
+       "codeId": "mesConfirmID",
+       "addressIndex": "550",
+       "addressLenght": "2",
+       "ratio": "1",
+       "unit": ""
+     },
+     {
+       "codeId": "standby35",
+       "addressIndex": "552",
+       "addressLenght": "2",
+       "ratio": "1",
+       "unit": ""
+     }
+
+   ]
+}
diff --git a/ShangHaiMesParent/JsonFile/PlcSilkScreen.json b/ShangHaiMesParent/JsonFile/PlcSilkScreen.json
new file mode 100644
index 0000000..948f9ce
--- /dev/null
+++ b/ShangHaiMesParent/JsonFile/PlcSilkScreen.json
@@ -0,0 +1,184 @@
+{
+   "plcAddressBegin":"0000",
+   "plcAddressLength":"40",
+   "requestHead":"000100000006010300000028",
+   "parameterInfo":[
+       {
+         "codeId": "plcRequest",
+         "addressIndex": "0",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "plcRequestID",
+         "addressIndex": "2",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "plcReport",
+         "addressIndex": "10",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "plcReportID",
+         "addressIndex": "12",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "mesSend",
+         "addressIndex": "20",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "mesSendID",
+         "addressIndex": "22",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "length",
+         "addressIndex": "24",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+
+       {
+         "codeId": "width",
+         "addressIndex": "26",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "thickness",
+         "addressIndex": "28",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "X",
+         "addressIndex": "30",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "Y",
+         "addressIndex": "32",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "isSilkScreen",
+         "addressIndex": "34",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+        },
+       {
+         "codeId": "mesConfirm",
+         "addressIndex": "40",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "mesConfirmID",
+         "addressIndex": "42",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmStatus",
+         "addressIndex": "60",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmWord1",
+         "addressIndex": "62",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmWord2",
+         "addressIndex": "64",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "alarmWord3",
+         "addressIndex": "66",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "machineStatusWord",
+         "addressIndex": "68",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut2",
+         "addressIndex": "70",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut3",
+         "addressIndex": "72",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut4",
+         "addressIndex": "74",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut5",
+         "addressIndex": "76",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut6",
+         "addressIndex": "78",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       },
+       {
+         "codeId": "inputOrOut7",
+         "addressIndex": "80",
+         "addressLength": "2",
+         "type": "word",
+         "unit": ""
+       }
+     ]
+
+}
diff --git a/ShangHaiMesParent/common/pom.xml b/ShangHaiMesParent/common/pom.xml
new file mode 100644
index 0000000..f46dc53
--- /dev/null
+++ b/ShangHaiMesParent/common/pom.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>ShangHaiMesParent</artifactId>
+        <groupId>com.mes</groupId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>common</artifactId>
+    <packaging>pom</packaging>
+    <modules>
+        <module>servicebase</module>
+<!--        <module>springsecurity</module>-->
+    </modules>
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+    <dependencies>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <!--        mybatis-plus-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.3.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.yulichang</groupId>
+            <artifactId>mybatis-plus-join-boot-starter</artifactId>
+            <version>1.4.8</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+            <version>3.3.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.8</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpcore</artifactId>
+            <version>4.4.12</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.6</version>
+        </dependency>
+
+        <!--    瀵煎叆mysql椹卞姩    -->
+        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.17</version>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <version>2.5</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.validation</groupId>
+            <artifactId>validation-api</artifactId>
+            <version>2.0.1.Final</version>
+        </dependency>
+
+        <!--浠g爜鐢熸垚宸ュ叿-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <version>3.4.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+            <version>2.0</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.alibaba</groupId>
+                    <artifactId>fastjson</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>1.1.8</version>
+        </dependency>
+
+        <!--  鏁版嵁搴撹璁℃枃妗g敓鎴愬伐鍏�-->
+        <dependency>
+            <groupId>cn.smallbun.screw</groupId>
+            <artifactId>screw-core</artifactId>
+            <version>1.0.5</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.alibaba</groupId>
+                    <artifactId>fastjson</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!--        2.0~2.2	Knife4j 2.0.0 ~ 2.0.6-->
+        <!--        <dependency>-->
+        <!--            <groupId>com.github.xiaoymin</groupId>-->
+        <!--            <artifactId>knife4j-spring-boot-starter</artifactId>-->
+        <!--            <version>2.0.6</version>-->
+        <!--        </dependency>-->
+
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>2.7.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>2.7.0</version>
+        </dependency>
+
+        <!--hutool java楠岃瘉鏂规硶绫�-->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.4.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.xingshuangs</groupId>
+            <artifactId>iot-communication</artifactId>
+            <version>1.4.2</version>
+        </dependency>
+
+        <!--寮曞叆redis,鎺掗櫎lettuce鐨勫紩鐢�-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>io.lettuce</groupId>
+                    <artifactId>lettuce-core</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- 寮曞叆Jedis瀹㈡埗绔�-->
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.33</version>
+        </dependency>
+
+        <!--        <dependency>-->
+        <!--            <groupId>com.github.yulichang</groupId>-->
+        <!--            <artifactId>mybatis-plus-join</artifactId>-->
+        <!--            <version>1.2.4</version>-->
+        <!--        </dependency>-->
+        <dependency>
+            <groupId>com.github.yulichang</groupId>
+            <artifactId>mybatis-plus-join-boot-starter</artifactId>
+            <version>1.4.12</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-thymeleaf</artifactId>
+        </dependency>
+    </dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/ShangHaiMesParent/common/servicebase/pom.xml b/ShangHaiMesParent/common/servicebase/pom.xml
new file mode 100644
index 0000000..f82a579
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/pom.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>common</artifactId>
+        <groupId>com.mes</groupId>
+        <version>1.0-SNAPSHOT</version>
+
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>servicebase</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>com.microsoft.sqlserver</groupId>
+            <artifactId>mssql-jdbc</artifactId>
+            <version>6.4.0.jre8</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.s7connector</groupId>
+            <artifactId>s7connector</artifactId>
+            <version>2.1</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/ShangHaiMesParent/common/servicebase/servicebase1.iml b/ShangHaiMesParent/common/servicebase/servicebase1.iml
new file mode 100644
index 0000000..f76df2b
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/servicebase1.iml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java
new file mode 100644
index 0000000..2ea5807
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java
@@ -0,0 +1,172 @@
+package com.mes.common.config;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/4/24 10:33
+ * @Description:
+ */
+public class Const {
+    //榛樿瀵嗙爜
+    public static final String DEFULT_PASSWORD = "123456";
+    //榛樿瑙掕壊
+    public static final Long DEFULT_ROLE = 1L;
+
+    /**
+     * 纾ㄨ竟娓呮礂鍓�
+     */
+    /**
+     * A09鍑虹墖鐩爣浣嶇疆  d02鍗ц浆绔�    2001
+     * A10鍑虹墖鐩爣浣嶇疆  d05鍗ц浆绔�    2002
+     */
+    public static final Integer OUT_TARGET_POSITION_ZERO = 0;
+    public static final Integer A09_OUT_TARGET_POSITION = 2001;
+    public static final Integer A10_OUT_TARGET_POSITION = 2002;
+
+
+    /**
+     * A09鍑虹墖鐩爣浣嶇疆  d02鍗ц浆绔� 閽㈠寲鍑虹墖    3001
+     * A10鍑虹墖鐩爣浣嶇疆  d05鍗ц浆绔� 浜哄伐鍑虹墖    3002
+     */
+    public static final Integer TEMPERING_OUT_TARGET_POSITION = 3001;
+    public static final Integer ARTIFICIAL_OUT_TARGET_POSITION = 3002;
+
+    /**
+     * 鍗у紡鐞嗙墖绗艰鎯呰〃鐜荤拑鐘舵��
+     * 璇嗗埆鍚庢垚鍔熺姸鎬�0
+     * 璇嗗埆鍚庢垚鍔熻繘绗肩殑鐘舵��100
+     * 鍑虹墖浠诲姟101
+     * 浜哄伐涓嬬墖102
+     * 鍑虹墖涓�103
+     * 璋冨害涓�104
+     * 鎷胯蛋200
+     * 鐮存崯201
+     */
+    public static final Integer GLASS_STATE_NEW = 0;
+    public static final Integer GLASS_STATE_IN = 100;
+    public static final Integer GLASS_STATE_OUT = 101;
+    public static final Integer GLASS_STATE_ARTIFICIAL = 102;
+    public static final Integer GLASS_STATE_OUT_ING = 103;
+    public static final Integer GLASS_STATE_SCHEDULE_ING = 104;
+    public static final Integer GLASS_STATE_TAKE = 200;
+    public static final Integer GLASS_STATE_DAMAGE = 201;
+    public static final List<Integer> GLASS_STATE_IN_ALL = Arrays.asList(100, 102, 103, 104);
+    public static final List<Integer> GLASS_STATE_IN_ALL_ZERO = Arrays.asList(0, 100, 102, 103, 104);
+
+    /**
+     * 鍗у紡鐞嗙墖绗艰鎯呰〃鐜荤拑鐘舵��
+     * 杩涚墖浠诲姟1
+     * 鍑虹墖浠诲姟2
+     */
+    public static final Integer GLASS_CACHE_TYPE_IN = 1;
+    public static final Integer GLASS_CACHE_TYPE_OUT = 2;
+    public static final Integer GLASS_CACHE_TYPE_THROUGH = 3;
+    public static final List<Integer> GLASS_CACHE_TYPE_OUT_ALL = Arrays.asList(2, 3);
+
+    /**
+     * 纾ㄨ竟浠诲姟鐜荤拑鐘舵��
+     * 杩涚墖浠诲姟1
+     * 鍑虹墖浠诲姟2
+     */
+    public static final Integer EDG_GLASS_BEFORE = 0;
+    public static final Integer EDG_GLASS_START = 1;
+    public static final Integer EDG_GLASS_SUCCESS = 2;
+
+    /**
+     * 纾ㄨ竟浠诲姟鐜荤拑鐘舵��
+     * 1鍗曟満鑷姩鐘舵��
+     * 2鑱旀満鑷姩鐘舵��
+     * 3鎵嬪姩鐘舵��
+     */
+    public static final Integer BIG_STORAGE_STAND_ALONE = 1;
+    public static final Integer BIG_STORAGE_ONLINE = 2;
+    public static final Integer BIG_STORAGE_MT = 3;
+
+    /**
+     * 澶х悊鐗囩璇锋眰
+     * 0 澶х悊鐗囩鏃犺姹�
+     * 1 澶х悊鐗囩杩涚墖璇锋眰
+     */
+    public static final String BIG_STORAGE_REQUEST = "0";
+    public static final String BIG_STORAGE_REQUEST_IN = "1";
+
+    /**
+     * 鍗ц浆绔嬭繘鐗囪姹�
+     * 1 浠诲姟鐢熸垚
+     * 2 鍗ц浆绔嬭繘鐗囧畬鎴�
+     * 3 澶ц溅杩涚墖瀹屾垚
+     * 4 澶х悊鐗囩杩涚墖瀹屾垚
+     * 5 澶х悊鐗囩杩涚墖澶辫触
+     * 6 澶х悊鐗囩杩涚墖鐮存崯
+     */
+    public static final Integer BIG_STORAGE_IN_NEW = 1;
+    public static final Integer BIG_STORAGE_IN_UP = 2;
+    public static final Integer BIG_STORAGE_IN_CAR = 3;
+    public static final Integer BIG_STORAGE_IN_SLOT = 4;
+    public static final Integer BIG_STORAGE_IN_ERROR = 5;
+    public static final Integer BIG_STORAGE_IN_DAMAGE = 6;
+    public static final List<Integer> BIG_STORAGE_IN_UP_ALL = Arrays.asList(1, 2);
+    /**
+     * 鍗ц浆绔嬪嚭鐗囪姹�
+     * 1 浠诲姟鐢熸垚
+     * 2 鐜荤拑杩涘ぇ杞﹀畬鎴�
+     * 3 澶ц溅鍑虹墖瀹屾垚
+     * 4 澶х悊鐗囩杩涚墖澶辫触
+     * 5 澶х悊鐗囩杩涚墖鐮存崯
+     */
+    public static final Integer BIG_STORAGE_OUT_NEW = 1;
+    public static final Integer BIG_STORAGE_OUT_CAR = 2;
+    public static final Integer BIG_STORAGE_OUT_SUCCESS = 3;
+    public static final Integer BIG_STORAGE_OUT_ERROR = 4;
+    public static final Integer BIG_STORAGE_OUT_DAMAGE = 5;
+    public static final List<Integer> BIG_STORAGE_OUT_ALL = Arrays.asList(2, 3);
+
+    /**
+     * 鍗ц浆绔嬪嚭鐗囪姹�
+     * 1 涓婅溅绛夊緟
+     * 2 涓婅溅鍚姩
+     */
+    public static final Integer BIG_STORAGE_IN_WAIT = 1;
+    public static final Integer BIG_STORAGE_IN_RUN = 2;
+
+    /**
+     * 閽㈠寲灏忕墖琛�
+     * -1 鐢熸垚浠诲姟
+     * 0  鍑虹墖瀹屾垚
+     * 1  鎽嗙墖瀹屾垚
+     * 2  杩涚倝瀹屾垚
+     * 3  閽㈠寲瀹屾垚
+     * 4  鍑虹墖瀹屾垚
+     * 5  鐮存崯
+     * 6  鎷胯蛋
+     */
+
+    public static final Integer TEMPERING_NEW = -1;
+    public static final Integer TEMPERING_OUT = 0;
+    public static final Integer TEMPERING_DROP = 1;
+    public static final Integer TEMPERING_START = 2;
+    public static final Integer TEMPERING_SUCCESS = 3;
+    public static final Integer TEMPERING_END = 4;
+    public static final Integer TEMPERING_DAMAGE = 5;
+    public static final Integer TEMPERING_TAKE = 6;
+
+    /**
+     * 涓嬬墖
+     */
+    /**
+     * 鎵ц绾胯矾鏍煎瓙淇℃伅
+     */
+    public static final List<Integer> G06_WORK_STATION = Arrays.asList(1, 2, 3);
+    public static final List<Integer> G11_WORK_STATION = Arrays.asList(4, 5, 6);
+    public static final int G13_WORK_STATION = 7;
+
+    /**
+     * 鍚敤 1
+     * 绂佺敤 0
+     */
+    public static final Integer SLOT_ON = 1;
+    public static final Integer SLOT_OFF = 0;
+
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/config/MybatisPlusConfig.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/config/MybatisPlusConfig.java
new file mode 100644
index 0000000..94e02f0
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/config/MybatisPlusConfig.java
@@ -0,0 +1,30 @@
+package com.mes.common.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+/**
+ * @author zhoush
+ * @Date 2024/1/26 13:44
+ */
+
+@MapperScan(basePackages = "com.mes.*.mapper")
+@Configuration
+public class MybatisPlusConfig {
+
+    /**
+     * 娣诲姞鍒嗛〉鎻掍欢
+     */
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+        return interceptor;
+    }
+
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/config/Swagger2Config.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/config/Swagger2Config.java
new file mode 100644
index 0000000..0062ed2
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/config/Swagger2Config.java
@@ -0,0 +1,78 @@
+package com.mes.common.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.ParameterBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.schema.ModelRef;
+import springfox.documentation.service.*;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.contexts.SecurityContext;
+import springfox.documentation.spring.web.plugins.Docket;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author zhan_py
+ * @Date 2024/1/26 16:11
+ * Swagger2閰嶇疆淇℃伅
+ */
+@Configuration
+public class Swagger2Config {
+
+    @Bean
+    public Docket webApiConfig() {
+        List<Parameter> pars = new ArrayList<>();
+        ParameterBuilder tokenPar = new ParameterBuilder();
+        tokenPar.name("userId")
+                .description("鐢ㄦ埛token")
+                //.defaultValue(JwtHelper.createToken(1L, "admin"))
+                .defaultValue("1")
+                .modelRef(new ModelRef("string"))
+                .parameterType("header")
+                .required(false)
+                .build();
+        pars.add(tokenPar.build());
+
+        return new Docket(DocumentationType.SWAGGER_2)
+                .groupName("webApi")
+                .apiInfo(webApiInfo())
+                .select()
+                //鍙樉绀篴pi璺緞涓嬬殑椤甸潰
+                .apis(RequestHandlerSelectors.basePackage("com.mes"))
+                .paths(PathSelectors.any())
+                .build()
+                .globalOperationParameters(pars)
+                .securitySchemes(Collections.EMPTY_LIST)
+                .securityContexts(Arrays.asList(securityContext()));
+    }
+
+    private SecurityContext securityContext() {
+        return SecurityContext.builder()
+                .securityReferences(defaultAuth())
+                .forPaths(PathSelectors.any())
+                .build();
+    }
+
+    private List<SecurityReference> defaultAuth() {
+        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
+        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
+        authorizationScopes[0] = authorizationScope;
+        return Arrays.asList(new SecurityReference("Authorization", authorizationScopes));
+    }
+
+
+    private ApiInfo webApiInfo() {
+        return new ApiInfoBuilder()
+                .title("缃戠珯-API鏂囨。")
+                .description("鏈枃妗f弿杩颁簡mes缃戠珯寰湇鍔℃帴鍙e畾涔�")
+                .version("1.0")
+                .contact(new Contact("zhan_py", "", ""))
+                .build();
+    }
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/config/WebSocketConfig.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/config/WebSocketConfig.java
new file mode 100644
index 0000000..f5d16bf
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/config/WebSocketConfig.java
@@ -0,0 +1,21 @@
+package com.mes.common.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+/**
+ * @author SNG-010
+ */
+@Configuration
+public class WebSocketConfig {
+    /**
+     * bean娉ㄥ唽锛氫細鑷姩鎵弿甯︽湁@ServerEndpoint娉ㄨВ澹版槑鐨刉ebsocket Endpoint(绔偣)锛屾敞鍐屾垚涓篧ebsocket bean銆�
+     * 瑕佹敞鎰忥紝濡傛灉椤圭洰浣跨敤澶栫疆鐨剆ervlet瀹瑰櫒锛岃�屼笉鏄洿鎺ヤ娇鐢╯pringboot鍐呯疆瀹瑰櫒鐨勮瘽锛屽氨涓嶈娉ㄥ叆ServerEndpointExporter锛屽洜涓哄畠灏嗙敱瀹瑰櫒鑷繁鎻愪緵鍜岀鐞嗐��
+     */
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/exception/GlobalExceptionHandler.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/exception/GlobalExceptionHandler.java
new file mode 100644
index 0000000..2d10ece
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/exception/GlobalExceptionHandler.java
@@ -0,0 +1,32 @@
+package com.mes.common.exception;
+
+import com.mes.utils.Result;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+/**
+ * @author zhoush
+ * @Date 2024/1/26 15:31
+ */
+@ControllerAdvice
+@Slf4j
+public class GlobalExceptionHandler {
+    /**
+     * 濡傛灉鏄痵erviceExcaption锛屽垯璋冪敤璇ユ柟娉�
+     */
+    @ExceptionHandler(ServiceException.class)
+    @ResponseBody
+    public Result handle(ServiceException se) {
+        return Result.error(se.getCode(), se.getMessage());
+    }
+
+    @ExceptionHandler(Exception.class)
+    @ResponseBody
+    public Result<Object> error(Exception e) {
+        e.printStackTrace();
+        return Result.error();
+    }
+
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/exception/ServiceException.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/exception/ServiceException.java
new file mode 100644
index 0000000..0c9ddbc
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/exception/ServiceException.java
@@ -0,0 +1,14 @@
+package com.mes.common.exception;
+
+import com.mes.utils.ResultCodeEnum;
+import lombok.Getter;
+
+@Getter
+public class ServiceException extends RuntimeException {
+    private Integer code;
+
+    public ServiceException(ResultCodeEnum resultCodeEnum, String msg) {
+        super(msg);
+        this.code = resultCodeEnum.getCode();
+    }
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/handler/MyMetaObjectHandler.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/handler/MyMetaObjectHandler.java
new file mode 100644
index 0000000..fb96335
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/common/handler/MyMetaObjectHandler.java
@@ -0,0 +1,22 @@
+package com.mes.common.handler;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import org.apache.ibatis.reflection.MetaObject;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+@Component
+public class MyMetaObjectHandler implements MetaObjectHandler {
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        //灞炴�у悕绉帮紝涓嶆槸瀛楁鍚嶇О
+        this.setFieldValByName("gmtCreate", new Date(), metaObject);
+        this.setFieldValByName("gmtModified", new Date(), metaObject);
+    }
+
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        this.setFieldValByName("gmtModified", new Date(), metaObject);
+    }
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/device/PlcBitInfo.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/device/PlcBitInfo.java
new file mode 100644
index 0000000..bc14c50
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/device/PlcBitInfo.java
@@ -0,0 +1,85 @@
+package com.mes.device;
+
+public class PlcBitInfo {
+
+    public PlcBitInfo(String startAddress) {
+        this.startAddress = startAddress;
+    }
+
+    private String startAddress;
+    // 鍙傛暟鏍囪瘑
+    private String codeId;
+
+    // 鍙傛暟鍚嶇О
+    private String name;
+
+    // 璇诲彇 鍙傛暟鍊�
+    private Boolean value;
+    // 鍙傛暟鍦板潃
+    private int addressIndex;
+
+    public String getCodeId() {
+        return this.codeId;
+    }
+
+    public void setCodeId(String codeId) {
+        this.codeId = codeId;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Boolean getValue() {
+        return this.value;
+    }
+
+    public void setValue(Boolean value) {
+        this.value = value;
+    }
+
+
+    public int getAddressIndex() {
+        return this.addressIndex;
+    }
+
+    /**
+     * 鑾峰彇鍦板潃
+     *
+     * @param index 绱㈠紩鍦板潃
+     */
+    public String getAddress(int index) {
+        String[] stringdatas = this.startAddress.trim().split("\\.");
+        if (stringdatas.length < 2) {
+            return null;
+        }
+        int dbwindex = 0;
+        int bitindex = 0;
+        if (stringdatas.length == 3) {
+            dbwindex = Integer.parseInt(stringdatas[1]);
+            bitindex = Integer.parseInt(stringdatas[2]);
+        } else
+        {
+            return null;
+        }
+        dbwindex += index / 8;
+        bitindex += index % 8;
+        return stringdatas[0] + "." + dbwindex + "." + bitindex;
+    }
+    /**
+     * 鑾峰彇鍦板潃
+     *
+     */
+    public String getAddress() {
+      return   getAddress(this.addressIndex);
+    }
+
+
+    public void setAddressIndex(int addressindex) {
+        this.addressIndex = addressindex;
+    }
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/device/PlcBitObject.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/device/PlcBitObject.java
new file mode 100644
index 0000000..9f7cd3f
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/device/PlcBitObject.java
@@ -0,0 +1,124 @@
+package com.mes.device;
+
+import java.util.*;
+
+public class PlcBitObject {
+
+    // 璇ユā鍧楁暟鎹被鍨嬶紝鏁版嵁璧峰浣嶇疆
+    private String plcAddressBegin;
+    // 鏁版嵁鍦板潃闀垮害锛氱涓�鍙傛暟鍒版渶鍚庝竴涓弬鏁扮殑闀垮害
+    private int plcAddressLength;
+    //private ArrayList<PlcBitInfo> plcBitList;
+    private LinkedHashMap<String,PlcBitInfo> plcBitMap;
+
+    /**
+     * @return 鏁版嵁鍖哄紑濮嬪湴鍧�
+     */
+    public String getPlcAddressBegin() {
+        return plcAddressBegin;
+    }
+
+    /**
+     * @param plcAddressBegin 璁剧疆鏁版嵁鍖哄紑濮嬪湴鍧�
+     */
+    public void setPlcAddressBegin(String plcAddressBegin) {
+        this.plcAddressBegin = plcAddressBegin;
+    }
+
+    /**
+     * @return 鏁版嵁鍖� 璇诲彇鎵�鏈夋暟鎹墍闇�鐨勯暱搴︼紙浠yte绫诲瀷涓哄熀鍑嗭級
+     */
+    public int getPlcAddressLength() {
+        return plcAddressLength;
+    }
+
+    /**
+     * @return 璁剧疆锛氭暟鎹尯 璇诲彇鎵�鏈夋暟鎹墍闇�鐨勯暱搴︼紙浠yte绫诲瀷涓哄熀鍑嗭級
+     */
+    public void setPlcAddressLength(int plcAddressLength) {
+        this.plcAddressLength = plcAddressLength;
+    }
+
+    /**
+     * @return 鑾峰彇鍙傛暟瀹炰緥闆嗗悎
+     */
+    public LinkedHashMap<String,PlcBitInfo> getBitMap() {
+        return plcBitMap;
+    }
+
+    /**
+     * 鏍规嵁鍙傛暟鏍囪瘑 鑾峰彇鏌愪釜鍙傛暟瀹炰緥
+     *
+     * @param codeid 鍙傛暟鏍囪瘑
+     * @return 鑾峰彇鏌愪釜鍙傛暟瀹炰緥
+     */
+    public PlcBitInfo getPlcBit(String codeid) {
+        if (plcBitMap != null) {
+            /*for (PlcBitInfo plcbitInfo : plcBitList) {
+                if (plcbitInfo.getCodeId().equals(codeid))
+                    return plcbitInfo;
+            }*/
+            return plcBitMap.get(codeid);
+        } else
+        {
+            return null;
+        }
+    }
+
+    /**
+     * 鏍规嵁鍙傛暟鏍囪瘑 鑾峰彇鏌愪釜鍙傛暟瀹炰緥
+     *
+     * @param codeids 鍙傛暟鏍囪瘑
+     * @return 鑾峰彇鏌愪釜鍙傛暟瀹炰緥
+     */
+    public List<Boolean> getPlcBitValues(List<String> codeids) {
+        List<Boolean> arrayList = new ArrayList<>();
+        if (plcBitMap != null) {
+            for (String codeId : codeids) { // 鎸夌収浼犲叆鍙傛暟鐨勯『搴忛亶鍘�
+                    arrayList.add(plcBitMap.get(codeId).getValue());
+            }
+        }
+        return arrayList;
+    }
+
+
+    public List<String> getAddressListByCodeId(List<String> codeIdList) {
+        List<String> addressList = new ArrayList<>();
+        for (String codeId : codeIdList) {
+            addressList.add(plcBitMap.get(codeId).getAddress());
+        }
+        return addressList;
+    }
+
+
+    /**
+     * 娣诲姞鍙傛暟瀹炰緥
+     *
+     * @param param 鍙傛暟瀹炰緥
+     */
+    public void addPlcBit(PlcBitInfo param) {
+        if (plcBitMap != null) {
+            plcBitMap.put(param.getCodeId(), param);
+        }
+        else {
+            plcBitMap = new LinkedHashMap<String,PlcBitInfo>();
+            plcBitMap.put(param.getCodeId(),param);
+        }
+    }
+
+    /**
+     * 鏍规嵁PLC杩斿洖鐨勬暟鎹� 缁欏弬鏁板疄渚嬭祴鍊�
+     *
+     * @param plcValueArray PLC璇诲彇鍥炴潵鐨刡yte绫诲瀷鏁版嵁闆嗗悎
+     */
+    public void setPlcBitList(List<Boolean> plcValueArray) {
+        if (plcBitMap != null) {
+            Collection<PlcBitInfo> values=plcBitMap.values();
+            for (PlcBitInfo plcbitInfo : values) {
+                plcbitInfo.setValue(plcValueArray.get(plcbitInfo.getAddressIndex()));
+            }
+        }
+    }
+
+
+}
\ No newline at end of file
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/device/PlcParameterInfo.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/device/PlcParameterInfo.java
new file mode 100644
index 0000000..313adc2
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/device/PlcParameterInfo.java
@@ -0,0 +1,126 @@
+package com.mes.device;
+
+public class PlcParameterInfo {
+    public PlcParameterInfo(String startAddress) {
+        this.startAddress = startAddress;
+    }
+
+    private String startAddress;
+    // 鍙傛暟鏍囪瘑
+    private String codeId;
+
+    // 鍙傛暟鍚嶇О
+    private String name;
+
+    // 璇诲彇 鍙傛暟鍊�
+    private String value;
+
+    // // 鍐欏叆 鍙傛暟鍊�
+    // private String writeValue;
+
+    // 鍙傛暟鍗曚綅
+    private String unit;
+
+    // 鍙傛暟鍊艰浆鎹㈢郴鏁�
+    private int ratio;
+
+    // 鍙傛暟鍦板潃
+    private int addressIndex;
+
+    // 鍙傛暟鍦板潃浣嶉暱搴�
+    private int addressLength;
+
+    public String getCodeId() {
+        return this.codeId;
+    }
+
+    public void setCodeId(String codeId) {
+        this.codeId = codeId;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getValue() {
+        return this.value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    // public String getWriteValue() {
+    //     return this.writeValue;
+    // }
+
+    // public void setWriteValue(String writeValue) {
+    //     this.writeValue = writeValue;
+    // }
+
+    public String getUnit() {
+        return this.unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    public int getAddressIndex() {
+        return this.addressIndex;
+    }
+
+    public void setAddressIndex(int addressindex) {
+        this.addressIndex = addressindex;
+    }
+
+    public int getAddressLength() {
+        return this.addressLength;
+    }
+
+    public void setAddressLength(int addresslength) {
+        this.addressLength = addresslength;
+    }
+
+    public int getRatio() {
+        return this.ratio;
+    }
+
+    public void setRatio(int ratio) {
+        this.ratio = ratio;
+    }
+
+    /**
+     * 鑾峰彇鍦板潃
+     *
+     * @param index 绱㈠紩鍦板潃
+     */
+    public String getAddress(int index) {
+        String[] stringdatas = this.startAddress.trim().split("\\.");
+        int addressLength = this.addressLength;
+        if (addressLength < 2) {
+            return null;
+        }
+        int wordindex = Integer.parseInt(stringdatas[1]) + index;
+        return stringdatas[0] + "." + wordindex;
+      /*  if (addressLength == 2) {
+
+
+            return stringdatas[0] + "." + wordindex;
+        }
+        if (addressLength == 14) {
+            int wordindex = index;
+            int newIndex = wordindex + 13;
+            return stringdatas[0] + "." + wordindex + "-" + newIndex;
+        }*/
+//        return null;
+    }
+
+    public String getAddress() {
+        return getAddress(this.addressIndex);
+    }
+}
\ No newline at end of file
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/device/PlcParameterObject.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/device/PlcParameterObject.java
new file mode 100644
index 0000000..ce85b01
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/device/PlcParameterObject.java
@@ -0,0 +1,254 @@
+package com.mes.device;
+
+import com.github.s7connector.impl.serializer.converter.StringConverter;
+import com.github.xingshuangs.iot.utils.IntegerUtil;
+import com.github.xingshuangs.iot.utils.ShortUtil;
+import com.mes.service.PlcAgreement;
+import com.mes.service.PlcParameter;
+import lombok.extern.slf4j.Slf4j;
+
+import java.lang.reflect.Array;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+@Slf4j
+public class PlcParameterObject {
+
+    // 璇ユā鍧楁暟鎹被鍨嬶紝鏁版嵁璧峰浣嶇疆
+    private String plcAddressBegin;
+    // 鏁版嵁鍦板潃闀垮害锛氱涓�鍙傛暟鍒版渶鍚庝竴涓弬鏁扮殑闀垮害
+    private int plcAddressLength;
+    private LinkedHashMap<String,PlcParameterInfo> plcParameterMap;
+
+
+    /**
+     * @return 鏁版嵁鍖哄紑濮嬪湴鍧�
+     */
+    public String getPlcAddressBegin() {
+        return plcAddressBegin;
+    }
+
+    /**
+     * @param plcAddressBegin 璁剧疆鏁版嵁鍖哄紑濮嬪湴鍧�
+     */
+    public void setPlcAddressBegin(String plcAddressBegin) {
+        this.plcAddressBegin = plcAddressBegin;
+    }
+
+    /**
+     * @return 鏁版嵁鍖� 璇诲彇鎵�鏈夋暟鎹墍闇�鐨勯暱搴︼紙浠yte绫诲瀷涓哄熀鍑嗭級
+     */
+    public int getPlcAddressLength() {
+        return plcAddressLength;
+    }
+
+    /**
+     * @return 璁剧疆锛氭暟鎹尯 璇诲彇鎵�鏈夋暟鎹墍闇�鐨勯暱搴︼紙浠yte绫诲瀷涓哄熀鍑嗭級
+     */
+    public void setPlcAddressLength(int plcAddressLength) {
+        this.plcAddressLength = plcAddressLength;
+    }
+
+    /**
+     * @return 鑾峰彇鍙傛暟瀹炰緥闆嗗悎
+     */
+    public LinkedHashMap<String,PlcParameterInfo> getPlcParameterMap() {
+        return plcParameterMap;
+    }
+
+    /**
+     * 鏍规嵁鍙傛暟鏍囪瘑 鑾峰彇鏌愪釜鍙傛暟瀹炰緥
+     *
+     * @param codeid 鍙傛暟鏍囪瘑
+     * @return 鑾峰彇鏌愪釜鍙傛暟瀹炰緥
+     */
+    public PlcParameterInfo getPlcParameter(String codeid) {
+        if (plcParameterMap != null) {
+            return plcParameterMap.get(codeid);
+        } else {
+            return null;
+        }
+        /*if (plcParameterList != null) {
+            for (PlcParameterInfo plcParameterInfo : plcParameterList) {
+                if (plcParameterInfo.getCodeId().equals(codeid))
+                    return plcParameterInfo;
+            }
+            return null;
+        } else
+            return null;*/
+    }
+
+
+    /**
+     * 鏍规嵁鍙傛暟鏍囪瘑 鑾峰彇鏌愪釜鍙傛暟瀹炰緥
+     *
+     * @param codeids 鍙傛暟鏍囪瘑
+     * @return 鑾峰彇鏌愪釜鍙傛暟瀹炰緥
+     */
+    public List<String> getPlcParameterValues(List<String> codeids) {
+        List<String> arrayList = new ArrayList<>();
+        if (plcParameterMap != null) {
+            /*Map<String, PlcParameterInfo> resultMap = new LinkedHashMap<>(); // 浣跨敤 LinkedHashMap 淇濈暀鎻掑叆椤哄簭
+            for (PlcParameterInfo plcParameterInfo : plcParameterList) {
+                if (codeids.contains(plcParameterInfo.getCodeId())) {
+                    resultMap.put(plcParameterInfo.getCodeId(), plcParameterInfo);
+                }
+            }*/
+            for (String codeId : codeids) { // 鎸夌収浼犲叆鍙傛暟鐨勯『搴忛亶鍘�
+                PlcParameterInfo plcParameterInfo = plcParameterMap.get(codeId);
+                if (plcParameterInfo != null) {
+                    arrayList.add(plcParameterInfo.getValue());
+                } else {
+                    arrayList.add(null); // 濡傛灉鎵句笉鍒板搴旂殑鍊硷紝娣诲姞 null
+                }
+            }
+        }
+        return arrayList;
+    }
+
+    /**
+     * 鏍规嵁鍙傛暟鏍囪瘑 鑾峰彇浼犲叆鍙傛暟鐨刾lc鍦板潃
+     *
+     * @param codeIdList 鍙傛暟鏍囪瘑
+     * @return 浼犲叆鍙傛暟鐨刾lc鍦板潃
+     */
+    public List<String> getAddressListByCodeId(List<String> codeIdList) {
+        List<String> addressList = new ArrayList<>();
+        if (plcParameterMap!=null)
+        {
+            for (String codeId : codeIdList) {
+                    String address = plcParameterMap.get(codeId).getAddress();
+                    if (address != null) {
+                        addressList.add(address);
+                    }
+        }
+        }
+        return addressList;
+    }
+
+
+    /**
+     * 娣诲姞鍙傛暟瀹炰緥
+     *
+     * @param param 鍙傛暟瀹炰緥
+     */
+    public void addPlcParameter(PlcParameterInfo param) {
+        if (plcParameterMap != null) {
+            plcParameterMap.put(param.getCodeId(), param);
+        }
+        else {
+            plcParameterMap =new  LinkedHashMap<String,PlcParameterInfo>();
+            plcParameterMap.put(param.getCodeId(), param);
+        }
+        /*if (plcParameterList != null)
+            plcParameterList.add(param);
+        else {
+            plcParameterList = new ArrayList<PlcParameterInfo>();
+            plcParameterList.add(param);
+        }*/
+    }
+
+    /**
+     * 鏍规嵁PLC杩斿洖鐨勬暟鎹� 缁欏弬鏁板疄渚嬭祴鍊�
+     *
+     * @param plcValueArray PLC璇诲彇鍥炴潵鐨刡yte绫诲瀷鏁版嵁闆嗗悎
+     */
+    public void setPlcParameterList(byte[] plcValueArray) {
+        if (plcParameterMap != null) {
+            Collection<PlcParameterInfo> values=  plcParameterMap.values();
+            for (PlcParameterInfo plcParameterInfo :values) {
+                byte[] valueList = new byte[plcParameterInfo.getAddressLength()];
+//                System.out.println(plcParameterInfo.getAddressLength());
+                for (int i = 0; i < plcParameterInfo.getAddressLength(); i++) {
+                    Array.setByte(valueList, i, plcValueArray[plcParameterInfo.getAddressIndex() + i]);
+                }
+                if (plcParameterInfo.getAddressLength() == 2) {
+                    plcParameterInfo.setValue(String.valueOf(ShortUtil.toUInt16(valueList)));
+                } else if (plcParameterInfo.getAddressLength() == 4) {
+                    plcParameterInfo.setValue(String.valueOf(IntegerUtil.toUInt32(valueList)));
+                }else if(plcParameterInfo.getAddressLength()==256){
+                    StringConverter converter = new StringConverter();
+                    String s="";
+                    String extract1 = converter.extract(s.getClass(),plcValueArray, plcParameterInfo.getAddressIndex(), 0);
+                    plcParameterInfo.setValue(extract1);
+                }else {
+                    plcParameterInfo.setValue((byteToHexString(valueList)));
+                }
+            }
+        }
+    }
+    /**
+     * 鎶婂啓鍏ュ�艰浆鍖栦负byte[]
+     * @param param 鍙傛暟瀹炰緥
+     * @param data 鍐欏叆鍊肩殑瀛楃绫诲瀷
+     */
+    public byte[] setValueToBytes(PlcParameterInfo param, String data) {
+        if (param.getAddressLength() == 2) {
+            return ShortUtil.toByteArray(Integer.parseInt(data));
+
+        } else if (param.getAddressLength() == 4) {
+
+            return IntegerUtil.toByteArray(Long.parseLong(data));
+        }
+        else if (param.getAddressLength() >10) {
+           return data.getBytes();
+        } else {
+            return data.getBytes();
+        }
+    }
+
+    /**
+     * short绫诲瀷杞琤yte[]
+     *
+     * @param s short绫诲瀷鍊�
+     */
+    public static byte[] short2byte(short s) {
+        byte[] b = new byte[2];
+        for (int i = 0; i < 2; i++) {
+            int offset = 16 - (i + 1) * 8; //璁$畻鍋忕Щ閲�
+            b[i] = (byte) ((s >> offset) & 0xff); //鎶�16浣嶅垎涓�2涓�8浣嶈繘琛屽垎鍒瓨鍌�
+        }
+        return b;
+    }
+
+    /**
+     * byte[]绫诲瀷杞瑂hort
+     *
+     * @param b byte[]绫诲瀷鍊�
+     */
+    public static short byte2short(byte[] b) {
+        short l = 0;
+        for (int i = 0; i < 2; i++) {
+            l <<= 8; //<<=鍜屾垜浠殑 +=鏄竴鏍风殑锛屾剰鎬濆氨鏄� l = l << 8
+            l |= (b[i] & 0xff); //鍜屼笂闈篃鏄竴鏍风殑  l = l | (b[i]&0xff)
+        }
+        return l;
+    }
+
+    /**
+     * byte[]绫诲瀷杞瑂hort
+     *
+     * @param b byte[]绫诲瀷鍊�
+     */
+    public static int byte2int(byte[] b) {
+        int l = 0;
+        for (int i = 0; i < 4; i++) {
+            l <<= 8; //<<=鍜屾垜浠殑 +=鏄竴鏍风殑锛屾剰鎬濆氨鏄� l = l << 8
+            l |= (b[3-i] & 0xff); //鍜屼笂闈篃鏄竴鏍风殑  l = l | (b[i]&0xff)
+        }
+        return l;
+    }
+    public static byte[] int2byte(int s){
+        byte[] b = new byte[2];
+        for(int i = 0; i < 4; i++){
+            int offset = 16 - (i+1)*8; //鍥犱负byte鍗�4涓瓧鑺傦紝鎵�浠ヨ璁$畻鍋忕Щ閲�
+            b[i] = (byte)((s >> offset)&0xff); //鎶�32浣嶅垎涓�4涓�8浣嶈繘琛屽垎鍒瓨鍌�
+        }
+        return b;
+    }
+    public static String byteToHexString(byte[] bytes) {
+        String str = new String(bytes, StandardCharsets.UTF_8).trim();
+        return str;
+    }
+}
\ No newline at end of file
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/entity/request/GeneralRequest.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/entity/request/GeneralRequest.java
new file mode 100644
index 0000000..d70b171
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/entity/request/GeneralRequest.java
@@ -0,0 +1,17 @@
+package com.mes.entity.request;
+
+import cn.hutool.db.Page;
+import lombok.Data;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/4/22 11:21
+ * @Description:
+ */
+@Data
+public class GeneralRequest {
+
+    private String key;
+
+    private Page page;
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/service/Communication.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/service/Communication.java
new file mode 100644
index 0000000..4286df3
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/service/Communication.java
@@ -0,0 +1,36 @@
+package com.mes.service;
+
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import com.mes.device.PlcParameterInfo;
+import com.mes.tools.HexConversion;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.io.*;
+import java.net.Socket;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Plc閫氳鏂瑰紡 [S7/ModbusTcp]
+ */
+@Component
+@Slf4j
+public class Communication {
+
+    /**
+     * 鏂瑰紡鏍囪瘑 [S7/ModbusTcp]
+     */
+    private String type;
+
+    Communication(){
+        if("ModbusTcp".equals(type)){
+
+        }else if("S7".equals(type)){
+
+        }
+    }
+
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/service/ModbusTcp.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/service/ModbusTcp.java
new file mode 100644
index 0000000..335a30a
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/service/ModbusTcp.java
@@ -0,0 +1,223 @@
+package com.mes.service;
+
+import com.mes.tools.HexConversion;
+import com.mes.utils.HexUtil;
+import io.swagger.models.auth.In;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.Socket;
+import java.net.UnknownHostException;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import static com.mes.tools.HexConversion.*;
+
+@Component
+@Slf4j
+public class ModbusTcp {
+
+    //鍚孖P涓嬩細鏈夊涓崗璁湴鍧�  key=鍦板潃鍖�   PlcAgreement涓哄崗璁唴瀹�  plcAgreements涓哄崗璁粍
+    private Map<String,PlcAgreement> plcAgreement=new LinkedHashMap<String,PlcAgreement>();
+    private String Ip;
+    private int Port;
+
+    public Socket socket =null;//閫氳
+    public String fileName ="";
+    public ModbusTcp(){}
+    public ModbusTcp(String Ip,int Port,String fileName){
+        this.Ip=Ip;
+        this.Port=Port;
+        this.fileName=fileName;
+        try {
+            plcAgreement.put(this.fileName,new PlcAgreement(this.fileName));
+        } catch (Exception e) {
+            log.info("file error锛�"+this.fileName+",{}",e.getMessage());
+        }
+    }
+    //杩炴帴
+    public void connect(){
+        try {
+            this.socket=new Socket(Ip,Port);
+            this.socket.setSoTimeout(1000);
+        }catch (Exception e) {
+            log.info("The IP address of the host cannot be determined:{}",e.getMessage());
+        }
+    }
+    //鍏抽棴杩炴帴
+    public void close(){
+        try {
+            this.socket.close();
+        }catch (Exception e) {
+            //log.info("杩炴帴鍏抽棴寮傚父:{}",e.getMessage());
+        }
+    }
+    //杩斿洖杩炴帴鐘舵��
+    public boolean isConnect(){
+        try {
+            this.socket.isConnected();
+        }catch (Exception e) {
+            log.info("Connection status exception:{}",this.socket);
+        }
+        return false;
+    }
+
+    //璇诲彇鏁版嵁
+    public boolean read(PlcAgreement plcAgreement){
+        try {
+            if (!this.socket.isConnected()){
+               // log.info("閫氳杩炴帴澶辫触:{}",this.socket.isConnected());
+                return false;
+            }
+            int bufSizes = 0;
+            byte[] msgs = new byte[2048];
+            byte[] content = new byte[2048];
+            //鍐欏叆璇诲彇鍦板潃
+            DataOutputStream outToServer = new DataOutputStream(this.socket.getOutputStream());
+            outToServer.write(HexConversion.stringToInt(plcAgreement.requestHead));
+            outToServer.flush();
+            //璇诲彇鍐呭
+            DataInputStream in = new DataInputStream(this.socket.getInputStream());
+            bufSizes = in.read(msgs);
+            if(bufSizes<plcAgreement.plcAddressLength+9){
+                log.info("Read byte length <1:{},content锛歿}",bufSizes,msgs);
+                return false;
+            }
+            content=Arrays.copyOfRange(msgs,9,2048);
+            //鑾峰彇鍙傛暟鍊�
+            Map<String, PlcParameter> plcParameters=plcAgreement.getPlcParameters();
+            for (String key:plcParameters.keySet()){
+                PlcParameter plcParameter=plcParameters.get(key);
+                if("bit".equals(plcParameter.getType())){
+                    byte font=content[plcParameter.getAddressStart()];
+                    String[] fontBitString=String.format("%8s", Integer.toBinaryString((int)font)).replace(" ", "0").split("");
+                    byte[] bit=new byte[1];
+                    bit[0]=Byte.parseByte(fontBitString[plcParameter.getAddressLength()]);
+                    plcParameter.setReadByte(bit);
+                }else{
+                    plcParameter.setReadByte(Arrays.copyOfRange(content,plcParameter.getAddressStart(),(plcParameter.getAddressStart()+plcParameter.getAddressLength())));
+                }
+            }
+            return true;
+        }catch (Exception e) {
+            //log.info("璇诲彇寮傚父:{}",plcAgreement);
+        }
+        return false;
+    }
+    //鍐欏叆鏁版嵁
+    public void write(PlcParameter plcParameter){
+        try {
+            if (plcParameter.getWriteValue() != null && !"".equals(plcParameter.getWriteValue())) {
+                //鍐欏叆鍙戦�佹暟鎹� 0000 0000 0009 0110 0024 0001 02 0006
+                byte []sendByte=new byte[13+plcParameter.getAddressLength()];
+                byte []sendLength=intToBytesDesc(7+plcParameter.getAddressLength(),2);
+                byte []sendAddress=intToBytesDesc(plcParameter.getAddressStart()/2,2);
+                byte []sendFontLength=intToBytesDesc(plcParameter.getAddressLength()/2,2);
+                byte []sendContent=plcParameter.getWriteByte();
+                //byte []sendContent=intToBytesDesc(Integer.parseInt(plcParameter.getWriteValue().toString()),plcParameter.getAddressLength());
+                sendByte[4]=sendLength[0];
+                sendByte[5]=sendLength[1];
+                sendByte[6]=(byte)1;
+                sendByte[7]=(byte)16;
+                sendByte[8]=sendAddress[0];
+                sendByte[9]=sendAddress[1];
+                sendByte[10]=sendFontLength[0];
+                sendByte[11]=sendFontLength[1];
+                sendByte[12]=(byte)plcParameter.getAddressLength();
+                for(int i=0;i<sendContent.length;i++){
+                    sendByte[i+13]=sendContent[i];
+                }
+                log.info("sendByte:{}",sendByte);
+                DataOutputStream out = new DataOutputStream(this.socket.getOutputStream());
+                out.write(sendByte);
+                out.flush();
+                //log.info("sendByte:{}",sendByte);
+
+            }
+        } catch (IOException e) {
+            log.info("鍐欏叆鏁版嵁寮傚父:{}",plcParameter);
+            throw new RuntimeException(e);
+        }
+    }
+    //鏁版嵁澶勭悊
+    public void handleData(PlcParameter plcParameter){
+        //鍐欏叆鍙戦�佹暟鎹� 0000 0000 0009 0110 0024 0001 02 0006
+        try {
+            int sendLength=plcParameter.getAddressLength()+7;//鍙戦�侀暱搴�
+            byte [] addressLength=intToBytesDesc(plcParameter.getAddressLength(),1);//瀛楄妭闀垮害
+            byte [] addressLengthFont=intToBytesDesc((plcParameter.getAddressLength()/2),2);//瀛楅暱搴�
+            byte start[]=intToBytesDesc(plcParameter.getAddressStart()/2,2);//璧峰鍦板潃
+            byte content[]=intToBytesDesc(Integer.valueOf(plcParameter.getWriteValue().toString()) ,2);//璧峰鍦板潃
+            if (sendLength>14&&
+                    addressLength.length>0&&
+                    addressLengthFont.length>1&&
+                    start.length>1&&
+                    content.length>1){
+                byte head[]=new byte[]{0,0,0,(byte)sendLength,1,16,start[0],start[1],addressLengthFont[0],addressLengthFont[1],addressLength[0],content[0],content[1]};
+                this.write(head);
+            }else{
+                log.info("鍙戦�佸唴瀹逛笉绗﹀悎锛� 瀛楄妭闀垮害 {},瀛楅暱搴︼細{},璧峰鍦板潃,{},鍐呭:{}",addressLength,addressLengthFont,start,content);
+            }
+        } catch (Exception e) {
+            log.info("鏁版嵁澶勭悊寮傚父锛� 鍐呭 {}",plcParameter);
+        }
+    }
+    //鍐欏叆鏁版嵁
+    public void write(byte []sendByte){
+        try {
+            if (sendByte != null) {
+                //鍐欏叆鍙戦�佹暟鎹�
+                DataOutputStream out = new DataOutputStream(this.socket.getOutputStream());
+                out.write(sendByte);
+                out.flush();
+                log.info("鍐欏叆鎴愬姛锛� 鍐呭 {}",sendByte);
+            }
+        } catch (Exception e) {
+            log.info("鍐欏叆澶辫触锛� 鍐呭 {}",sendByte);
+        }
+    }
+    //鍐欏叆鏁版嵁String
+    public void writeString(String sendString,String startAddress){
+        try {
+            String result=message(sendString,startAddress);
+            if (result != null && !"".equals(result)) {
+                //鍐欏叆鏁版嵁
+                DataOutputStream out = new DataOutputStream(socket.getOutputStream());
+                out.write(HexUtil.stringToInt(result));
+                out.flush();
+                log.info("鍐欏叆鎴愬姛锛氬湴鍧� {},鍐呭 {},瀛楄妭锛歿}",startAddress,sendString,HexUtil.stringToInt(result));
+                //this.close();
+            }
+        } catch (Exception e) {
+            log.info("鍐欏叆寮傚父锛氬湴鍧� {},鍐呭 {}",startAddress,sendString);
+        }
+    }
+    //鍐�
+    public String message(String senddate, String address) {
+        String Herd = "0110" + address;
+        int length = senddate.length() / 4;
+        String dates = Herd + HexUtil.intTo2ByteHex(length) + HexUtil.intTo1ByteHex(length * 2) + senddate;
+        int lengths = dates.length() / 2;
+        String date = "00000000" + HexUtil.intTo2ByteHex(lengths) + dates;
+        return date;
+    }
+    public PlcAgreement getPlcAgreement(String key){
+        return plcAgreement.get(key);
+    }
+
+    public void consoleLogInfo(PlcAgreement thisPlcAgreement){
+        String logInfo=this.fileName+"  ";
+        Map<String,PlcParameter> plcParameterMap=thisPlcAgreement.getPlcParameters();
+        for (String key:plcParameterMap.keySet()) {
+            logInfo+=key+":"+plcParameterMap.get(key).getValueString()+",";
+        }
+        log.info(logInfo);
+    }
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/service/PlcAgreement.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/service/PlcAgreement.java
new file mode 100644
index 0000000..52ec63b
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/service/PlcAgreement.java
@@ -0,0 +1,113 @@
+package com.mes.service;
+
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import com.mes.device.PlcParameterInfo;
+import com.mes.tools.HexConversion;
+import com.mes.utils.HexUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.io.*;
+import java.net.Socket;
+import java.util.*;
+
+/**
+ * Plc鍗忚锛氬崗璁弬鏁帮紝鍗忚閰嶇疆锛屽崗璁姹傚ご锛屽崗璁被鍨�
+ */
+@Component
+@Slf4j
+public class PlcAgreement {
+
+    //public Socket socket =null;//閫氳
+    /**
+     * 鍗忚鍙傛暟
+     */
+    private List<String> parameterKeys=new ArrayList<>();
+    private Map<String,PlcParameter> parameters=null;
+    /**
+     * 鍗忚璺緞
+     */
+    private String jsonFilePath=null;
+    /**
+     * 璇诲彇璧峰鍦板潃
+     */
+    public String plcAddressBegin=null;
+    /**
+     * 璇诲彇闀垮害
+     */
+    public int plcAddressLength=0;
+    //绫讳技搴忓垪鍙凤紙4锛�+鍗忚鏍囧織锛�4锛�+闀垮害锛�4锛�+浠庣珯鍦板潃锛�2锛�+鍔熻兘浠g爜锛�2锛�+璧峰鍦板潃锛�4锛�+璇诲彇鏁伴噺锛�4锛� "000100000006010300000032"
+    public String requestHead=null;
+    private PlcAgreement(){}
+    PlcAgreement(String fileName){
+        //jsonFilePath = "D:/mes/JsonFile/"+fileName+".json";
+        jsonFilePath = System.getProperty("user.dir") + "/JsonFile/"+fileName+".json";
+        boolean initSuccess=initword();
+        //log.info("鍒濆鍖朠lcCacheGlass锛�"+initSuccess);
+    }
+    //鍒濆鍖杦ord
+    public boolean initword() {
+        try {
+            parameters=new LinkedHashMap<String,PlcParameter>();
+            FileReader fileReader = new FileReader(jsonFilePath);
+            BufferedReader bufferedReader = new BufferedReader(fileReader);
+
+            StringBuilder content = new StringBuilder();
+            String line;
+
+            while ((line = bufferedReader.readLine()) != null) {
+                content.append(line);
+            }
+            bufferedReader.close();
+            fileReader.close();
+
+            JSONObject jsonFile = new JSONObject(content.toString());
+            //log.info("璇诲彇鍐呭锛歿}",jsonFile);
+            JSONArray jsonArray = jsonFile.getJSONArray("parameterInfo");
+            this.plcAddressBegin=jsonFile.getStr("plcAddressBegin");//璁剧疆璧峰浣嶅湴鍧�
+            this.plcAddressLength=Integer.valueOf(jsonFile.getStr("plcAddressLength"));//璁剧疆鍦板潃闀垮害
+            this.requestHead=jsonFile.getStr("requestHead");//璁剧疆璇锋眰澶撮儴
+
+            for (int i = 0; i < jsonArray.size(); i++) {
+                JSONObject parameterObj = jsonArray.getJSONObject(i);
+                String code = parameterObj.getStr("codeId");
+                PlcParameter plcParameter = new PlcParameter(
+                        code,
+                        Integer.valueOf(parameterObj.getStr("addressIndex")),
+                        Integer.valueOf(parameterObj.getStr("addressLength")),
+                        parameterObj.getStr("type")); //鍙傛暟瀹炰緥
+                parameterKeys.add(code);
+                parameters.put(code,plcParameter);
+            }
+            return true;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+    //鑾峰彇姝ゅ湴鍧�鍏ㄩ儴鍙傛暟
+    public Map<String,PlcParameter> getPlcParameters(){
+        return parameters;
+    }
+    //閫氳繃鍙傛暟鍚嶇О鑾峰彇
+    public PlcParameter getPlcParameter(String name){
+        return parameters.get(name);
+    }
+    //閫氳繃鍙傛暟搴忓彿鑾峰彇
+    public PlcParameter getPlcParameter(int index){
+        String key=parameterKeys.get(index);
+        if(key!=null&& !key.isEmpty()){
+            return this.getPlcParameter(key);
+        }
+        log.info("鏃犳晥涓嬫爣:{},涓嬫爣鑼冨洿:0-{}",index,parameterKeys.size());
+        return null;
+    }
+    public int getValueInt(){
+        return 0;
+    }
+    public double getValueDouble(){
+        return 0;
+    }
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/service/PlcParameter.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/service/PlcParameter.java
new file mode 100644
index 0000000..7445a1c
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/service/PlcParameter.java
@@ -0,0 +1,154 @@
+package com.mes.service;
+
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import com.mes.device.PlcParameterInfo;
+import com.mes.tools.HexConversion;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.io.*;
+import java.net.Socket;
+import java.util.HashMap;
+import java.util.Map;
+
+import static com.mes.tools.HexConversion.*;
+
+/**
+ * Plc鍙傛暟
+ */
+@Component
+@Slf4j
+public class PlcParameter {
+
+
+    /**
+     * 缂栧彿
+     */
+    private String CodeId;
+    /**
+     * 璧峰鍦板潃
+     */
+    private int addressStart=0;
+    /**
+     * 闀垮害
+     */
+    private int addressLength=0;
+    /**
+     * 绫诲瀷
+     */
+    private String type="int";
+
+    /**
+     * 瀹炴椂璇诲彇鐨刡yte鍊�
+     */
+    private byte[] readByte=null;
+    /**
+     * 瀹炴椂璇诲彇鐨刡yte鍊艰浆鎹㈡垚 瀵瑰簲绫诲瀷
+     */
+    private Object readValue=null;
+
+    /**
+     * 闇�瑕佸啓鍏ョ殑鍊�
+     */
+    private Object writeValue=null;
+
+    /**
+     * 闇�瑕佸啓鍏ョ殑鍊�
+     */
+    private byte[] writeByte=null;
+
+    PlcParameter(){
+
+    }
+    PlcParameter(String codeId, int addressStart, int addressLength, String type){
+        this.CodeId=codeId;
+        this.addressStart=addressStart;
+        this.addressLength=addressLength;
+        this.type=type;
+    }
+
+    public String getCodeId() {
+        return CodeId;
+    }
+
+    public void setCodeId(String codeId) {
+        CodeId = codeId;
+    }
+
+    public int getAddressStart() {
+        return addressStart;
+    }
+
+    public void setAddressStart(int addressIndex) {
+        this.addressStart = addressStart;
+    }
+
+    public int getAddressLength() {
+        return addressLength;
+    }
+
+    public void setAddressLength(int addressLength) {
+        this.addressLength = addressLength;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Object getReadValue() {
+
+        return readValue;
+    }
+    public String getValueString() {
+        return getValueInt()+"";
+    }
+    public int getValueInt() {
+        if(this.readByte==null||this.readByte.length<1){
+            //log.info("璇诲彇鍐呭涓簄ull: {}  :{}",this.getCodeId(),this.readByte);
+            return 0;
+        }
+        return bytesToIntDesc(this.readByte,0);
+    }
+
+    public void setReadValue(Object readValue) {
+        this.readValue = readValue;
+    }
+
+    public byte[] getReadByte() {
+        return this.readByte;
+    }
+
+    public void setReadByte(byte[] readByte) {
+        this.readByte = readByte;
+    }
+
+    public Object getWriteValue() {
+        return writeValue;
+    }
+
+    public byte [] setWriteValue(Object writeValue) {
+        //浼犲叆鍊兼牴鎹弬鏁扮被鍨嬭繘琛岃浆鎹㈡垚瀛楃涓蹭繚瀛樿繘鍐欏叆 瀛楄妭鍐呭苟涓旇繑鍥�
+        byte []sendByte=new byte[13+this.addressLength];
+        if ("int".equals(this.type)){
+            this.writeByte=intToBytesDesc(Integer.parseInt(writeValue.toString()),this.addressLength);
+            return this.writeByte;
+        }else if ("word".equals(this.type)){
+            this.writeByte=intToBytesDesc(Integer.parseInt(writeValue.toString()),this.addressLength);
+            return this.writeByte;
+        }else if("string".equals(this.type)){
+
+        }else{
+
+        }
+        return null;
+    }
+    public byte [] getWriteByte() {
+        return this.writeByte;
+    }
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/CodeGet.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/CodeGet.java
new file mode 100644
index 0000000..006c8f9
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/CodeGet.java
@@ -0,0 +1,84 @@
+package com.mes.tools;
+
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+import com.baomidou.mybatisplus.generator.config.GlobalConfig;
+import com.baomidou.mybatisplus.generator.config.PackageConfig;
+import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+
+/**
+ * @author mybatis-plus
+ */
+public class CodeGet {
+
+    public static void main(String[] args) {
+
+        // 1銆佸垱寤轰唬鐮佺敓鎴愬櫒
+        AutoGenerator mpg = new AutoGenerator();
+
+        // 2銆佸叏灞�閰嶇疆
+        // 鍏ㄥ眬閰嶇疆
+        GlobalConfig gc = new GlobalConfig();
+        gc.setOutputDir("D:\\Documents\\hangzhoumesParent5\\");
+
+        gc.setServiceName("%sService");	//鍘绘帀Service鎺ュ彛鐨勯瀛楁瘝I
+        gc.setAuthor("wu");
+        gc.setOpen(false);
+        mpg.setGlobalConfig(gc);
+
+        // 3銆佹暟鎹簮閰嶇疆
+        DataSourceConfig dsc = new DataSourceConfig();
+        dsc.setUrl("jdbc:mysql://10.153.19.150:3306/hangzhoumes?serverTimezone=GMT%2b8");
+        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
+        dsc.setUsername("root");
+        dsc.setPassword("beibo.123/");
+        dsc.setDbType(DbType.MYSQL);
+        mpg.setDataSource(dsc);
+
+        // 4銆佸寘閰嶇疆
+        PackageConfig pc = new PackageConfig();
+        pc.setParent("com.mes");
+        pc.setModuleName("work_assignment"); //妯″潡鍚�
+        pc.setController("controller");
+        pc.setService("service");
+        pc.setMapper("mapper");
+        mpg.setPackageInfo(pc);
+
+        // 5銆佺瓥鐣ラ厤缃�
+        StrategyConfig strategy = new StrategyConfig();
+
+        strategy.setInclude("work_assignment");
+
+        strategy.setNaming(NamingStrategy.underline_to_camel);//鏁版嵁搴撹〃鏄犲皠鍒板疄浣撶殑鍛藉悕绛栫暐
+
+        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//鏁版嵁搴撹〃瀛楁鏄犲皠鍒板疄浣撶殑鍛藉悕绛栫暐
+        strategy.setEntityLombokModel(true); // lombok 妯″瀷 @Accessors(chain = true) setter閾惧紡鎿嶄綔
+
+        strategy.setRestControllerStyle(true); //restful api椋庢牸鎺у埗鍣�
+        strategy.setControllerMappingHyphenStyle(true); //url涓┘宄拌浆杩炲瓧绗�
+
+        mpg.setStrategy(strategy);
+
+        // 6銆佹墽琛�
+        mpg.execute();
+
+        System.out.println("鎵ц瀹屾垚");
+    }
+}
+
+/*
+<dependency>
+    <groupId>com.baomidou</groupId>
+    <artifactId>mybatis-plus-generator</artifactId>
+    <version>3.4.1</version>
+</dependency>
+
+<dependency>
+    <groupId>org.apache.velocity</groupId>
+    <artifactId>velocity-engine-core</artifactId>
+    <version>2.0</version>
+</dependency>
+ */
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/DatabaseDesignDocUtil.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/DatabaseDesignDocUtil.java
new file mode 100644
index 0000000..2b31d34
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/DatabaseDesignDocUtil.java
@@ -0,0 +1,97 @@
+package com.mes.tools;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/3/26 9:01
+ * @Description:
+ */
+
+import cn.smallbun.screw.core.Configuration;
+import cn.smallbun.screw.core.engine.EngineConfig;
+import cn.smallbun.screw.core.engine.EngineFileType;
+import cn.smallbun.screw.core.engine.EngineTemplateType;
+import cn.smallbun.screw.core.execute.DocumentationExecute;
+import cn.smallbun.screw.core.process.ProcessConfig;
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+
+import javax.sql.DataSource;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DatabaseDesignDocUtil {
+
+    public static void main(String[] args) {
+        documentGeneration();
+    }
+
+    /**
+     * 鏂囨。鐢熸垚
+     */
+    public static void documentGeneration() {
+        //鏁版嵁婧�
+        HikariConfig hikariConfig = new HikariConfig();
+        hikariConfig.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
+        hikariConfig.setJdbcUrl("jdbc:sqlserver://10.153.19.150:1433;databasename=hangzhoumes");
+        hikariConfig.setUsername("sa");
+        hikariConfig.setPassword("beibo.123/");
+        //璁剧疆鍙互鑾峰彇tables remarks淇℃伅
+        hikariConfig.addDataSourceProperty("useInformationSchema", "true");
+        hikariConfig.setMinimumIdle(2);
+        hikariConfig.setMaximumPoolSize(5);
+        DataSource dataSource = new HikariDataSource(hikariConfig);
+        //鐢熸垚閰嶇疆
+        EngineConfig engineConfig = EngineConfig.builder()
+                //鐢熸垚鏂囦欢璺緞
+                .fileOutputDir("E:\\椤圭洰\\椤圭洰鏂囨。\\鏉窞鍒╂潵2")
+                //鎵撳紑鐩綍
+                .openOutputDir(true)
+                //鏂囦欢绫诲瀷
+                .fileType(EngineFileType.WORD)
+                //鐢熸垚妯℃澘瀹炵幇
+                .produceType(EngineTemplateType.freemarker)
+                //鑷畾涔夋枃浠跺悕绉�
+                .fileName("鏉窞鍒╂潵鏁版嵁搴撴枃妗�").build();
+
+        //蹇界暐琛�
+        List<String> ignoreTableName = new ArrayList<>();
+        ignoreTableName.add("test_user");
+        ignoreTableName.add("test_group");
+        //蹇界暐琛ㄥ墠缂�
+        ArrayList<String> ignorePrefix = new ArrayList<>();
+        ignorePrefix.add("test_");
+        //蹇界暐琛ㄥ悗缂�
+        ArrayList<String> ignoreSuffix = new ArrayList<>();
+        ignoreSuffix.add("_test");
+        ProcessConfig processConfig = ProcessConfig.builder()
+                //鎸囧畾鐢熸垚閫昏緫銆佸綋瀛樺湪鎸囧畾琛ㄣ�佹寚瀹氳〃鍓嶇紑銆佹寚瀹氳〃鍚庣紑鏃讹紝灏嗙敓鎴愭寚瀹氳〃锛屽叾浣欒〃涓嶇敓鎴愩�佸苟璺宠繃蹇界暐琛ㄩ厤缃�
+                //鏍规嵁鍚嶇О鎸囧畾琛ㄧ敓鎴�
+                .designatedTableName(new ArrayList<>())
+                //鏍规嵁琛ㄥ墠缂�鐢熸垚
+                .designatedTablePrefix(new ArrayList<>())
+                //鏍规嵁琛ㄥ悗缂�鐢熸垚
+                .designatedTableSuffix(new ArrayList<>())
+                //蹇界暐琛ㄥ悕
+                .ignoreTableName(ignoreTableName)
+                //蹇界暐琛ㄥ墠缂�
+                .ignoreTablePrefix(ignorePrefix)
+                //蹇界暐琛ㄥ悗缂�
+                .ignoreTableSuffix(ignoreSuffix).build();
+        //閰嶇疆
+        Configuration config = Configuration.builder()
+                //鐗堟湰
+                .version("1.0.0")
+                //鎻忚堪
+                .description("鏁版嵁搴撹璁℃枃妗g敓鎴�")
+                //鏁版嵁婧�
+                .dataSource(dataSource)
+                //鐢熸垚閰嶇疆
+                .engineConfig(engineConfig)
+                //鐢熸垚閰嶇疆
+                .produceConfig(processConfig)
+                .build();
+        //鎵ц鐢熸垚
+        new DocumentationExecute(config).execute();
+    }
+
+}
\ No newline at end of file
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/HexConversion.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/HexConversion.java
new file mode 100644
index 0000000..0979522
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/HexConversion.java
@@ -0,0 +1,112 @@
+package com.mes.tools;
+
+public class HexConversion {
+    /**
+     * @param a shuzi
+     * @return shuzu
+     */
+    public static byte[] stringToInt(String a){
+        byte[] byt = new byte[a.length()/2];
+        for (int i = 0; i < a.length() - 1; i+=2) {
+            String output = a.substring(i, i + 2);
+            byt[i/2]=(byte)Integer.parseInt(output, 16);
+        }
+        return byt;
+    }
+    public static String byteToHexString(int bufSize,byte[] msg){
+        String tempHex = "";
+        String command = "";
+        if (bufSize != -1) {
+            for (int i = 0; i < bufSize; i++) {
+                tempHex = Integer.toHexString(msg[i] & 0xFF);
+                if (tempHex.length() == 1) {
+                    tempHex = "0" + tempHex;
+                }
+                command += tempHex;
+            }
+        }
+        return command;
+    }
+    public static String intToHex(int number) {
+        return Integer.toHexString(number);
+    }
+    /**
+     * 灏嗘暣鏁拌浆鎹负4浣�16杩涘埗锛屽1杞崲涓�0001锛�10杞崲涓�000a
+     *
+     * @param number
+     * @return
+     */
+    public static String intTo2ByteHex(int number) {
+        String numberHex = intToHex(number);
+        numberHex = String.format("%4s", numberHex).replace(' ', '0');
+        return numberHex;
+    }
+    /**
+     * 灏嗘暣鏁拌浆鎹负2浣�16杩涘埗锛屽1杞崲涓�01锛�10杞崲涓�0a
+     *
+     * @param
+     * @return
+     */
+    public static String intTo1ByteHex(int number) {
+        String numberHex = intToHex(number);
+        numberHex = String.format("%2s", numberHex).replace(' ', '0');
+        return numberHex;
+    }
+    /**
+     * 浠巄yte鏁扮粍涓彇int鏁板�硷紝鏈柟娉曢�傜敤浜�(浣庝綅鍦ㄥ墠锛岄珮浣嶅湪鍚�)鐨勯『搴忥紝鍜屽拰intToBytes()閰嶅浣跨敤
+     *
+     * @param src: byte鏁扮粍
+     * @param offset: 浠庢暟缁勭殑绗琽ffset浣嶅紑濮�
+     * @return int鏁板��
+     */
+    public static int bytesToIntDesc(byte[] src, int offset) {
+        int value=0;
+        int length = src.length;
+        for(int i=0;i<length;i++){
+            value+=(int)((src[offset+i]&0xFF)<<(length-i-1)*8);
+        }
+        return value;
+    }
+    /**
+     * 灏唅nt鏁板�艰浆鎹负鍗爏ize涓瓧鑺傜殑byte鏁扮粍锛屾湰鏂规硶閫傜敤浜�(浣庝綅鍦ㄥ墠锛岄珮浣嶅湪鍚�)鐨勯『搴忋�� 鍜宐ytesToInt锛堬級閰嶅浣跨敤
+     * @param value
+     *            瑕佽浆鎹㈢殑int鍊�
+     * @return byte鏁扮粍
+     */
+    public static byte[] intToBytesDesc( int value,int size )
+    {
+        byte[] src = new byte[size];
+        for(int i=0;i<size;i++){
+            src[i] = (byte) ((value>>(size-i-1)*8) & 0xFF);
+        }
+        return src;
+    }
+    /**
+     * 浠巄yte鏁扮粍涓彇int鏁板�硷紝鏈柟娉曢�傜敤浜�(浣庝綅鍦ㄥ墠锛岄珮浣嶅湪鍚�)鐨勯『搴忥紝鍜屽拰intToBytes()閰嶅浣跨敤
+     *
+     * @param src: byte鏁扮粍
+     * @param offset: 浠庢暟缁勭殑绗琽ffset浣嶅紑濮�
+     * @return int鏁板��
+     */
+    public static int bytesToInt(byte[] src, int offset) {
+        int value=0;
+        for(int i=0;i<src.length;i++){
+            value+=(int)((src[offset+i]&0xFF)<<i*8);
+        }
+        return value;
+    }
+    /**
+     * 灏唅nt鏁板�艰浆鎹负鍗爏ize涓瓧鑺傜殑byte鏁扮粍锛屾湰鏂规硶閫傜敤浜�(浣庝綅鍦ㄥ墠锛岄珮浣嶅湪鍚�)鐨勯『搴忋�� 鍜宐ytesToInt锛堬級閰嶅浣跨敤
+     * @param value
+     *            瑕佽浆鎹㈢殑int鍊�
+     * @return byte鏁扮粍
+     */
+    public static byte[] intToBytes( int value,int size )
+    {
+        byte[] src = new byte[size];
+        for(int i=0;i<src.length;i++){
+            src[i] = (byte) ((value>>i*8) & 0xFF);
+        }
+        return src;
+    }
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/InitUtil.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/InitUtil.java
new file mode 100644
index 0000000..9989771
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/InitUtil.java
@@ -0,0 +1,104 @@
+package com.mes.tools;
+
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import com.mes.device.PlcBitInfo;
+import com.mes.device.PlcBitObject;
+import com.mes.device.PlcParameterInfo;
+import com.mes.device.PlcParameterObject;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class InitUtil {
+    //鍒濆鍖杦ord
+    public static PlcParameterObject initword(String jsonFilePath) {
+        try {
+            FileReader fileReader = new FileReader(jsonFilePath);
+            BufferedReader bufferedReader = new BufferedReader(fileReader);
+
+            StringBuilder content = new StringBuilder();
+            String line;
+
+            while ((line = bufferedReader.readLine()) != null) {
+                content.append(line);
+            }
+
+            bufferedReader.close();
+            fileReader.close();
+
+            JSONObject jsonfileobj = new JSONObject(content.toString());
+            JSONArray jsonArray = jsonfileobj.getJSONArray("parameteInfor");
+            PlcParameterObject plcParameterObject = new PlcParameterObject();
+            plcParameterObject.setPlcAddressBegin(jsonfileobj.getStr("plcAddressBegin"));//璁剧疆璧峰浣嶅湴鍧�
+            plcParameterObject.setPlcAddressLength(Integer.valueOf(jsonfileobj.getStr("plcAddressLenght")));//璁剧疆鍦板潃闀垮害
+
+            for (int i = 0; i < jsonArray.size(); i++) {
+                JSONObject parameterObj = jsonArray.getJSONObject(i);
+                PlcParameterInfo plcParameterInfo = new PlcParameterInfo(jsonfileobj.getStr("plcAddressBegin")); //鍙傛暟瀹炰緥
+                String codeid = parameterObj.getStr("codeId");
+                plcParameterInfo.setCodeId(codeid);
+                plcParameterInfo.setAddressIndex(Integer.valueOf(parameterObj.getStr("addressIndex")));
+                //plcParameterInfo.setRatio(Integer.valueOf(parameterObj.getStr("ratio")));
+                plcParameterInfo.setAddressLength(Integer.valueOf(parameterObj.getStr("addressLenght")));
+                plcParameterInfo.setUnit(parameterObj.getStr("unit"));
+                plcParameterObject.addPlcParameter(plcParameterInfo);
+            }
+            // byte[] getplcvlues = {0x01, 0x02, 0x03, 0x04,0x01, 0x02, 0x03, 0x04,0x01, 0x02, 0x03, 0x04,0x01, 0x02,0x01, 0x02, 0x03, 0x04,0x01, 0x02, 0x03, 0x04,0x01, 0x02, 0x03, 0x04,0x01, 0x02,0x01, 0x02, 0x03, 0x04,0x01, 0x02, 0x03, 0x04,0x01, 0x02, 0x03, 0x04,0x01, 0x02};
+            // byte[] getplcvlues = S7control.getinstance().ReadByte(plcParameterObject.getPlcAddressBegin(), plcParameterObject.getPlcAddressLength());
+            // plcParameterObject.setPlcParameterList(getplcvlues);
+
+            return plcParameterObject;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    //鍒濆鍖朾it
+    public static PlcBitObject initbit(String jsonFilePath) {
+        PlcBitObject plcBitObject = new PlcBitObject();
+
+        try {
+            FileReader fileReader = new FileReader(jsonFilePath);
+            BufferedReader bufferedReader = new BufferedReader(fileReader);
+
+            StringBuilder content = new StringBuilder();
+            String line;
+
+            while ((line = bufferedReader.readLine()) != null) {
+                content.append(line);
+            }
+
+            bufferedReader.close();
+            fileReader.close();
+
+            JSONObject jsonfileobj = new JSONObject(content.toString());
+            JSONArray jsonArray = jsonfileobj.getJSONArray("parameteInfor");
+            plcBitObject.setPlcAddressBegin(jsonfileobj.getStr("plcAddressBegin"));//璁剧疆璧峰浣嶅湴鍧�
+            plcBitObject.setPlcAddressLength(Integer.valueOf(jsonfileobj.getStr("plcAddressLenght")));//璁剧疆鍦板潃闀垮害
+
+            for (int i = 0; i < jsonArray.size(); i++) {
+                JSONObject parameterObj = jsonArray.getJSONObject(i);
+
+                PlcBitInfo plcBitInfo = new PlcBitInfo(jsonfileobj.getStr("plcAddressBegin")); //鍙傛暟瀹炰緥
+                String codeid = parameterObj.getStr("codeId");
+                plcBitInfo.setCodeId(codeid);
+                plcBitInfo.setAddressIndex(Integer.valueOf(parameterObj.getStr("addressIndex")));
+
+                plcBitObject.addPlcBit(plcBitInfo);
+            }
+            System.out.println("");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        //Boolean[] values1 = { false, true, true, true, false, false, true, false,
+        //  false, true ,true };
+        // List<Boolean> getplcvlues = new ArrayList<>(Arrays.asList(values1));
+
+//        List<Boolean> getplcvlues = S7control.getinstance().ReadBits(plcBitObject.getPlcAddressBegin(), plcBitObject.getPlcAddressLength());
+//        plcBitObject.setPlcBitList(getplcvlues);
+        return plcBitObject;
+    }
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/S7control.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/S7control.java
new file mode 100644
index 0000000..8385a74
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/S7control.java
@@ -0,0 +1,489 @@
+package com.mes.tools;
+
+import com.github.s7connector.api.DaveArea;
+import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType;
+import com.github.xingshuangs.iot.protocol.s7.service.MultiAddressWrite;
+import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+public class S7control {
+
+    S7PLC s7PLC; // PLC閫氳绫诲疄渚�
+
+    public S7control(EPlcType plcType, String ip, int port, int rack, int slot) {
+        if (s7PLC == null) {
+            s7PLC = new S7PLC(plcType, ip, port, 0, 0);
+        }
+    }
+
+    /**
+     * 鍏抽棴瑗块棬瀛恠7閫氳杩炴帴
+     */
+    public void closeS7client() {
+        if (s7PLC != null) {
+            s7PLC.close();
+        }
+    }
+
+    /**
+     * 閲嶅惎瑗块棬瀛恠7閫氳杩炴帴
+     */
+    public boolean reStartS7client() {
+        if (s7PLC != null) {
+            try {
+                s7PLC.hotRestart();
+                return true;
+            } catch (Exception ex) {
+                return false;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * s7閫氳杩炴帴鐘舵��
+     */
+    public boolean checkConnected() {
+        return s7PLC.checkConnected();
+    }
+
+    /**
+     * 鎸夋寚瀹氱殑鍦板潃 鍐欏叆涓�涓獁ord
+     *
+     * @param address 鍦板潃
+     * @param data    word鐨勫��
+     */
+    public boolean writeWord(String address, int data) {
+        if (s7PLC == null) {
+            return false;
+        }
+        boolean result = false;
+        int tryCount = 2;
+        do {
+            try {
+                s7PLC.writeUInt16(address, data);
+                result = true;
+            } catch (Exception ex) {
+                System.out.println("鍚憄lc鍐欏懡浠よ繃绋嬩腑鍙戠敓寮傚父锛屽師鍥犱负锛�" + ex.getMessage());
+                reStartS7client();
+            } finally {
+                tryCount -= 1;
+            }
+        }
+        while (!result && tryCount > 0);
+        return result;
+    }
+
+    /**
+     * 浠庢煇鍦板潃杩炵画 鍐欏叆澶氫釜word
+     *
+     * @param address 鍦板潃
+     * @param datas   word鐨勫��
+     */
+    public boolean writeWord(String address, List<Integer> datas) {
+        if (s7PLC == null) {
+            return false;
+        }
+        boolean result = false;
+        int tryCount = 2;
+        // s7PLC.write(address, data);
+        List<String> addresslist = getAddressList(address, datas.size(), 16);
+        MultiAddressWrite addressWrite = new MultiAddressWrite();
+        for (int i = 0; i < datas.size(); i++) {
+            addressWrite.addUInt16(addresslist.get(i), datas.get(i));
+        }
+        do {
+            try {
+                s7PLC.writeMultiData(addressWrite);
+                result = true;
+            } catch (Exception ex) {
+                reStartS7client();
+            } finally {
+                tryCount -= 1;
+            }
+        }
+        while (!result && tryCount > 0);
+        return result;
+
+    }
+
+    /**
+     * 鎸夋寚瀹氱殑鍦板潃 鍐欏叆澶氫釜word
+     *
+     * @param address 鍦板潃
+     * @param datas   word鐨勫��
+     */
+
+
+    /**
+     * 鎸夋寚瀹氱殑鍦板潃 鍐欏叆涓�涓狟it
+     *
+     * @param address 鍦板潃
+     * @param data    Bit鐨勫��
+     */
+    public boolean writeBit(String address, Boolean data) {
+        if (s7PLC == null) {
+            return false;
+        }
+        boolean result = false;
+        int tryCount = 2;
+        do {
+            try {
+                s7PLC.writeBoolean(address, data);
+                result = true;
+            } catch (Exception ex) {
+                reStartS7client();
+            } finally {
+                tryCount -= 1;
+            }
+        }
+        while (!result && tryCount > 0);
+        return result;
+    }
+
+    /**
+     * 鎸夋寚瀹氱殑鍦板潃 鍐欏叆澶氫釜bit
+     *
+     * @param address 鍦板潃
+     * @param datas   bit鐨勫��
+     */
+    public boolean writeBit(List<String> address, List<Boolean> datas) {
+        if (s7PLC == null) {
+            return false;
+        }
+
+        MultiAddressWrite addressWrite = new MultiAddressWrite();
+        for (int i = 0; i < address.size(); i++) {
+            addressWrite.addBoolean(address.get(i), datas.get(i));
+        }
+        boolean result = false;
+        int tryCount = 2;
+        do {
+            try {
+                s7PLC.writeMultiData(addressWrite);
+                result = true;
+            } catch (Exception ex) {
+                reStartS7client();
+            } finally {
+                tryCount -= 1;
+            }
+        }
+        while (!result && tryCount > 0);
+        return result;
+
+    }
+
+    /**
+     * 浠庢煇鍦板潃杩炵画 鍐欏叆澶氫釜bit
+     *
+     * @param address 鍦板潃
+     * @param datas   word鐨勫��
+     */
+    public boolean writeBit(String address, List<Boolean> datas) {
+        if (s7PLC == null) {
+            return false;
+        }
+
+        // s7PLC.write(address, data);
+        List<String> addresslist = getAddressList(address, datas.size(), 1);
+        MultiAddressWrite addressWrite = new MultiAddressWrite();
+        for (int i = 0; i < datas.size(); i++) {
+            addressWrite.addBoolean(addresslist.get(i), datas.get(i));
+        }
+        boolean result = false;
+        int tryCount = 2;
+        do {
+            try {
+                s7PLC.writeMultiData(addressWrite);
+                result = true;
+            } catch (Exception ex) {
+                reStartS7client();
+            } finally {
+                tryCount -= 1;
+            }
+        }
+        while (!result && tryCount > 0);
+        return result;
+    }
+
+    /**
+     * 鎸夋寚瀹氱殑鍦板潃 鍐欏叆澶氫釜byte
+     *
+     * @param address 鍦板潃
+     * @param datas   byte鐨勫��
+     */
+    public boolean writeByte(String address, byte[] datas) {
+        if (s7PLC == null) {
+            return false;
+        }
+        boolean result = false;
+        int tryCount = 2;
+        do {
+            try {
+                s7PLC.writeByte(address, datas);
+                result = true;
+            } catch (Exception ex) {
+                reStartS7client();
+            } finally {
+                tryCount -= 1;
+            }
+        }
+        while (!result && tryCount > 0);
+        return result;
+    }
+
+    /**
+     * 鎸夋寚瀹氱殑鍦板潃 璇诲彇word缁撴灉闆�
+     *
+     * @param address 鍦板潃
+     * @return 缁撴灉
+     */
+    public List<Integer> readWord(List<String> address) {
+        if (s7PLC == null) {
+            return null;
+        }
+        List<Integer> result = null;
+        try {
+            result = s7PLC.readUInt16(address);
+        } catch (Exception e) {
+            s7PLC.hotRestart();
+            System.out.println("璇诲彇 " + address + " 澶辫触锛�" + e.getMessage());
+
+        } finally {
+            return result;
+        }
+    }
+
+
+    /**
+     * 鎸夋寚瀹氱殑鍦板潃 璇诲彇word缁撴灉闆�
+     *
+     * @param address 鍦板潃
+     * @param count   杩炵画璇诲灏戜釜word
+     * @return 缁撴灉
+     */
+    public List<Integer> readWord(String address, int count) {
+        if (s7PLC == null) {
+            return null;
+        }
+        List<Integer> result = null;
+        List<String> addresslist = getAddressList(address, count, 16);
+        try {
+            result = s7PLC.readUInt16(addresslist);
+        } catch (Exception e) {
+            s7PLC.hotRestart();
+            System.out.println("璇诲彇 " + address + " 澶辫触锛�" + e.getMessage());
+        } finally {
+            return result;
+        }
+    }
+
+    /**
+     * 鎸夋寚瀹氱殑鍦板潃 璇诲彇byte缁撴灉闆�
+     *
+     * @param address 鍦板潃
+     * @param count   杩炵画璇诲灏戜釜byte
+     * @return 缁撴灉
+     */
+    public byte[] readByte(String address, int count) {
+        if (s7PLC == null) {
+            return null;
+        }
+        // List<String> addresslist = GetAddressList(address, count, 16);
+        byte[] bytes = null;
+        try {
+            bytes = s7PLC.readByte(address, count);
+        } catch (Exception e) {
+            // 澶勭悊寮傚父
+            s7PLC.hotRestart();
+            System.out.println("璇诲彇 " + address + " 澶辫触锛�" + e.getMessage());
+        } finally {
+            return bytes;
+        }
+
+    }
+
+    /**
+     * 鎸夋寚瀹氱殑鍦板潃 鎸塨it浣� 0 flase 1 true 璇诲彇缁撴灉
+     *
+     * @param addresslist 鍦板潃闆�
+     * @return Boolean缁撴灉
+     */
+    public List<Boolean> readBits(List<String> addresslist) {
+        if (s7PLC == null) {
+            return null;
+        }
+        List<Boolean> values = new ArrayList<>();
+        try {
+            values = s7PLC.readBoolean(addresslist);
+        } catch (Exception e) {
+            // 澶勭悊寮傚父
+            s7PLC.hotRestart();
+        } finally {
+            return values;
+        }
+    }
+
+   /* //璇诲彇涓嶈繛缁湴鍧�bit
+    public List<Boolean> readBits(List<String> addressList) {
+        if (s7PLC == null || addressList.isEmpty()) {
+            return null;
+        }
+
+        List<Boolean> values = new ArrayList<>();
+        for (String address : addressList) {
+            try {
+                boolean value = s7PLC.readBoolean(address);
+                values.add(value);
+            } catch (Exception e) {
+                // 澶勭悊寮傚父
+                System.out.println("璇诲彇 " + address + " 澶辫触锛�" + e.getMessage());
+            }
+        }
+
+        return values;
+    }*/
+
+
+    //璇诲彇瀛楃涓�
+    public String readString(String address) {
+        if (s7PLC == null) {
+            return null;
+        }
+        String result = null;
+        try {
+            result = s7PLC.readString(address);
+        } catch (Exception e) {
+            s7PLC.hotRestart();
+            System.out.println("璇诲彇 " + address + " 澶辫触锛�" + e.getMessage());
+        } finally {
+            return result;
+        }
+    }
+
+
+    //璇诲彇鏃堕棿
+    public Long readtime(String address) {
+        if (s7PLC == null) {
+            return null;
+        }
+        Long result = null;
+        try {
+            result = s7PLC.readTime(address);
+        } catch (Exception e) {
+            s7PLC.hotRestart();
+            System.out.println("璇诲彇 " + address + " 澶辫触锛�" + e.getMessage());
+        } finally {
+            return result;
+        }
+    }
+
+
+    public boolean writetime(String address, long datas) {
+        if (s7PLC == null) {
+            return false;
+        }
+        boolean result = false;
+        int tryCount = 2;
+        do {
+            try {
+                s7PLC.writeTime(address, datas); // 灏嗘暟鎹啓鍏ュ崟涓湴鍧�
+                result = true;
+            } catch (Exception ex) {
+                reStartS7client();
+            } finally {
+                tryCount -= 1;
+            }
+        }
+        while (!result && tryCount > 0);
+        return result;
+    }
+
+
+    /**
+     * 浠庢寚瀹氱殑鍦板潃寮�濮� 杩炵画鎸塨it浣嶈鍙�
+     *
+     * @param address 鍦板潃
+     * @param count   闀垮害
+     * @return Boolean缁撴灉
+     */
+    public List<Boolean> readBits(String address, int count) {
+        if (s7PLC == null) {
+            return null;
+        }
+        List<Boolean> values = new ArrayList<>();
+        List<String> addresslist = getAddressList(address, count, 1);
+        try {
+            values = s7PLC.readBoolean(addresslist);
+        } catch (Exception e) {
+            s7PLC.hotRestart();
+            System.out.println("璇诲彇 " + address + " 澶辫触锛�" + e.getMessage());
+        } finally {
+            return values;
+        }
+    }
+
+    ;
+
+
+    private List<String> getAddressList(String address, int count, int addedbit) {
+        List<String> addresslist = new ArrayList<String>();
+
+        String[] stringdatas = address.trim().split("\\.");
+        if (stringdatas.length < 2 || !address.startsWith("DB")) {
+            return null;
+        }
+        int dbwindex = 0;
+        int bitindex = 0;
+        if (stringdatas.length == 2) {
+            dbwindex = Integer.parseInt(stringdatas[1]);
+        } else if (stringdatas.length == 3) {
+            dbwindex = Integer.parseInt(stringdatas[1]);
+            bitindex = Integer.parseInt(stringdatas[2]);
+        } else {
+            return null;
+        }
+
+        addresslist.add(address);
+        for (int i = 0; i < count - 1; i++) {
+
+            int bitcurrent = bitindex + addedbit;
+            if (bitcurrent > 7) {
+                dbwindex += bitcurrent / 8;
+                bitindex = 0;
+            } else {
+                bitindex = bitcurrent;
+            }
+
+            String endstr = stringdatas.length == 3 ? "." + bitindex : "";
+            addresslist.add(stringdatas[0] + "." + dbwindex + endstr);
+        }
+        return addresslist;
+    }
+
+    public void writeString(String addr,String data) {
+        s7PLC.writeString(addr,data);
+    }
+
+    public void writeUInt16(String addr,int data) {
+        s7PLC.writeUInt16(addr,data);
+    }
+
+    public void writeUInt32(String addr,int data) {
+        s7PLC.writeUInt32(addr,data);
+    }
+
+    public void writeStringy(String addr,String value) {
+        byte[] bytes = value.getBytes();
+        s7PLC.writeByte(addr,bytes);
+    }
+
+    public String readStrings(String addr) {
+        return s7PLC.readString(addr);
+    }
+
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/WebSocketServer.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/WebSocketServer.java
new file mode 100644
index 0000000..e7c58c8
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/tools/WebSocketServer.java
@@ -0,0 +1,174 @@
+package com.mes.tools;
+
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@ServerEndpoint(value = "/api/talk/{username}")
+@Component("webSocketServer")
+public class WebSocketServer {
+
+
+    public static ConfigurableApplicationContext applicationContext;
+
+    private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);
+    private List<String> messages;
+    /**
+     * 璁板綍褰撳墠鍦ㄧ嚎杩炴帴鏁�
+     */
+    public static final Map<String, ArrayList<WebSocketServer>> sessionMap = new ConcurrentHashMap<>();
+
+    public String username;
+    public Session session;
+
+    public WebSocketServer() {
+        this.messages = new ArrayList<>();
+    }
+
+    /**
+     * 杩炴帴寤虹珛鎴愬姛璋冪敤鐨勬柟娉�
+     */
+    @OnOpen
+    public void onOpen(Session session, @PathParam("username") String username) {
+        this.username = username;
+        this.session = session;
+        List<WebSocketServer> webSocketServers = sessionMap.get(username);
+        if (webSocketServers == null) {
+            ArrayList<WebSocketServer> arrayListwebserver = new ArrayList<WebSocketServer>();
+            arrayListwebserver.add(this);
+            sessionMap.put(username, arrayListwebserver);
+        } else {
+            webSocketServers.add(this);
+        }
+
+        log.info("鏈夋柊鐢ㄦ埛鍔犲叆锛寀sername={}, 褰撳墠鍦ㄧ嚎浜烘暟涓猴細{}", username, sessionMap.get(username).size());
+
+        // JSONObject result = new JSONObject();
+        // JSONArray array = new JSONArray();
+        // result.set("users", array);
+        // for (Object key : sessionMap.keySet()) {
+        // JSONObject jsonObject = new JSONObject();
+        // jsonObject.set("username", key);
+        // array.add(jsonObject);
+        // }
+
+        // sendAllMessage(JSONUtil.toJsonStr(result)); // 鍚庡彴鍙戦�佹秷鎭粰鎵�鏈夌殑瀹㈡埛绔�
+    }
+
+    /**
+     * 杩炴帴鍏抽棴璋冪敤鐨勬柟娉�
+     */
+    @OnClose
+    public void onClose(Session session, @PathParam("username") String username) {
+        List<WebSocketServer> webSocketServers = sessionMap.get(username);
+        ArrayList<WebSocketServer> arrayListwebserver = new ArrayList<WebSocketServer>();
+        if (webSocketServers.size() > 1) {
+            for (WebSocketServer webSocketServer : webSocketServers) {
+                if (webSocketServer != this) {
+                    arrayListwebserver.add(webSocketServer);
+                }
+            }
+            sessionMap.put(username, arrayListwebserver);
+            log.info("绉婚櫎username={}涓�鍚嶇敤鎴穝ession, {}鐨勫綋鍓嶅湪绾夸汉鏁颁负锛歿}", username, username, sessionMap.get(username).size());
+        } else {
+            sessionMap.remove(username);
+            log.info("绉婚櫎username={}涓�鍚嶇敤鎴穝ession, {}杩炴帴鍏抽棴, 褰撳墠杩炴帴鏁颁负锛歿}", username, username, sessionMap.size());
+        }
+
+    }
+
+    /**
+     * 鏀跺埌瀹㈡埛绔秷鎭悗璋冪敤鐨勬柟娉�
+     * 鍚庡彴鏀跺埌瀹㈡埛绔彂閫佽繃鏉ョ殑娑堟伅
+     * onMessage 鏄竴涓秷鎭殑涓浆绔�
+     * 鎺ュ彈 娴忚鍣ㄧ socket.send 鍙戦�佽繃鏉ョ殑 json鏁版嵁
+     *
+     * @param message 瀹㈡埛绔彂閫佽繃鏉ョ殑娑堟伅
+     */
+    @OnMessage
+    public void onMessage(String message, Session session, @PathParam("username") String username) {
+        log.info("鏈嶅姟绔敹鍒扮敤鎴穟sername={}鐨勬秷鎭�:{}", username, message);
+        JSONObject obj = JSONUtil.parseObj(message);
+        String text = obj.getStr("data");
+
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.set("message", text);
+        this.messages.add(text);
+    }
+
+    @OnError
+    public void onError(Session session, Throwable error) {
+        log.error("鍙戠敓閿欒");
+        error.printStackTrace();
+    }
+
+    /**
+     * 鏈嶅姟绔彂閫佹秷鎭粰瀹㈡埛绔�
+     */
+    public void sendMessage(String message) {
+        try {
+            // log.info("鏈嶅姟绔粰瀹㈡埛绔痆{}]鍙戦�佹秷鎭瘂}", this.session.getId(), message);
+            if(this.session.isOpen()){
+                int maxChunkSize = 50000; // 瀹氫箟鏈�澶х殑鍒嗗潡澶у皬
+                int length = message.length();
+                if(length>50000){
+                    int chunks = (int) Math.ceil((double) length / maxChunkSize);
+                    //鍒嗗潡鍙戦�佹秷鎭�
+                    for (int i = 0; i < chunks; i++) {
+                        int startIndex = i * maxChunkSize;
+                        int endIndex = Math.min(startIndex + maxChunkSize, length);
+                        String chunk = message.substring(startIndex, endIndex);
+                        // 鍒ゆ柇鏄惁鏄渶鍚庝竴鍧楁秷鎭�
+                        boolean isLastChunk = (i == chunks - 1);
+                        if(isLastChunk==true){
+                            chunk+="<END>";
+                        }
+                        // 鍙戦�佸垎鍧楁秷鎭紝骞朵紶閫掓槸鍚︽槸鏈�鍚庝竴鍧楁秷鎭殑鏍囪瘑
+                        this.session.getBasicRemote().sendText(chunk);
+                    }
+                }else{
+                    this.session.getBasicRemote().sendText(message);
+                }
+
+            }
+        } catch (Exception e) {
+            //log.error("鍙戦�佹秷鎭粰瀹㈡埛绔け璐ワ細{}", e.getMessage(), e);
+        }
+    }
+
+    // /**
+    //  * 鏈嶅姟绔彂閫佹秷鎭粰鎵�鏈夊鎴风
+    //  */
+    // public void sendAllMessage(String message) {
+    //     try {
+    //         for (WebSocketServer webSocketServer : sessionMap.values()) {
+    //             // log.info("鏈嶅姟绔粰瀹㈡埛绔痆{}]鍙戦�佹秷鎭瘂}", this.session.getId(), message);
+    //             webSocketServer.sendMessage(message);
+    //         }
+    //     } catch (Exception e) {
+    //         log.error("鏈嶅姟绔彂閫佹秷鎭粰瀹㈡埛绔け璐�", e);
+    //     }
+    // }
+
+    public List<String> getMessages() {
+        return messages;
+
+    }
+
+    public void clearMessages() {
+        messages.clear();
+    }
+
+
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/HexUtil.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/HexUtil.java
new file mode 100644
index 0000000..d6854c9
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/HexUtil.java
@@ -0,0 +1,269 @@
+package com.mes.utils;
+
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+public class HexUtil {
+    
+    public static String formatHex(String hex) {
+        String result = "";
+        
+        for (int i = 0; i < hex.length() - 1; i+=2) {
+            String output = hex.substring(i, i + 2);
+            result += ("0x" + output + " ");
+        }
+        
+        if (result.length() > 0) {
+            result = result.substring(0, result.lastIndexOf(" "));
+        }
+        
+        return result;
+    }
+    
+    //姝e父鐨勫瓧姣嶆暟瀛楀彉鎴愬瓧鑺傛暟鍙戦�佺粰鐩掑瓙
+    public static String asciiToHex(String str) {
+        char[] chars = str.toCharArray();
+        
+        StringBuffer hex = new StringBuffer();
+        for (int i = 0; i < chars.length; i++) {
+            hex.append(Integer.toHexString(chars[i]));
+        }
+        
+        return hex.toString();
+    }
+    
+    public static String hexToAscii(String hex) {
+        StringBuffer result = new StringBuffer();
+        
+        for (int i = 0; i < hex.length() - 1; i+= 2) {
+            String output = hex.substring(i, i + 2);
+            int decimal = Integer.parseInt(output, 16);
+            result.append((char) decimal);
+        }
+        
+        return result.toString();
+    }//12300    //00321
+    //浜岃繘鍒惰浆鍗佽繘鍒�
+    public static int int2ToHex(String number) {
+        return Integer.parseInt(number, 2);
+    }
+    //浜岃繘鍒惰浆16杩涘埗 4浣�
+    public static String intBinaryTo16(String number) {
+    	int num=int2ToHex(number);
+        return intTo2ByteHex(num);
+    }
+    //鍗佸叚杩涘埗杞崄杩涘埗
+    public static int int16ToHex(String number) {
+        return Integer.parseInt(number, 16);
+    }
+    //鍗佽繘鍒惰浆浜岃繘鍒�
+    public static String intToBinary(int number) {
+        return Integer.toBinaryString(number);
+    }
+    //鍗佸叚杩涘埗杞簩杩涘埗 
+    public static String int16ToBinary(String number) {
+        return intToBinary(int16ToHex(number));
+    }
+    //鍗佸叚杩涘埗杞簩杩涘埗  
+    public static String int16ToBinaryEight(String number,int count) {
+    	String binary=int16ToBinary(number);
+    	String zero="";
+    	for (int i = 0; i <count-binary.length(); i++) {
+    		zero+="0";
+		}
+    	binary=zero+binary;
+        return binary;
+    }
+    
+    public static String intToHex(int number) {
+        return Integer.toHexString(number);
+    }
+    
+    /**
+     * 灏嗘暣鏁拌浆鎹负2浣�16杩涘埗锛屽1杞崲涓�01锛�10杞崲涓�0a
+     * 
+     * @param number
+     * @return
+     */
+    public static String intTo1ByteHex(int number) {
+        String numberHex = HexUtil.intToHex(number);
+        
+        numberHex = String.format("%2s", numberHex).replace(' ', '0');
+        
+        return numberHex;
+    }
+    
+    /**
+     * 灏嗘暣鏁拌浆鎹负4浣�16杩涘埗锛屽1杞崲涓�0001锛�10杞崲涓�000a
+     * 
+     * @param number
+     * @return
+     */
+    public static String intTo2ByteHex(int number) {
+        String numberHex = HexUtil.intToHex(number);
+        
+        numberHex = String.format("%4s", numberHex).replace(' ', '0');
+        
+        return numberHex;
+    }
+    
+    /**
+     * 灏嗘暣鏁拌浆鎹负8浣�16杩涘埗锛屽1杞崲涓�00000001锛�10杞崲涓�0000000a
+     * 
+     * @param number
+     * @return
+     */
+    public static String intTo4ByteHex(int number) {
+        String numberHex = HexUtil.intToHex(number);       
+        numberHex = String.format("%8s", numberHex).replace(' ', '0');       
+        return numberHex;
+    }
+    
+    /**
+     * 灏嗘椂闂磋浆鎹负16杩涘埗鏍煎紡锛屽勾锛�2瀛楄妭锛� + 鏈堬紙1瀛楄妭锛� + 鏃ワ紙1瀛楄妭锛� + 鏃讹紙1瀛楄妭锛� + 鍒嗭紙1瀛楄妭锛� + 绉掞紙1瀛楄妭锛�
+     * 
+     * @param time
+     * @return
+     */
+    public static String timeToHex(Date time) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(time);
+        
+        String yearHex = intTo2ByteHex(c.get(Calendar.YEAR));
+        String monthHex = intTo1ByteHex(c.get(Calendar.MONTH) + 1);
+        String dayHex = intTo1ByteHex(c.get(Calendar.DAY_OF_MONTH));
+        String hourHex = intTo1ByteHex(c.get(Calendar.HOUR_OF_DAY));
+        String minuteHex = intTo1ByteHex(c.get(Calendar.MINUTE));
+        String secondHex = intTo1ByteHex(c.get(Calendar.SECOND));
+        
+        return yearHex + monthHex + dayHex + hourHex + minuteHex + secondHex;
+    }
+    
+    /**
+     * 灏�16杩涘埗鐨勬椂闂磋浆鎹负yyyy-MM-dd HH:mm:ss鐨勬牸寮�
+     * 
+     * @param hexTime
+     * @return
+     */
+    public static String hexToTime(String hexTime) {
+        String year = hexTo4DigitInt(hexTime.substring(0, 4));
+        String month = hexTo2DigitInt(hexTime.substring(4, 6));
+        String day = hexTo2DigitInt(hexTime.substring(6, 8));
+        String hour = hexTo2DigitInt(hexTime.substring(8, 10));
+        String minute = hexTo2DigitInt(hexTime.substring(10, 12));
+        String second = hexTo2DigitInt(hexTime.substring(12, 14));
+        
+        return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
+    }
+    //鍗佸叚杩涘埗杞�10杩涘埗
+    public static int hexToInt(String hex) {
+        return Integer.parseInt(hex, 16);
+    }
+    //鍗佸叚杩涘埗杞垚10杩涘埗鍥涗綅
+    public static String hexTo4DigitInt(String hex) {
+        return new DecimalFormat("0000").format(hexToInt(hex));
+    }
+    //鍗佸叚杩涘埗杞垚10杩涘埗涓や綅
+    public static String hexTo2DigitInt(String hex) {
+        return new DecimalFormat("00").format(hexToInt(hex));
+    }
+    
+    public static byte[] stringToInt(String a){
+        byte[] byt = new byte[a.length()/2];
+        for (int i = 0; i < a.length() - 1; i+=2) {
+            String output = a.substring(i, i + 2);
+            byt[i/2]=(byte)Integer.parseInt(output, 16);
+        }
+
+        return byt;
+    }
+    
+    /**
+     * 灏嗗瓧鑺傝浆鎹负涓や綅鍗佸叚杩涘埗瀛楃涓诧紝涓嶅浣嶅墠鍔�0
+     * 
+     * @param b
+     * @return
+     */
+    public static String byteToHexString(byte b) {
+        String hex = Integer.toHexString(b & 0xFF);
+        
+        if (hex.length() == 1) {
+            hex = "0" + hex;
+        }
+        
+        return hex;
+    }
+    
+    /**
+     * 灏嗗崄鍏繘鍒跺瓧绗︼紝杞崲鎴愪簩杩涘埗鐨勫瓧绗�
+     * 
+     * @param b
+     * @return
+     */
+	 public static String getBin(String hex){
+		String[] hexs = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
+				 "a", "b", "c", "d", "e", "f"};
+		String[] bins = new String[]{"0000", "0001", "0010", "0011", "0100", "0101",
+				 "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
+		int i;
+		for(i=0; i<hexs.length && !hex.toLowerCase().equals(hexs[i]); i++);
+			return bins[i];
+	 	}
+    
+	   /**
+	     * 灏嗗崄鍏繘鍒跺瓧绗︼紝杞崲鎴愪簩杩涘埗鐨勫瓧绗�
+	     * 
+	     * @param b
+	     * @return
+	     */
+		 public static String gethex(String hex){
+			String[] hexs = new String[]{"0000", "0001", "0002", "0003", "0004", "0005", "0006", "0007", "0008", "0009",
+					 "000a", "000b", "000c", "000d", "000e", "000f"};
+			String[] bins = new String[]{"0000", "0001", "0010", "0011", "0100", "0101",
+					 "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
+			int i;
+			for(i=0; i<bins.length && !hex.toLowerCase().equals(bins[i]); i++);
+				return hexs[i];
+		 	}
+	 
+	 
+    
+    /**
+     * 鍗佽繘鍒跺瓧鑺傛暟缁勮浆鍗佸叚杩涘埗瀛楃涓�
+     * @param bufSize
+     * @param msg
+     * @return
+     */
+    public static String byteToHexString(int bufSize,byte[] msg){
+        String tempHex = "";
+        String command = "";
+        if (bufSize != -1) {
+            for (int i = 0; i < bufSize; i++) {
+                tempHex = Integer.toHexString(msg[i] & 0xFF);
+
+                if (tempHex.length() == 1) {
+                    tempHex = "0" + tempHex;
+                }
+                command += tempHex;
+            }
+        }
+        return command;
+    }
+    
+    public static String hexToBinary(String hexString) {
+        String binaryString = Integer.toBinaryString(hexToInt(hexString));
+        return String.format("%16s", binaryString).replace(' ', '0');
+    }
+    
+    public static String binaryTo2ByteHex(String binaryString) {
+        String HexString = Integer.toHexString(Integer.parseInt(binaryString, 2));
+        return String.format("%4s", HexString).replace(' ', '0');
+    }
+    
+    public static String hexTo2Binary(String hexString) {
+        String binaryString = Integer.toBinaryString(hexToInt(hexString));
+        return String.format("%8s", binaryString).replace(' ', '0');
+    }
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/MD5.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/MD5.java
new file mode 100644
index 0000000..e0153d2
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/MD5.java
@@ -0,0 +1,36 @@
+package com.mes.utils;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+
+public final class MD5 {
+
+    public static String encrypt(String strSrc) {
+        try {
+            char hexChars[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
+                    '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+            byte[] bytes = strSrc.getBytes();
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            md.update(bytes);
+            bytes = md.digest();
+            int j = bytes.length;
+            char[] chars = new char[j * 2];
+            int k = 0;
+            for (int i = 0; i < bytes.length; i++) {
+                byte b = bytes[i];
+                chars[k++] = hexChars[b >>> 4 & 0xf];
+                chars[k++] = hexChars[b & 0xf];
+            }
+            return new String(chars);
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+            throw new RuntimeException("MD5鍔犲瘑鍑洪敊锛侊紒+" + e);
+        }
+    }
+
+    public static void main(String[] args) {
+        System.out.println(MD5.encrypt("111111"));
+    }
+
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/ResponseUtil.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/ResponseUtil.java
new file mode 100644
index 0000000..ad4f177
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/ResponseUtil.java
@@ -0,0 +1,28 @@
+package com.mes.utils;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.http.HttpStatus;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/4/8 15:46
+ * @Description:
+ */
+public class ResponseUtil {
+
+    public static final String APPLICATION_JSON_UTF8_VALUE = "application/json;charset=UTF-8";
+
+    public static void out(HttpServletResponse response, Result r) {
+        ObjectMapper mapper = new ObjectMapper();
+        response.setStatus(HttpStatus.OK.value());
+        response.setContentType(APPLICATION_JSON_UTF8_VALUE);
+        try {
+            mapper.writeValue(response.getWriter(), r);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/Result.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/Result.java
new file mode 100644
index 0000000..9b9a681
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/Result.java
@@ -0,0 +1,56 @@
+package com.mes.utils;
+
+import lombok.Data;
+
+
+@Data
+public class Result<T> {
+    private Integer code;
+    private String message;
+    private T data;
+
+    private Result() {
+
+    }
+
+    public static <T> Result<T> build(Integer code, String message, T data) {
+        Result<T> result = new Result<T>();
+        result.setCode(code);
+        result.setMessage(message);
+        if (data != null) {
+            result.setData(data);
+        }
+        return result;
+    }
+
+    public static <T> Result<T> build(ResultCodeEnum resultCodeEnum, T data) {
+        Result<T> result = new Result<T>();
+        result.setCode(resultCodeEnum.getCode());
+        result.setMessage(resultCodeEnum.getMessage());
+        if (data != null) {
+            result.setData(data);
+        }
+        return result;
+    }
+
+    public static <T> Result<T> success() {
+        return build(ResultCodeEnum.SUCCESS, null);
+    }
+
+    public static <T> Result<T> success(T data) {
+        return build(ResultCodeEnum.SUCCESS.getCode(), "", data);
+    }
+
+
+    public static Result error(Integer code, String msg) {
+        return build(code, msg, null);
+    }
+
+    public static <T> Result<T> error(T data) {
+        return build(ResultCodeEnum.FAIL.getCode(), "", data);
+    }
+
+    public static <T> Result<T> error() {
+        return build(ResultCodeEnum.FAIL.getCode(), "鏈嶅姟鍣ㄥ彂鐢熷紓甯�", null);
+    }
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/ResultCodeEnum.java b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/ResultCodeEnum.java
new file mode 100644
index 0000000..f29b532
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/java/com/mes/utils/ResultCodeEnum.java
@@ -0,0 +1,33 @@
+package com.mes.utils;
+
+import lombok.Getter;
+
+/**
+ * @author zhoush
+ */
+
+@Getter
+public enum ResultCodeEnum {
+
+    SUCCESS(200, "鎴愬姛"),
+    FAIL(201, "澶辫触"),
+    SERVICE_ERROR(2012, "鏈嶅姟寮傚父"),
+    DATA_ERROR(204, "鏁版嵁寮傚父"),
+    ILLEGAL_REQUEST(205, "闈炴硶璇锋眰"),
+    REPEAT_SUBMIT(206, "閲嶅鎻愪氦"),
+
+    LOGIN_AUTH(208, "鏈櫥闄�"),
+    PERMISSION(209, "娌℃湁鏉冮檺"),
+
+
+    ;
+
+    private Integer code;
+
+    private String message;
+
+    ResultCodeEnum(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+}
diff --git a/ShangHaiMesParent/common/servicebase/src/main/resources/banner.txt b/ShangHaiMesParent/common/servicebase/src/main/resources/banner.txt
new file mode 100644
index 0000000..b4027f0
--- /dev/null
+++ b/ShangHaiMesParent/common/servicebase/src/main/resources/banner.txt
@@ -0,0 +1,32 @@
+________                ________                 ___       _____________   ____
+`MMMMMMMb.          68b `MMMMMMMb.               `MMb     dMM'`MMMMMMMMM  6MMMMb\
+ MM    `Mb          Y89  MM    `Mb                MMM.   ,PMM  MM      \ 6M'    `
+ MM     MM   ____   ___  MM     MM   _____        M`Mb   d'MM  MM        MM
+ MM    .M9  6MMMMb  `MM  MM    .M9  6MMMMMb       M YM. ,P MM  MM    ,   YM.
+ MMMMMMM(  6M'  `Mb  MM  MMMMMMM(  6M'   `Mb      M `Mb d' MM  MMMMMMM    YMMMMb
+ MM    `Mb MM    MM  MM  MM    `Mb MM     MM      M  YM.P  MM  MM    `        `Mb
+ MM     MM MMMMMMMM  MM  MM     MM MM     MM      M  `Mb'  MM  MM              MM
+ MM     MM MM        MM  MM     MM MM     MM      M   YP   MM  MM              MM
+ MM    .M9 YM    d9  MM  MM    .M9 YM.   ,M9 68b  M   `'   MM  MM      / L    ,M9
+_MMMMMMM9'  YMMMM9  _MM__MMMMMMM9'  YMMMMM9  Y89 _M_      _MM__MMMMMMMMM MYMMMM9
+
+//                          _ooOoo_                               //
+//                         o8888888o                              //
+//                         88" . "88                              //
+//                         (| ^_^ |)                              //
+//                         O\  =  /O                              //
+//                      ____/`---'\____                           //
+//                    .'  \\|     |//  `.                         //
+//                   /  \\|||  :  |||//  \                        //
+//                  /  _||||| -:- |||||-  \                       //
+//                  |   | \\\  -  /// |   |                       //
+//                  | \_|  ''\---/''  |   |                       //
+//                  \  .-\__  `-`  ___/-. /                       //
+//                ___`. .'  /--.--\  `. . ___                     //
+//              ."" '<  `.___\_<|>_/___.'  >'"".                  //
+//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
+//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
+//      ========`-.____`-.___\_____/___.-`____.-'========         //
+//                           `=---='                              //
+//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
+//            浣涚淇濅綉       姘镐笉瀹曟満      姘告棤BUG                銆�銆�//
\ No newline at end of file
diff --git a/ShangHaiMesParent/common/springsecurity/pom.xml b/ShangHaiMesParent/common/springsecurity/pom.xml
new file mode 100644
index 0000000..9278822
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>common</artifactId>
+        <groupId>com.mes</groupId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>springsecurity</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.mes</groupId>
+            <artifactId>servicebase</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+
+        <!-- Spring Security渚濊禆 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.0</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/ShangHaiMesParent/common/springsecurity/springsecurity1.iml b/ShangHaiMesParent/common/springsecurity/springsecurity1.iml
new file mode 100644
index 0000000..06737b0
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/springsecurity1.iml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="servicebase-1.0-SNAPSHOT" level="project" />
+    <orderEntry type="module" module-name="servicebase1" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/config/RedisConfig.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/config/RedisConfig.java
new file mode 100644
index 0000000..e469272
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/config/RedisConfig.java
@@ -0,0 +1,37 @@
+package com.mes.common.config;
+
+import com.mes.common.utils.FastJsonRedisSerializer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/4/9 19:13
+ * @Description:
+ */
+@Configuration
+public class RedisConfig {
+
+    @Bean
+    @SuppressWarnings(value = {"unchecked", "rawtypes"})
+    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
+        RedisTemplate<Object, Object> template = new RedisTemplate<>();
+        template.setConnectionFactory(connectionFactory);
+
+        FastJsonRedisSerializer serializer = new FastJsonRedisSerializer(Object.class);
+
+        // 浣跨敤StringRedisSerializer鏉ュ簭鍒楀寲鍜屽弽搴忓垪鍖杛edis鐨刱ey鍊�
+        template.setKeySerializer(new StringRedisSerializer());
+        template.setValueSerializer(serializer);
+
+        // Hash鐨刱ey涔熼噰鐢⊿tringRedisSerializer鐨勫簭鍒楀寲鏂瑰紡
+        template.setHashKeySerializer(new StringRedisSerializer());
+        template.setHashValueSerializer(serializer);
+
+        template.afterPropertiesSet();
+        return template;
+    }
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/config/TokenWebSecurityConfig.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/config/TokenWebSecurityConfig.java
new file mode 100644
index 0000000..a130533
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/config/TokenWebSecurityConfig.java
@@ -0,0 +1,94 @@
+package com.mes.common.config;
+
+
+import com.mes.common.filter.JwtAuthenticationTokenFilter;
+import com.mes.common.handler.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+
+@Configuration
+@EnableWebSecurity
+@EnableGlobalMethodSecurity(prePostEnabled = true)
+public class TokenWebSecurityConfig extends WebSecurityConfigurerAdapter {
+    @Autowired
+    private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;
+    @Autowired
+    LoginFailureHandler loginFailureHandler;
+
+    @Autowired
+    LoginSuccessHandler loginSuccessHandler;
+
+    @Autowired
+    JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;
+
+    @Autowired
+    JwtAccessDeniedHandler jwtAccessDeniedHandler;
+
+    @Autowired
+    JwtLogoutSuccessHandler jwtLogoutSuccessHandler;
+
+    @Bean
+    public PasswordEncoder passwordEncoder() {
+        return new BCryptPasswordEncoder();
+    }
+
+    /**
+     * 閰嶇疆杩囨护瑙勫垯
+     */
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+
+        http.cors().and().csrf().disable()
+
+                // 鐧诲綍閰嶇疆
+                .formLogin()
+                .successHandler(loginSuccessHandler)
+                .failureHandler(loginFailureHandler)
+
+                .and()
+                .logout()
+                .logoutSuccessHandler(jwtLogoutSuccessHandler)
+
+                // 绂佺敤session
+                .and()
+                .sessionManagement()
+                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
+
+                // 閰嶇疆鎷︽埅瑙勫垯
+                .and()
+                .authorizeRequests()
+                .antMatchers("/sys/user/login").anonymous()
+                .antMatchers("/swagger-ui.html").permitAll()
+                .antMatchers("/webjars/**").permitAll()
+                .antMatchers("/v2/**").permitAll()
+                .antMatchers("/swagger-resources/**").permitAll()
+                .antMatchers("/**").permitAll()
+                .anyRequest().authenticated()
+
+                // 寮傚父澶勭悊鍣�
+                .and()
+                .exceptionHandling()
+                .authenticationEntryPoint(jwtAuthenticationEntryPoint)
+                .accessDeniedHandler(jwtAccessDeniedHandler)
+
+                // 閰嶇疆鑷畾涔夌殑杩囨护鍣�
+                .and()
+                .addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
+    }
+
+    @Bean
+    @Override
+    public AuthenticationManager authenticationManagerBean() throws Exception {
+        return super.authenticationManagerBean();
+    }
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/filter/JwtAuthenticationTokenFilter.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/filter/JwtAuthenticationTokenFilter.java
new file mode 100644
index 0000000..1505d1b
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/filter/JwtAuthenticationTokenFilter.java
@@ -0,0 +1,80 @@
+package com.mes.common.filter;
+
+import com.mes.common.utils.JwtUtil;
+import com.mes.common.utils.RedisUtil;
+import com.mes.common.utils.UserInfoUtils;
+import com.mes.userinfo.entity.LoginUser;
+import com.mes.userinfo.service.SysUserService;
+import io.jsonwebtoken.Claims;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import javax.annotation.Resource;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/4/10 9:42
+ * @Description:
+ */
+@Component
+public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
+    // 姝ゅ瑙i噴涓轰粈涔堜笉鍘诲疄鐜癋ilter鎺ュ彛锛屽洜涓哄湪鏌愪簺鎯呭喌涓嬩細杩囨护涓ゆ锛屾墽琛屼袱娆ilter閲岄潰鐨勬柟娉曪紝鎵�浠ユ垜浠�夋嫨缁ф壙SpringSecurity涓殑OncePerRequestFilter
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Resource
+    private SysUserService sysUserService;
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
+        //鑾峰彇token
+        String token = request.getHeader("token");
+        if (!StringUtils.hasText(token)) {
+            //鏀捐
+            filterChain.doFilter(request, response);
+            return; // 姝ゅ鍔犱笂return濂藉鏄悗闈㈢粨鏋滆繑鍥炵殑鏃跺�欏氨涓嶄細鍐嶈蛋涓�閬嶆杩囨护鍣ㄧ殑鏂规硶浜�
+        }
+        //瑙f瀽token
+        String userid;
+        try {
+            Claims claims = JwtUtil.getClaimByToken(token);
+            userid = claims.getSubject();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("token闈炴硶");
+        }
+        //浠巖edis涓幏鍙栫敤鎴蜂俊鎭�
+        String redisKey = "login:" + userid;
+        LoginUser loginUser = redisUtil.getCacheObject(redisKey);
+        if (Objects.isNull(loginUser)) {
+            response.setHeader("token", "");
+            throw new RuntimeException("鐢ㄦ埛鏈櫥褰�");
+        }
+        //灏嗙敤鎴蜂俊鎭斁鍏ュ綋鍓嶇嚎绋�
+        UserInfoUtils.set(loginUser.getUser());
+        //瀛樺叆SecurityContextHolder锛屼互渚涘悗闈㈢殑杩囨护鍣ㄤ娇鐢�
+        List<String> permissionKeyList = sysUserService.getUserAuthorityInfo(Long.parseLong(userid));
+        List<GrantedAuthority> authorities = permissionKeyList.stream().
+                map(SimpleGrantedAuthority::new)
+                .collect(Collectors.toList());
+        UsernamePasswordAuthenticationToken authenticationToken =
+                new UsernamePasswordAuthenticationToken(loginUser, null, authorities);
+        SecurityContextHolder.getContext().setAuthentication(authenticationToken);
+        //鏀捐
+        filterChain.doFilter(request, response);
+    }
+}
\ No newline at end of file
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAccessDeniedHandler.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAccessDeniedHandler.java
new file mode 100644
index 0000000..aad53aa
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAccessDeniedHandler.java
@@ -0,0 +1,35 @@
+package com.mes.common.handler;
+
+import cn.hutool.json.JSONUtil;
+import com.mes.utils.Result;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.web.access.AccessDeniedHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class JwtAccessDeniedHandler implements AccessDeniedHandler {
+
+	@Override
+	public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
+
+		response.setContentType("application/json;charset=UTF-8");
+		response.setStatus(HttpServletResponse.SC_FORBIDDEN);
+
+		ServletOutputStream outputStream = response.getOutputStream();
+
+		Result result = Result.error(HttpStatus.FORBIDDEN.value(), "鏉冮檺涓嶈冻");
+
+		outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8"));
+
+		outputStream.flush();
+		outputStream.close();
+
+	}
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAuthenticationEntryPoint.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAuthenticationEntryPoint.java
new file mode 100644
index 0000000..a95ca0c
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAuthenticationEntryPoint.java
@@ -0,0 +1,33 @@
+package com.mes.common.handler;
+
+import cn.hutool.json.JSONUtil;
+import com.mes.utils.Result;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
+
+	@Override
+	public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
+
+		response.setContentType("application/json;charset=UTF-8");
+		response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+		ServletOutputStream outputStream = response.getOutputStream();
+
+		Result result = Result.error(HttpStatus.UNAUTHORIZED.value(), "璁よ瘉澶辫触璇烽噸鏂扮櫥褰�");
+
+		outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8"));
+
+		outputStream.flush();
+		outputStream.close();
+	}
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtLogoutSuccessHandler.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtLogoutSuccessHandler.java
new file mode 100644
index 0000000..3757d4d
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtLogoutSuccessHandler.java
@@ -0,0 +1,40 @@
+package com.mes.common.handler;
+
+import cn.hutool.json.JSONUtil;
+import com.mes.utils.Result;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
+import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class JwtLogoutSuccessHandler implements LogoutSuccessHandler {
+
+	private static final String header = "Authorization";
+
+	@Override
+	public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
+
+		if (authentication != null) {
+			new SecurityContextLogoutHandler().logout(request, response, authentication);
+		}
+
+		response.setContentType("application/json;charset=UTF-8");
+		ServletOutputStream outputStream = response.getOutputStream();
+
+		response.setHeader(header, "");
+
+		Result result = Result.success("");
+
+		outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8"));
+
+		outputStream.flush();
+		outputStream.close();
+	}
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginFailureHandler.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginFailureHandler.java
new file mode 100644
index 0000000..72abdbe
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginFailureHandler.java
@@ -0,0 +1,31 @@
+package com.mes.common.handler;
+
+import cn.hutool.json.JSONUtil;
+import com.mes.utils.Result;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.AuthenticationFailureHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class LoginFailureHandler implements AuthenticationFailureHandler {
+
+	@Override
+	public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
+
+		response.setContentType("application/json;charset=UTF-8");
+		ServletOutputStream outputStream = response.getOutputStream();
+
+		Result result = Result.error("鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒");
+
+		outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8"));
+
+		outputStream.flush();
+		outputStream.close();
+	}
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginSuccessHandler.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginSuccessHandler.java
new file mode 100644
index 0000000..c5458bb
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginSuccessHandler.java
@@ -0,0 +1,38 @@
+package com.mes.common.handler;
+
+import cn.hutool.json.JSONUtil;
+import com.mes.common.utils.JwtUtil;
+import com.mes.utils.Result;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class LoginSuccessHandler implements AuthenticationSuccessHandler {
+
+	private static final String header = "Authorization";
+
+	@Override
+	public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
+		response.setContentType("application/json;charset=UTF-8");
+		ServletOutputStream outputStream = response.getOutputStream();
+
+		// 鐢熸垚jwt锛屽苟鏀剧疆鍒拌姹傚ご涓�
+		String jwt = JwtUtil.generateToken(authentication.getName());
+		response.setHeader(header, jwt);
+
+		Result result = Result.success("");
+
+		outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8"));
+
+		outputStream.flush();
+		outputStream.close();
+	}
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/FastJsonRedisSerializer.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/FastJsonRedisSerializer.java
new file mode 100644
index 0000000..f8ab417
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/FastJsonRedisSerializer.java
@@ -0,0 +1,55 @@
+package com.mes.common.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.parser.ParserConfig;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.SerializationException;
+
+import java.nio.charset.Charset;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/4/11 15:28
+ * @Description:
+ */
+public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {
+
+    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
+
+    private Class<T> clazz;
+
+    static {
+        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
+    }
+
+    public FastJsonRedisSerializer(Class<T> clazz) {
+        super();
+        this.clazz = clazz;
+    }
+
+    @Override
+    public byte[] serialize(T t) throws SerializationException {
+        if (t == null) {
+            return new byte[0];
+        }
+        return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
+    }
+
+    @Override
+    public T deserialize(byte[] bytes) throws SerializationException {
+        if (bytes == null || bytes.length <= 0) {
+            return null;
+        }
+        String str = new String(bytes, DEFAULT_CHARSET);
+
+        return JSON.parseObject(str, clazz);
+    }
+
+
+    protected JavaType getJavaType(Class<?> clazz) {
+        return TypeFactory.defaultInstance().constructType(clazz);
+    }
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/JwtUtil.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/JwtUtil.java
new file mode 100644
index 0000000..f7af90a
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/JwtUtil.java
@@ -0,0 +1,55 @@
+package com.mes.common.utils;
+
+
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/4/9 19:15
+ * @Description:
+ */
+@Data
+public class JwtUtil {
+
+    private static final long expire = 60 * 60 * 1000L;
+    private static final String secret = "beibo";
+    private static final String header = "Authorization";
+
+    // 鐢熸垚jwt
+    public static String generateToken(String username) {
+
+        Date nowDate = new Date();
+        Date expireDate = new Date(nowDate.getTime() + 1000 * expire);
+
+        return Jwts.builder()
+                .setHeaderParam("typ", "JWT")
+                .setSubject(username)
+                .setIssuedAt(nowDate)
+                .setExpiration(expireDate)// 7澶╅亷鏈�
+                .signWith(SignatureAlgorithm.HS512, secret)
+                .compact();
+    }
+
+    // 瑙f瀽jwt
+    public static Claims getClaimByToken(String jwt) {
+        try {
+            return Jwts.parser()
+                    .setSigningKey(secret)
+                    .parseClaimsJws(jwt)
+                    .getBody();
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    // jwt鏄惁杩囨湡
+    public boolean isTokenExpired(Claims claims) {
+        return claims.getExpiration().before(new Date());
+    }
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/RedisUtil.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/RedisUtil.java
new file mode 100644
index 0000000..d11f2bc
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/RedisUtil.java
@@ -0,0 +1,235 @@
+package com.mes.common.utils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.BoundSetOperations;
+import org.springframework.data.redis.core.HashOperations;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * spring redis 宸ュ叿绫�
+ **/
+@Component
+public class RedisUtil {
+    @Autowired
+    public RedisTemplate redisTemplate;
+
+    /**
+     * 缂撳瓨鍩烘湰鐨勫璞★紝Integer銆丼tring銆佸疄浣撶被绛�
+     *
+     * @param key   缂撳瓨鐨勯敭鍊�
+     * @param value 缂撳瓨鐨勫��
+     */
+    public <T> void setCacheObject(final String key, final T value) {
+        redisTemplate.opsForValue().set(key, value);
+    }
+
+    /**
+     * 缂撳瓨鍩烘湰鐨勫璞★紝Integer銆丼tring銆佸疄浣撶被绛�
+     *
+     * @param key      缂撳瓨鐨勯敭鍊�
+     * @param value    缂撳瓨鐨勫��
+     * @param timeout  鏃堕棿
+     * @param timeUnit 鏃堕棿棰楃矑搴�
+     */
+    public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) {
+        redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
+    }
+
+    /**
+     * 璁剧疆鏈夋晥鏃堕棿
+     *
+     * @param key     Redis閿�
+     * @param timeout 瓒呮椂鏃堕棿
+     * @return true=璁剧疆鎴愬姛锛沠alse=璁剧疆澶辫触
+     */
+    public boolean expire(final String key, final long timeout) {
+        return expire(key, timeout, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 璁剧疆鏈夋晥鏃堕棿
+     *
+     * @param key     Redis閿�
+     * @param timeout 瓒呮椂鏃堕棿
+     * @param unit    鏃堕棿鍗曚綅
+     * @return true=璁剧疆鎴愬姛锛沠alse=璁剧疆澶辫触
+     */
+    public boolean expire(final String key, final long timeout, final TimeUnit unit) {
+        return redisTemplate.expire(key, timeout, unit);
+    }
+
+    /**
+     * 鑾峰緱缂撳瓨鐨勫熀鏈璞°��
+     *
+     * @param key 缂撳瓨閿��
+     * @return 缂撳瓨閿�煎搴旂殑鏁版嵁
+     */
+    public <T> T getCacheObject(final String key) {
+        ValueOperations<String, T> operation = redisTemplate.opsForValue();
+        return operation.get(key);
+    }
+
+    /**
+     * 鍒犻櫎鍗曚釜瀵硅薄
+     *
+     * @param key
+     */
+    public boolean deleteObject(final String key) {
+        return redisTemplate.delete(key);
+    }
+
+    /**
+     * 鍒犻櫎闆嗗悎瀵硅薄
+     *
+     * @param collection 澶氫釜瀵硅薄
+     * @return
+     */
+    public long deleteObject(final Collection collection) {
+        return redisTemplate.delete(collection);
+    }
+
+    /**
+     * 缂撳瓨List鏁版嵁
+     *
+     * @param key      缂撳瓨鐨勯敭鍊�
+     * @param dataList 寰呯紦瀛樼殑List鏁版嵁
+     * @return 缂撳瓨鐨勫璞�
+     */
+    public <T> long setCacheList(final String key, final List<T> dataList) {
+        Long count = redisTemplate.opsForList().rightPushAll(key, dataList);
+        return count == null ? 0 : count;
+    }
+
+    /**
+     * 鑾峰緱缂撳瓨鐨刲ist瀵硅薄
+     *
+     * @param key 缂撳瓨鐨勯敭鍊�
+     * @return 缂撳瓨閿�煎搴旂殑鏁版嵁
+     */
+    public <T> List<T> getCacheList(final String key) {
+        return redisTemplate.opsForList().range(key, 0, -1);
+    }
+
+    /**
+     * 缂撳瓨Set
+     *
+     * @param key     缂撳瓨閿��
+     * @param dataSet 缂撳瓨鐨勬暟鎹�
+     * @return 缂撳瓨鏁版嵁鐨勫璞�
+     */
+    public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet) {
+        BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);
+        Iterator<T> it = dataSet.iterator();
+        while (it.hasNext()) {
+            setOperation.add(it.next());
+        }
+        return setOperation;
+    }
+
+    /**
+     * 鑾峰緱缂撳瓨鐨剆et
+     *
+     * @param key
+     * @return
+     */
+    public <T> Set<T> getCacheSet(final String key) {
+        return redisTemplate.opsForSet().members(key);
+    }
+
+    /**
+     * 缂撳瓨Map
+     *
+     * @param key
+     * @param dataMap
+     */
+    public <T> void setCacheMap(final String key, final Map<String, T> dataMap) {
+        if (dataMap != null) {
+            redisTemplate.opsForHash().putAll(key, dataMap);
+        }
+    }
+
+    /**
+     * 鑾峰緱缂撳瓨鐨凪ap
+     *
+     * @param key
+     * @return
+     */
+    public <T> Map<String, T> getCacheMap(final String key) {
+        return redisTemplate.opsForHash().entries(key);
+    }
+
+    /**
+     * 寰�Hash涓瓨鍏ユ暟鎹�
+     *
+     * @param key   Redis閿�
+     * @param hKey  Hash閿�
+     * @param value 鍊�
+     */
+    public <T> void setCacheMapValue(final String key, final String hKey, final T value) {
+        redisTemplate.opsForHash().put(key, hKey, value);
+    }
+
+    /**
+     * 鑾峰彇Hash涓殑鏁版嵁
+     *
+     * @param key  Redis閿�
+     * @param hKey Hash閿�
+     * @return Hash涓殑瀵硅薄
+     */
+    public <T> T getCacheMapValue(final String key, final String hKey) {
+        HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash();
+        return opsForHash.get(key, hKey);
+    }
+
+    /**
+     * 鍒犻櫎Hash涓殑鏁版嵁
+     *
+     * @param key
+     * @param hkey
+     */
+    public void delCacheMapValue(final String key, final String hkey) {
+        HashOperations hashOperations = redisTemplate.opsForHash();
+        hashOperations.delete(key, hkey);
+    }
+
+    /**
+     * 鑾峰彇澶氫釜Hash涓殑鏁版嵁
+     *
+     * @param key   Redis閿�
+     * @param hKeys Hash閿泦鍚�
+     * @return Hash瀵硅薄闆嗗悎
+     */
+    public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys) {
+        return redisTemplate.opsForHash().multiGet(key, hKeys);
+    }
+
+    /**
+     * 鑾峰緱缂撳瓨鐨勫熀鏈璞″垪琛�
+     *
+     * @param pattern 瀛楃涓插墠缂�
+     * @return 瀵硅薄鍒楄〃
+     */
+    public Collection<String> keys(final String pattern) {
+        return redisTemplate.keys(pattern);
+    }
+
+    /**
+     * 鍒ゆ柇key鏄惁瀛樺湪
+     *
+     * @param key 閿�
+     * @return true 瀛樺湪 false涓嶅瓨鍦�
+     */
+    public boolean hasKey(String key) {
+        try {
+            return redisTemplate.hasKey(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+}
\ No newline at end of file
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/UserInfoUtils.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/UserInfoUtils.java
new file mode 100644
index 0000000..292797c
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/UserInfoUtils.java
@@ -0,0 +1,26 @@
+package com.mes.common.utils;
+
+import com.mes.userinfo.entity.SysUser;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/4/25 15:41
+ * @Description:
+ */
+public class UserInfoUtils {
+    private static InheritableThreadLocal<SysUser> tokenPool = new InheritableThreadLocal<SysUser>();
+
+    public static SysUser get() {
+        return tokenPool.get();
+    }
+
+    public static void set(SysUser user) {
+        tokenPool.set(user);
+    }
+
+    public static void remove() {
+        if (get() != null) {
+            tokenPool.remove();
+        }
+    }
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/WebUtils.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/WebUtils.java
new file mode 100644
index 0000000..618144d
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/common/utils/WebUtils.java
@@ -0,0 +1,30 @@
+package com.mes.common.utils;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/4/9 19:16
+ * @Description:
+ */
+public class WebUtils {
+    /**
+     * 灏嗗瓧绗︿覆娓叉煋鍒板鎴风
+     *
+     * @param response 娓叉煋瀵硅薄
+     * @param string   寰呮覆鏌撶殑瀛楃涓�
+     * @return null
+     */
+    public static String renderString(HttpServletResponse response, String string) {
+        try {
+            response.setStatus(200);
+            response.setContentType("application/json");
+            response.setCharacterEncoding("utf-8");
+            response.getWriter().print(string);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/controller/SysMenuController.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/controller/SysMenuController.java
new file mode 100644
index 0000000..b507a45
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/controller/SysMenuController.java
@@ -0,0 +1,83 @@
+package com.mes.menu.controller;
+
+import com.mes.entity.request.GeneralRequest;
+import com.mes.menu.entity.SysMenu;
+import com.mes.menu.service.SysMenuService;
+import com.mes.utils.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zhoush
+ * @since 2024-04-11
+ */
+@Api(description = "鑿滃崟绠$悊")
+@RestController
+@RequestMapping("/sys/menu")
+public class SysMenuController {
+
+    @Autowired
+    private SysMenuService sysMenuService;
+
+    @ApiOperation("鏂板鑿滃崟")
+    @PostMapping("/save")
+//    @PreAuthorize("hasAuthority('sys:menu:save')")
+    public Result save(@Validated @RequestBody SysMenu sysMenu) {
+        sysMenuService.save(sysMenu);
+        GeneralRequest request=new GeneralRequest();
+        return Result.success(sysMenuService.getMenuTree(request));
+
+    }
+
+    @ApiOperation("淇敼鑿滃崟淇℃伅")
+    @PostMapping("/updateMenu")
+//    @PreAuthorize("hasAuthority('sys:menu:update')")
+    public Result<List<SysMenu>> updateMenu(@Validated @RequestBody SysMenu sysMenu) {
+        //return Result.success(sysMenu);
+        sysMenuService.updateMenu(sysMenu);
+        GeneralRequest request=new GeneralRequest();
+        return Result.build(200,"淇敼鎴愬姛",sysMenuService.getMenuTree(request));
+    }
+
+    @ApiOperation("鑾峰彇鐢ㄦ埛鏈夋潈闄愮殑鎵�鏈夎彍鍗�")
+    @GetMapping("/getMenuTree")
+    public Result<List<SysMenu>> getMenuTree(GeneralRequest request) {
+        return Result.success(sysMenuService.getMenuTree(request));
+    }
+
+    @ApiOperation("鑾峰彇鐢ㄦ埛鐨勬潈闄�")
+    @GetMapping("/getAuthorityInfo")
+    public Result<List<String>> getAuthorityInfo() {
+        return Result.success(sysMenuService.getAuthorityInfo());
+    }
+
+
+    @ApiOperation("鐢ㄦ埛褰撳墠鐢ㄦ埛鐨勮彍鍗曞拰鏉冮檺淇℃伅")
+    @GetMapping("/nav")
+    public Result<Map<Object, Object>> nav() {
+        return Result.success(sysMenuService.nav());
+    }
+
+    @ApiOperation("鍒犻櫎鑿滃崟")
+    @PostMapping("/deleteMenu")
+//    @PreAuthorize("hasAuthority('sys:menu:delete')")
+    public Result<List<SysMenu>> deleteMenu(Long menuId) {
+        GeneralRequest request=new GeneralRequest();
+        return Result.build(200, sysMenuService.deleteMenu(menuId),sysMenuService.getMenuTree(request));
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎鑿滃崟")
+    @PostMapping("/batchDeleteMenu")
+//    @PreAuthorize("hasAuthority('sys:menu:delete')")
+    public Result<String> batchDeleteMenu(@RequestBody List<Long> menuIds) {
+        return Result.success(sysMenuService.batchDeleteMenu(menuIds));
+    }
+
+}
+
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/entity/SysMenu.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/entity/SysMenu.java
new file mode 100644
index 0000000..37476c6
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/entity/SysMenu.java
@@ -0,0 +1,87 @@
+package com.mes.menu.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class SysMenu implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鑷id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鐖秈d
+     */
+    private Long parentId;
+
+    /**
+     * 妯″潡鍚嶇О
+     */
+    private String menuName;
+
+    /**
+     * 鍥炬爣
+     */
+    private String icon;
+
+    /**
+     * 鍦板潃
+     */
+    private String url;
+
+    /**
+     * 璇█绫诲瀷
+     */
+    private String languageType;
+
+    /**
+     * 鐘舵��
+     */
+    private Integer status;
+
+    /**
+     * 鎺掑簭
+     */
+    private String listSort;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * 鏉冮檺
+     */
+    private String perms;
+
+    /**
+     * 瀛愯彍鍗�
+     */
+    @TableField(exist = false)
+    private List<SysMenu> children;
+
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/mapper/SysMenuMapper.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/mapper/SysMenuMapper.java
new file mode 100644
index 0000000..ae06d40
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/mapper/SysMenuMapper.java
@@ -0,0 +1,20 @@
+package com.mes.menu.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.mes.menu.entity.SysMenu;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鑿滃崟琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+
+public interface SysMenuMapper extends MPJBaseMapper<SysMenu> {
+
+    List<String> selectPermsByUserId(long parseLong);
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/service/SysMenuService.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/service/SysMenuService.java
new file mode 100644
index 0000000..014d1cd
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/service/SysMenuService.java
@@ -0,0 +1,66 @@
+package com.mes.menu.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mes.entity.request.GeneralRequest;
+import com.mes.menu.entity.SysMenu;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鑿滃崟琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+public interface SysMenuService extends IService<SysMenu> {
+
+    /**
+     * 鏇存柊鑿滃崟淇℃伅
+     *
+     * @param menu
+     * @return
+     */
+    SysMenu updateMenu(SysMenu menu);
+
+    /**
+     * 鑾峰彇鐢ㄦ埛鏈夋潈闄愮殑鑿滃崟鏍�
+     *
+     * @return
+     */
+    List<SysMenu> getMenuTree(GeneralRequest request);
+
+    /**
+     * 鑾峰彇鐢ㄦ埛鐨勬潈闄�
+     *
+     * @return
+     */
+    List<String> getAuthorityInfo();
+
+
+    /**
+     * 鑾峰彇鐢ㄦ埛鑿滃崟鍙婃潈闄愪俊鎭�
+     *
+     * @return
+     */
+    Map<Object, Object> nav();
+
+    /**
+     * 鍒犻櫎鑿滃崟淇℃伅
+     *
+     * @param menuId
+     * @return
+     */
+    String deleteMenu(Long menuId);
+
+    /**
+     * 鎵归噺鍒犻櫎鑿滃崟淇℃伅
+     *
+     * @param menuIds
+     * @return
+     */
+    String batchDeleteMenu(List<Long> menuIds);
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/service/impl/SysMenuServiceImpl.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/service/impl/SysMenuServiceImpl.java
new file mode 100644
index 0000000..597f93c
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/menu/service/impl/SysMenuServiceImpl.java
@@ -0,0 +1,148 @@
+package com.mes.menu.service.impl;
+
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.mes.common.utils.UserInfoUtils;
+import com.mes.entity.request.GeneralRequest;
+import com.mes.menu.entity.SysMenu;
+import com.mes.menu.mapper.SysMenuMapper;
+import com.mes.menu.service.SysMenuService;
+import com.mes.role.entity.SysRoleMenu;
+import com.mes.role.service.SysRoleMenuService;
+import com.mes.userinfo.entity.SysUser;
+import com.mes.userinfo.entity.SysUserRole;
+import com.mes.userinfo.mapper.SysUserRoleMapper;
+import com.mes.userinfo.service.SysUserService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 鑿滃崟琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+@Service
+@Slf4j
+public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {
+
+    @Autowired
+    SysUserService sysUserService;
+
+    @Autowired
+    SysUserRoleMapper sysUserRoleMapper;
+
+    @Autowired
+    SysRoleMenuService sysRoleMenuService;
+
+    @Override
+    public SysMenu updateMenu(SysMenu menu) {
+        baseMapper.updateById(menu);
+        // 娓呴櫎鎵�鏈変笌璇ヨ彍鍗曠浉鍏崇殑鏉冮檺缂撳瓨
+        sysUserService.clearUserAuthorityInfoByMenuId(menu.getId());
+        return menu;
+    }
+
+    @Override
+    public List<SysMenu> getMenuTree(GeneralRequest request) {
+        //todo:闇�瑕佸厛鑾峰彇鐢ㄦ埛鐨勮鑹诧紝瑙掕壊涓嬬殑鑿滃崟鏉冮檺锛屾嬁鍒拌彍鍗昳d鑾峰彇鎵�鏈夎彍鍗�
+        SysUser user = UserInfoUtils.get();
+        MPJLambdaWrapper<SysUserRole> wrapper = new MPJLambdaWrapper<>();
+
+        wrapper.selectAll(SysMenu.class).distinct()
+                .innerJoin(SysUser.class, SysUser::getId, SysUserRole::getUserId)
+                .innerJoin(SysRoleMenu.class, SysRoleMenu::getRoleId, SysUserRole::getRoleId)
+                .innerJoin(SysMenu.class, SysMenu::getId, SysRoleMenu::getMenuId)
+                .eq(SysUser::getId, user.getId())
+                .like(StringUtils.isNotBlank(request.getKey()), SysMenu::getMenuName, request.getKey());
+
+        //
+        List<SysMenu> menuList = sysUserRoleMapper.selectJoinList(SysMenu.class, wrapper);
+        log.info("userinfos:{}",menuList);
+        return create(menuList);
+    }
+
+    @Override
+    public List<String> getAuthorityInfo() {
+        SysUser user = UserInfoUtils.get();
+        log.info("鑾峰彇鐢ㄦ埛淇℃伅锛岀敤鎴峰悕涓簕}", user);
+        // 鑾峰彇鏉冮檺淇℃伅
+        // ROLE_admin,ROLE_normal,sys:user:list,....
+        return sysUserService.getUserAuthorityInfo(user.getId());
+    }
+
+    @Override
+    public Map<Object, Object> nav() {
+        List<SysMenu> menuTree = getMenuTree(new GeneralRequest());
+        List<String> authorityInfo = getAuthorityInfo();
+        return MapUtil.builder().put("authoritys", authorityInfo)
+                .put("tree", menuTree).map();
+    }
+
+    @Override
+    public String deleteMenu(Long menuId) {
+        int count = this.count(new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getParentId, menuId));
+        if (count > 0) {
+            return "鏃犳硶鍒犻櫎,璇峰厛鍒犻櫎瀛愯彍鍗�";
+        }
+
+        // 娓呴櫎鎵�鏈変笌璇ヨ彍鍗曠浉鍏崇殑鏉冮檺缂撳瓨
+        sysUserService.clearUserAuthorityInfoByMenuId(menuId);
+
+        this.removeById(menuId);
+
+        // 鍚屾鍒犻櫎涓棿鍏宠仈琛�
+        sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getMenuId, menuId));
+        return "鍒犻櫎鎴愬姛";
+    }
+
+    @Override
+    public String batchDeleteMenu(List<Long> menuIds) {
+        menuIds.stream().forEach(e -> deleteMenu(e));
+        return "鎵归噺鍒犻櫎鎴愬姛";
+    }
+
+
+    /**
+     * 灏嗘暟鎹簱涓煡璇㈠嚭鏉ョ殑list闆嗗悎浼犲叆姝ゆ柟娉曞嵆鍙幏寰楁帓鎴愭爲褰㈢粨鏋勭殑list闆嗗悎
+     *
+     * @param lists
+     * @return
+     */
+    public List<SysMenu> create(List<SysMenu> lists) {
+        List<SysMenu> deptTreeList = lists.stream()
+                .filter(item -> item.getParentId() == 0)
+                .map(item -> {
+                    item.setChildren(getChildren(item, lists));
+                    return item;
+                }).collect(Collectors.toList());
+        return deptTreeList;
+    }
+
+    /**
+     * 姝ゆ柟娉曞皢琚�掑綊璋冪敤
+     *
+     * @param menu
+     * @param menus
+     * @return
+     */
+    private List<SysMenu> getChildren(SysMenu menu, List<SysMenu> menus) {
+        List<SysMenu> res = menus.stream()
+                .filter(item -> item.getParentId().equals(menu.getId()))
+                .collect(Collectors.toList());
+        log.info("鑿滃崟鏍�:{}", JSONUtil.toJsonStr(res));
+        return res;
+    }
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/controller/SysRoleController.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/controller/SysRoleController.java
new file mode 100644
index 0000000..f752b45
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/controller/SysRoleController.java
@@ -0,0 +1,67 @@
+package com.mes.role.controller;
+
+
+import com.mes.entity.request.GeneralRequest;
+import com.mes.role.entity.SysRole;
+import com.mes.role.entity.vo.SysRoleVO;
+import com.mes.role.service.SysRoleService;
+import com.mes.utils.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author zhoush
+ * @since 2024-04-11
+ */
+@Api(description = "瑙掕壊绠$悊")
+@RestController
+@RequestMapping("/sys/role")
+public class SysRoleController {
+
+    @Autowired
+    private SysRoleService sysRoleService;
+
+    @ApiOperation("鏂板瑙掕壊鍙婅鑹蹭笅鐨勬潈闄愪俊鎭�")
+    @PostMapping("/saveRole")
+//    @PreAuthorize("hasAuthority('sys:role:save')")
+    public Result<SysRoleVO> saveRole(@Validated @RequestBody SysRoleVO sysRoleVO) {
+        //return Result.success(sysRoleService.saveRole(sysRoleVO));
+        sysRoleService.saveRole(sysRoleVO);
+        return Result.build(200,"鏂板鎴愬姛",sysRoleVO);
+    }
+
+    @ApiOperation("缂栬緫瑙掕壊鍙婅鑹蹭笅鐨勬潈闄愪俊鎭�")
+    @PostMapping("/updateRole")
+//    @PreAuthorize("hasAuthority('sys:role:save')")
+    public Result<SysRoleVO> updateRole(@Validated @RequestBody SysRoleVO sysRoleVO) {
+       // return Result.success(sysRoleService.updateRole(sysRoleVO));
+        sysRoleService.updateRole(sysRoleVO);
+        return Result.build(200,"鏂板鎴愬姛",sysRoleVO);
+    }
+
+    @ApiOperation("鏌ヨ瑙掕壊鍙婅鑹蹭笅鐨勬潈闄愪俊鎭�")
+    @PostMapping("/queryRole")
+//    @PreAuthorize("hasAuthority('sys:role:save')")
+    public Result<List<SysRoleVO>> queryRole(@Validated @RequestBody GeneralRequest request) {
+        return Result.success(sysRoleService.queryRole(request));
+    }
+
+
+    @ApiOperation("鍒犻櫎瑙掕壊鍙婅鑹蹭笅鐨勬潈闄愪俊鎭�")
+    @PostMapping("/delete")
+//    @PreAuthorize("hasAuthority('sys:role:delete')")
+    @Transactional
+    public Result<String> deleteRole(@RequestBody List<Long> ids) {
+        return Result.build(200,"鍒犻櫎鎴愬姛",sysRoleService.deleteRole(ids));
+    }
+
+}
\ No newline at end of file
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRole.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRole.java
new file mode 100644
index 0000000..14fd4a3
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRole.java
@@ -0,0 +1,50 @@
+package com.mes.role.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 瑙掕壊琛�
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class SysRole implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private String name;
+
+    /**
+     * 瑙掕壊鏉冮檺瀛楃涓�
+     */
+    private String roleKey;
+
+    /**
+     * 瑙掕壊鐘舵�侊紙0姝e父 1鍋滅敤锛�
+     */
+    private String status;
+
+    /**
+     * 鍒犻櫎鏍囧織
+     */
+    private Integer delFlag;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRoleMenu.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRoleMenu.java
new file mode 100644
index 0000000..aae2aed
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRoleMenu.java
@@ -0,0 +1,36 @@
+package com.mes.role.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class SysRoleMenu implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 瑙掕壊ID
+     */
+    @TableId(type = IdType.NONE)
+    private Long roleId;
+
+    /**
+     * 鑿滃崟id
+     */
+    private Long menuId;
+
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/entity/vo/SysRoleVO.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/entity/vo/SysRoleVO.java
new file mode 100644
index 0000000..45efd61
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/entity/vo/SysRoleVO.java
@@ -0,0 +1,44 @@
+package com.mes.role.entity.vo;
+
+import com.mes.menu.entity.SysMenu;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/4/26 13:57
+ * @Description:
+ */
+@Api(description = "瑙掕壊淇℃伅")
+@Data
+public class SysRoleVO implements Serializable {
+
+    @ApiModelProperty(hidden = true)
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "瑙掕壊ID", position = 2)
+    private Long id;
+
+    @ApiModelProperty(value = "瑙掕壊鍚嶇О", position = 3)
+    private String name;
+
+    @ApiModelProperty(value = "瑙掕壊鏉冮檺瀛楃涓�", position = 4)
+    private String roleKey;
+
+    @ApiModelProperty(value = "瑙掕壊鐘舵�侊紙0姝e父 1鍋滅敤锛�", position = 5)
+    private String status;
+
+    @ApiModelProperty(value = "鍒犻櫎鏍囧織", position = 6)
+    private Integer delFlag;
+
+    @ApiModelProperty(value = "澶囨敞", position = 7)
+    private String remark;
+
+    @ApiModelProperty(value = "瑙掕壊鑿滃崟淇℃伅", position = 8)
+    private List<SysMenu> menuList;
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMapper.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMapper.java
new file mode 100644
index 0000000..bf1bf6d
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMapper.java
@@ -0,0 +1,16 @@
+package com.mes.role.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.mes.role.entity.SysRole;
+
+/**
+ * <p>
+ * 瑙掕壊琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+public interface SysRoleMapper extends MPJBaseMapper<SysRole> {
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMenuMapper.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMenuMapper.java
new file mode 100644
index 0000000..0cfc7df
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMenuMapper.java
@@ -0,0 +1,17 @@
+package com.mes.role.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mes.role.entity.SysRoleMenu;
+
+/**
+ * <p>
+ * Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+
+public interface SysRoleMenuMapper extends BaseMapper<SysRoleMenu> {
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMapper.xml b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMapper.xml
new file mode 100644
index 0000000..9a0cd27
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.mes.role.mapper.SysRoleMapper">
+
+</mapper>
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMenuMapper.xml b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMenuMapper.xml
new file mode 100644
index 0000000..af0749b
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMenuMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.mes.role.mapper.SysRoleMenuMapper">
+
+</mapper>
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleMenuService.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleMenuService.java
new file mode 100644
index 0000000..e4d23dc
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleMenuService.java
@@ -0,0 +1,16 @@
+package com.mes.role.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mes.role.entity.SysRoleMenu;
+
+/**
+ * <p>
+ * 鏈嶅姟绫�
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+public interface SysRoleMenuService extends IService<SysRoleMenu> {
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleService.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleService.java
new file mode 100644
index 0000000..9592106
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleService.java
@@ -0,0 +1,51 @@
+package com.mes.role.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mes.entity.request.GeneralRequest;
+import com.mes.role.entity.SysRole;
+import com.mes.role.entity.vo.SysRoleVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 瑙掕壊琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+public interface SysRoleService extends IService<SysRole> {
+
+    /**
+     * 鍒涘缓瑙掕壊淇℃伅
+     *
+     * @param sysRoleVO
+     * @return
+     */
+    SysRole saveRole(SysRoleVO sysRoleVO);
+
+    /**
+     * 淇敼瑙掕壊淇℃伅鍙婃潈闄�
+     *
+     * @param sysRoleVO
+     * @return
+     */
+    String updateRole(SysRoleVO sysRoleVO);
+
+    /**
+     * 鎸夌収瑙掕壊鍚嶆煡璇㈣鑹蹭俊鎭�
+     *
+     * @param request
+     * @return
+     */
+    List<SysRoleVO> queryRole(GeneralRequest request);
+
+    /**
+     * 鏌ヨ瑙掕壊鍙婅鑹蹭笅鐨勬潈闄愪俊鎭�
+     *
+     * @param ids
+     * @return
+     */
+    String deleteRole(List<Long> ids);
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleMenuServiceImpl.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleMenuServiceImpl.java
new file mode 100644
index 0000000..4c8a475
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleMenuServiceImpl.java
@@ -0,0 +1,20 @@
+package com.mes.role.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mes.role.entity.SysRoleMenu;
+import com.mes.role.mapper.SysRoleMenuMapper;
+import com.mes.role.service.SysRoleMenuService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+@Service
+public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuMapper, SysRoleMenu> implements SysRoleMenuService {
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleServiceImpl.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleServiceImpl.java
new file mode 100644
index 0000000..a787182
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleServiceImpl.java
@@ -0,0 +1,139 @@
+package com.mes.role.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.mes.entity.request.GeneralRequest;
+import com.mes.menu.entity.SysMenu;
+import com.mes.role.entity.SysRole;
+import com.mes.role.entity.SysRoleMenu;
+import com.mes.role.entity.vo.SysRoleVO;
+import com.mes.role.mapper.SysRoleMapper;
+import com.mes.role.service.SysRoleMenuService;
+import com.mes.role.service.SysRoleService;
+import com.mes.userinfo.entity.SysUserRole;
+import com.mes.userinfo.service.SysUserRoleService;
+import com.mes.userinfo.service.SysUserService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 瑙掕壊琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+@Service
+@Slf4j
+public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements SysRoleService {
+
+    @Autowired
+    SysRoleMenuService sysRoleMenuService;
+
+    @Autowired
+    SysUserService sysUserService;
+
+    @Autowired
+    SysUserRoleService sysUserRoleService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public SysRole saveRole(SysRoleVO sysRoleVO) {
+        log.info("淇濆瓨瑙掕壊淇℃伅锛岀敓鎴愬搴旂殑瑙掕壊id");
+        SysRole sysRole = new SysRole();
+        BeanUtils.copyProperties(sysRoleVO, sysRole);
+        this.save(sysRole);
+        //淇濆瓨瑙掕壊鏉冮檺淇℃伅
+        saveRoleMenu(sysRole.getId(), sysRoleVO.getMenuList());
+        return sysRole;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String updateRole(SysRoleVO sysRoleVO) {
+        log.info("淇濆瓨瑙掕壊淇℃伅锛岀敓鎴愬搴旂殑瑙掕壊id");
+        SysRole sysRole = new SysRole();
+        BeanUtils.copyProperties(sysRoleVO, sysRole);
+        this.updateById(sysRole);
+        //淇濆瓨瑙掕壊鏉冮檺淇℃伅
+        return saveRoleMenu(sysRole.getId(), sysRoleVO.getMenuList());
+    }
+
+    @Override
+    public List<SysRoleVO> queryRole(GeneralRequest request) {
+        MPJLambdaWrapper<SysRole> wrapper = new MPJLambdaWrapper<>();
+        wrapper.selectAll(SysRole.class)
+                .selectCollection(SysMenu.class, SysRoleVO::getMenuList)
+                .leftJoin(SysRoleMenu.class, SysRoleMenu::getRoleId, SysRole::getId)
+                .leftJoin(SysMenu.class, SysMenu::getId, SysRoleMenu::getMenuId)
+                .like(StringUtils.hasText(request.getKey()), SysRole::getName, request.getKey());
+        return baseMapper.selectJoinList(SysRoleVO.class, wrapper);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String deleteRole(List<Long> ids) {
+        log.info("鍒犻櫎瑙掕壊淇℃伅");
+        this.removeByIds(ids);
+
+        log.info("鍒犻櫎涓棿琛ㄤ俊鎭�");
+        sysUserRoleService.remove(new LambdaQueryWrapper<SysUserRole>().in(SysUserRole::getRoleId, ids));
+        sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>().in(SysRoleMenu::getRoleId, ids));
+
+        log.info("娓呯┖缂撳瓨涓殑鏉冮檺淇℃伅");
+        ids.stream().forEach(id -> sysUserService.clearUserAuthorityInfoByRoleId(id));
+        return "success";
+    }
+
+    /**
+     * 淇濆瓨瑙掕壊鏉冮檺淇℃伅
+     *
+     * @param roleId
+     * @param menuList
+     * @return
+     */
+    private String saveRoleMenu(Long roleId, List<SysMenu> menuList) {
+        log.info("閰嶇疆瑙掕壊鑿滃崟鍏崇郴");
+        if (CollectionUtils.isEmpty(menuList)) {
+            // 鍏堝垹闄ゅ師鏉ョ殑璁板綍锛屽啀淇濆瓨鏂扮殑
+            sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, roleId));
+            // 鍒犻櫎缂撳瓨
+            sysUserService.clearUserAuthorityInfoByRoleId(roleId);
+            return "success";
+        }
+        List<SysRoleMenu> roleMenuList = menuList.stream().map(menu -> {
+            SysRoleMenu roleMenu = new SysRoleMenu();
+            roleMenu.setRoleId(roleId);
+            roleMenu.setMenuId(menu.getId());
+            return roleMenu;
+        }).collect(Collectors.toList());
+        // 浣跨敤娴佸鐞嗚彍鍗曞垪琛紝鎻愬彇 children 鐨� id锛屽苟璁剧疆鍒� SysRoleMenu 涓�
+        List<SysRoleMenu> childrenList = menuList.stream()
+                .flatMap(menu -> menu.getChildren().stream()) // 鎵佸钩鍖栧鐞� children 鍒楄〃
+                .map(child -> {
+                    SysRoleMenu roleMenu = new SysRoleMenu();
+                    roleMenu.setRoleId(roleId);
+                    roleMenu.setMenuId(child.getId()); // 璁剧疆 child 鐨� id 鍒� menuId
+                    return roleMenu;
+                })
+                .collect(Collectors.toList());
+        log.info("娓呯┖瑙掕壊鏉冮檺琛ㄤ腑璇ヨ鑹蹭俊鎭�");
+        // 鍏堝垹闄ゅ師鏉ョ殑璁板綍锛屽啀淇濆瓨鏂扮殑
+        sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, roleId));
+        sysRoleMenuService.saveBatch(roleMenuList);
+        sysRoleMenuService.saveBatch(childrenList);
+        // 鍒犻櫎缂撳瓨
+        sysUserService.clearUserAuthorityInfoByRoleId(roleId);
+        return "success";
+    }
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/controller/SysUserController.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/controller/SysUserController.java
new file mode 100644
index 0000000..e897e65
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/controller/SysUserController.java
@@ -0,0 +1,93 @@
+package com.mes.userinfo.controller;
+
+
+import com.mes.entity.request.GeneralRequest;
+import com.mes.userinfo.entity.SysUser;
+import com.mes.userinfo.entity.vo.SysUserVO;
+import com.mes.userinfo.service.SysUserService;
+import com.mes.utils.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鐢ㄦ埛琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+@Api(description = "鐢ㄦ埛绠$悊")
+@RestController
+@RequestMapping("/sys/user")
+public class SysUserController {
+
+    @Autowired
+    private SysUserService sysUserService;
+
+    @ApiOperation("鐢ㄦ埛鐧诲綍")
+    @PostMapping("/login")
+    public Result<Map<String, String>> login(@RequestBody SysUser user) {
+        return Result.success(sysUserService.login(user));
+    }
+
+    @ApiOperation("閫�鍑虹櫥褰�")
+    @PostMapping("/logout")
+    @PreAuthorize("hasAuthority('xt:yh')")
+    public Result<String> logout() {
+        return Result.success(sysUserService.logout());
+    }
+
+    @ApiOperation("鏂板鐢ㄦ埛淇℃伅")
+    @PostMapping("/saveUser")
+//    @PreAuthorize("hasAuthority('sys:user:save')")
+    public Result<String> saveUser(@Validated @RequestBody SysUserVO sysUser) {
+        return Result.success(sysUserService.saveUser(sysUser));
+    }
+
+
+    @ApiOperation("鏇存柊鐢ㄦ埛淇℃伅")
+    @PostMapping("/updateUser")
+//    @PreAuthorize("hasAuthority('sys:user:update')")
+    public Result<List<SysUserVO>> updateUser(@Validated @RequestBody SysUserVO sysUser) {
+        sysUserService.updateUser(sysUser);
+        GeneralRequest request=new GeneralRequest();
+        //request.setKey("");
+        return Result.success(sysUserService.listByUserName(request));
+        //鏇存敼浜嗕慨鏀逛箣鍚庤繑鍥炴墍鏈夌敤鎴峰垪琛�
+    }
+
+    @ApiOperation("閲嶇疆瀵嗙爜")
+    @PostMapping("/resetPassword")
+//    @PreAuthorize("hasAuthority('sys:user:resetPassword')")
+    public Result resetPassword(String userId) {
+        return Result.success(sysUserService.resetPassword(Long.parseLong(userId)));
+    }
+
+
+    @ApiOperation("鑾峰彇鐢ㄦ埛鍒楄〃")
+    @PostMapping("/listByUserName")
+//    @PreAuthorize("hasAuthority('sys:user:list')")
+    public Result<List<SysUserVO>> listByUserName(@RequestBody GeneralRequest request) {
+        return Result.success(sysUserService.listByUserName(request));
+    }
+
+    @ApiOperation("鍒犻櫎鐢ㄦ埛淇℃伅")
+    @PostMapping("/deleteUser")
+//    @PreAuthorize("hasAuthority('sys:user:delete')")
+    public Result<String> deleteUser(@RequestBody List<Long> ids) {
+        return Result.success(sysUserService.deleteUser(ids));
+    }
+
+}
+
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/LoginUser.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/LoginUser.java
new file mode 100644
index 0000000..d60a05f
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/LoginUser.java
@@ -0,0 +1,94 @@
+package com.mes.userinfo.entity;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/4/11 15:46
+ * @Description:
+ */
+public class LoginUser implements UserDetails {
+
+
+    private SysUser user;
+
+    /**
+     * 瀛樺偍鏉冮檺淇℃伅
+     */
+    @JSONField(serialize = false)
+    private List<String> permissions;
+
+    /**
+     * 瀛樺偍SpringSecurity璋冪敤getAuthorities()鏂规硶鑾峰彇鐨勬潈闄愪俊鎭殑闆嗗悎
+     */
+    @JSONField(serialize = false)
+    private List<GrantedAuthority> authorities;
+
+
+    public LoginUser() {
+    }
+
+    public LoginUser(SysUser user, List<String> permissions) {
+        this.user = user;
+        this.permissions = permissions;
+    }
+
+    public SysUser getUser() {
+        return user;
+    }
+
+    public void setUser(SysUser user) {
+        this.user = user;
+    }
+
+    @Override
+    public Collection<? extends GrantedAuthority> getAuthorities() {
+
+        // 浼樺寲涓哄彧闇�瑕佺涓�娆¤幏鍙栫殑鏃跺�欒繘琛岄亶鍘嗭紝鍚庨潰鍐嶇敤灏变細浠巃uthorities杩欎釜鎴愬憳鍙橀噺涓幏鍙栦簡锛屼笉浼氬啀杩涜Stream寰幆閬嶅巻浜�
+        if (authorities != null) {
+            return authorities;
+        }
+        //鎶妏ermissions涓瓧绗︿覆绫诲瀷鐨勬潈闄愪俊鎭浆鎹㈡垚GrantedAuthority瀵硅薄瀛樺叆authorities涓�
+        authorities = permissions.stream().
+                map(SimpleGrantedAuthority::new)
+                .collect(Collectors.toList());
+        return authorities;
+    }
+
+    @Override
+    public String getPassword() {
+        return user.getPassword();
+    }
+
+    @Override
+    public String getUsername() {
+        return user.getUserName();
+    }
+
+    @Override
+    public boolean isAccountNonExpired() {
+        return true;
+    }
+
+    @Override
+    public boolean isAccountNonLocked() {
+        return true;
+    }
+
+    @Override
+    public boolean isCredentialsNonExpired() {
+        return true;
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return true;
+    }
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/SysUser.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/SysUser.java
new file mode 100644
index 0000000..ca1c861
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/SysUser.java
@@ -0,0 +1,67 @@
+package com.mes.userinfo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 鐢ㄦ埛琛�
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class SysUser implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鐢ㄦ埛鍚�
+     */
+    private String userName;
+
+    /**
+     * 鏄电О
+     */
+    private String nickName;
+
+    /**
+     * 瀵嗙爜
+     */
+    private String password;
+
+    /**
+     * 璐﹀彿鐘舵�侊紙0姝e父 1鍋滅敤锛�
+     */
+    private String status;
+
+    /**
+     * 澶村儚
+     */
+    private String avatar;
+
+    /**
+     * 鐢ㄦ埛绫诲瀷锛�0绠$悊鍛橈紝1鏅�氱敤鎴凤級
+     */
+    private String userType;
+
+    /**
+     * 鍒犻櫎鏍囧織
+     */
+    private Integer delFlag;
+
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/SysUserRole.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/SysUserRole.java
new file mode 100644
index 0000000..9aa76b4
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/SysUserRole.java
@@ -0,0 +1,38 @@
+package com.mes.userinfo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+public class SysUserRole implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鐢ㄦ埛id
+     */
+    @TableId(type = IdType.NONE)
+    private Long userId;
+
+    /**
+     * 瑙掕壊id
+     */
+    private Long roleId;
+
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/vo/SysUserVO.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/vo/SysUserVO.java
new file mode 100644
index 0000000..f43f8c7
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/vo/SysUserVO.java
@@ -0,0 +1,63 @@
+package com.mes.userinfo.entity.vo;
+
+import com.mes.role.entity.SysRole;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * <p>
+ * 鐢ㄦ埛琛�
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+@Api(description = "鐢ㄦ埛淇℃伅")
+@Data
+public class SysUserVO implements Serializable {
+
+    @ApiModelProperty(hidden = true)
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @ApiModelProperty(value = "涓婚敭", position = 2)
+    private Long id;
+
+    /**
+     * 鐢ㄦ埛鍚�
+     */
+    @ApiModelProperty(value = "鐢ㄦ埛鍚�", position = 3)
+    private String userName;
+
+    /**
+     * 鏄电О
+     */
+    @ApiModelProperty(value = "鏄电О", position = 4)
+    private String nickName;
+
+    /**
+     * 瀵嗙爜
+     */
+    @ApiModelProperty(value = "瀵嗙爜", position = 5)
+    private String password;
+
+    /**
+     * 澶村儚
+     */
+    @ApiModelProperty(value = "澶村儚", position = 6)
+    private String avatar;
+
+    /**
+     * 鐢ㄦ埛鐨勮鑹蹭俊鎭�
+     */
+    @ApiModelProperty(value = "鐢ㄦ埛鐨勮鑹蹭俊鎭�", position = 7)
+    private List<SysRole> roleList;
+
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/SysUserMapper.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/SysUserMapper.java
new file mode 100644
index 0000000..b9c491c
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/SysUserMapper.java
@@ -0,0 +1,18 @@
+package com.mes.userinfo.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.mes.userinfo.entity.SysUser;
+
+/**
+ * <p>
+ * 鐢ㄦ埛琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+@DS("hangzhoumes")
+public interface SysUserMapper extends MPJBaseMapper<SysUser> {
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/SysUserRoleMapper.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/SysUserRoleMapper.java
new file mode 100644
index 0000000..697ca74
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/SysUserRoleMapper.java
@@ -0,0 +1,17 @@
+package com.mes.userinfo.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.mes.userinfo.entity.SysUserRole;
+
+/**
+ * <p>
+ * Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+
+public interface SysUserRoleMapper extends MPJBaseMapper<SysUserRole> {
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/xml/SysUserMapper.xml b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/xml/SysUserMapper.xml
new file mode 100644
index 0000000..300e913
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/xml/SysUserMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.mes.userinfo.mapper.SysUserMapper">
+
+</mapper>
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/xml/SysUserRoleMapper.xml b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/xml/SysUserRoleMapper.xml
new file mode 100644
index 0000000..0fd2be9
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/xml/SysUserRoleMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.mes.userinfo.mapper.SysUserRoleMapper">
+
+</mapper>
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/SysUserRoleService.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/SysUserRoleService.java
new file mode 100644
index 0000000..9351f47
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/SysUserRoleService.java
@@ -0,0 +1,17 @@
+package com.mes.userinfo.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.mes.userinfo.entity.SysUserRole;
+
+/**
+ * <p>
+ * 鏈嶅姟绫�
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+public interface SysUserRoleService extends MPJBaseService<SysUserRole> {
+
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/SysUserService.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/SysUserService.java
new file mode 100644
index 0000000..467a88a
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/SysUserService.java
@@ -0,0 +1,110 @@
+package com.mes.userinfo.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mes.entity.request.GeneralRequest;
+import com.mes.userinfo.entity.SysUser;
+import com.mes.userinfo.entity.vo.SysUserVO;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鐢ㄦ埛琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+public interface SysUserService extends IService<SysUser> {
+
+    /**
+     * 鐢ㄦ埛鐧诲綍
+     *
+     * @param user
+     * @return
+     */
+    Map<String, String> login(SysUser user);
+
+    /**
+     * 閫�鍑虹櫥褰�
+     *
+     * @return
+     */
+    String logout();
+
+    /**
+     * 鏂板鐢ㄦ埛淇℃伅
+     *
+     * @param user
+     * @return
+     */
+    String saveUser(SysUserVO user);
+
+    /**
+     * 鏇存柊鐢ㄦ埛淇℃伅
+     *
+     * @param sysUser
+     * @return
+     */
+    SysUserVO updateUser(SysUserVO sysUser);
+
+    /**
+     * 閲嶇疆瀵嗙爜
+     *
+     * @param userId
+     * @return
+     */
+    String resetPassword(Long userId);
+
+    /**
+     * 鎸夊悕绉拌幏鍙栫敤鎴蜂俊鎭�
+     *
+     * @param userName
+     * @return
+     */
+    SysUser queryByUserName(String userName);
+
+    /**
+     * 鎸夊叧閿瓧鑾峰彇鐢ㄦ埛淇℃伅鍒楄〃
+     *
+     * @param request
+     * @return
+     */
+    List<SysUserVO> listByUserName(GeneralRequest request);
+
+    /**
+     * 鍒犻櫎鐢ㄦ埛淇℃伅
+     *
+     * @param ids
+     * @return
+     */
+    String deleteUser(List<Long> ids);
+
+    /**
+     * 鑾峰彇鐢ㄦ埛瑙掕壊鏉冮檺淇℃伅
+     *
+     * @param userId
+     * @return
+     */
+    List<String> getUserAuthorityInfo(Long userId);
+
+    /**
+     * 娓呯┖鐢ㄦ埛鏉冮檺淇℃伅閫氳繃鐢ㄦ埛淇℃伅
+     */
+    void clearUserAuthorityInfo(String userName);
+
+    /**
+     * 娓呯┖鐢ㄦ埛鏉冮檺淇℃伅閫氳繃瑙掕壊id
+     *
+     * @param roleId
+     */
+    void clearUserAuthorityInfoByRoleId(Long roleId);
+
+    /**
+     * 娓呯┖鐢ㄦ埛鏉冮檺淇℃伅閫氳繃鑿滃崟id
+     *
+     * @param menuId
+     */
+    void clearUserAuthorityInfoByMenuId(Long menuId);
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserRoleServiceImpl.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserRoleServiceImpl.java
new file mode 100644
index 0000000..baa93c2
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserRoleServiceImpl.java
@@ -0,0 +1,20 @@
+package com.mes.userinfo.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mes.userinfo.entity.SysUserRole;
+import com.mes.userinfo.mapper.SysUserRoleMapper;
+import com.mes.userinfo.service.SysUserRoleService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+@Service
+public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUserRole> implements SysUserRoleService {
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserServiceImpl.java b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserServiceImpl.java
new file mode 100644
index 0000000..1e4a478
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserServiceImpl.java
@@ -0,0 +1,271 @@
+package com.mes.userinfo.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.mes.common.config.Const;
+import com.mes.common.utils.JwtUtil;
+import com.mes.common.utils.RedisUtil;
+import com.mes.common.utils.UserInfoUtils;
+import com.mes.entity.request.GeneralRequest;
+import com.mes.menu.mapper.SysMenuMapper;
+import com.mes.role.entity.SysRole;
+import com.mes.role.entity.SysRoleMenu;
+import com.mes.role.service.SysRoleService;
+import com.mes.userinfo.entity.LoginUser;
+import com.mes.userinfo.entity.SysUser;
+import com.mes.userinfo.entity.SysUserRole;
+import com.mes.userinfo.entity.vo.SysUserVO;
+import com.mes.userinfo.mapper.SysUserMapper;
+import com.mes.userinfo.mapper.SysUserRoleMapper;
+import com.mes.userinfo.service.SysUserRoleService;
+import com.mes.userinfo.service.SysUserService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 鐢ㄦ埛琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-11
+ */
+@Service
+@Slf4j
+public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService, UserDetailsService {
+
+    @Autowired
+    private AuthenticationManager authenticationManager;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Resource
+    private SysMenuMapper sysMenuMapper;
+
+    @Resource
+    private SysUserRoleService sysUserRoleService;
+
+    @Resource
+    private SysRoleService sysRoleService;
+
+    @Resource
+    BCryptPasswordEncoder passwordEncoder;
+    @Autowired
+    private SysUserRoleMapper sysUserRoleMapper;
+
+    @Override
+    public Map<String, String> login(SysUser user) {
+        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUserName(), user.getPassword());
+        Authentication authenticate = authenticationManager.authenticate(authenticationToken);
+        if (Objects.isNull(authenticate)) {
+            throw new RuntimeException("鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒");
+        }
+        //浣跨敤userid鐢熸垚token
+        LoginUser loginUser = (LoginUser) authenticate.getPrincipal();
+        String userId = loginUser.getUser().getId().toString();
+        String jwt = JwtUtil.generateToken(userId);
+
+        //鏌ヨ鏉冮檺淇℃伅
+//        List<String> perms = sysMenuMapper.selectPermsByUserId(userId);
+        //authenticate瀛樺叆redis
+        redisUtil.setCacheObject("login:" + userId, loginUser);
+        //鎶妕oken鍝嶅簲缁欏墠绔�
+        HashMap<String, String> map = new HashMap<>();
+        map.put("token", jwt);
+        return map;
+    }
+
+    @Override
+    public String logout() {
+        log.info("鐢ㄦ埛閫�鍑�");
+        SysUser user = UserInfoUtils.get();
+        redisUtil.deleteObject("login:" + user.getId());
+        return "娉ㄩ攢鎴愬姛";
+    }
+
+    @Transactional
+    @Override
+    public String saveUser(SysUserVO user) {
+        log.info("淇濆瓨鐢ㄦ埛淇℃伅");
+        // 榛樿瀵嗙爜
+        String password = passwordEncoder.encode(Const.DEFULT_PASSWORD);
+        user.setPassword(password);
+        SysUser sysUser = new SysUser();
+        BeanUtils.copyProperties(user, sysUser);
+        this.save(sysUser);
+        saveUserRole(user.getRoleList(), sysUser.getId());
+        return "success";
+    }
+
+    @Transactional
+    @Override
+    public SysUserVO updateUser(SysUserVO user) {
+        log.info("鏇存柊鐢ㄦ埛淇℃伅");
+        SysUser sysUser = new SysUser();
+        BeanUtils.copyProperties(user, sysUser);
+        this.updateById(sysUser);
+        log.info("鍒犻櫎鐢ㄦ埛瑙掕壊淇℃伅");
+        List<Long> roleIds = user.getRoleList().stream().map(SysRole::getId).collect(Collectors.toList());
+//        sysUserRoleService.remove(new LambdaQueryWrapper<SysUserRole>()
+//                .eq(SysUserRole::getUserId, sysUser.getId()).in(CollectionUtil.isNotEmpty(roleIds), SysUserRole::getRoleId, roleIds));
+        SysUserRole sysUserRole = new SysUserRole(sysUser.getId(),roleIds.get(0));
+        sysUserRoleMapper.updateById(sysUserRole);
+//        log.info("淇濆瓨鐢ㄦ埛瑙掕壊淇℃伅");
+//        saveUserRole(user.getRoleList(), sysUser.getId());
+        return user;
+    }
+
+    @Override
+    public String resetPassword(Long userId) {
+        log.info("閲嶇疆瀵嗙爜涓簕}", Const.DEFULT_PASSWORD);
+        SysUser sysUser = new SysUser();
+        sysUser.setId(userId);
+        String password = passwordEncoder.encode(Const.DEFULT_PASSWORD);
+        sysUser.setPassword(password);
+        this.updateById(sysUser);
+        return "success";
+    }
+
+    @Override
+    public SysUser queryByUserName(String userName) {
+        return baseMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, userName));
+    }
+
+    @Override
+    public List<SysUserVO> listByUserName(GeneralRequest request) {
+        MPJLambdaWrapper<SysUser> wrapper = new MPJLambdaWrapper<>();
+        wrapper.selectAll(SysUser.class)
+                .selectCollection(SysRole.class, SysUserVO::getRoleList)
+                .leftJoin(SysUserRole.class, SysUserRole::getUserId, SysUser::getId)
+                .leftJoin(SysRole.class, SysRole::getId, SysUserRole::getRoleId)
+                .like(StringUtils.hasText(request.getKey()), SysUser::getUserName, request.getKey());
+        return baseMapper.selectJoinList(SysUserVO.class, wrapper);
+    }
+
+    @Transactional
+    @Override
+    public String deleteUser(List<Long> ids) {
+        this.removeByIds(ids);
+        sysUserRoleService.remove(new QueryWrapper<SysUserRole>().in("user_id", ids));
+        return "success";
+
+    }
+
+    @Override
+    public List<String> getUserAuthorityInfo(Long userId) {
+        SysUser sysUser = baseMapper.selectById(userId);
+
+        //  ROLE_admin,ROLE_normal,sys:user:list,....
+        String authority = "";
+        if (redisUtil.hasKey("GrantedAuthority:" + sysUser.getUserName())) {
+            authority = redisUtil.getCacheObject("GrantedAuthority:" + sysUser.getUserName());
+
+        } else {
+            // 鑾峰彇瑙掕壊缂栫爜
+            List<SysRole> roles = sysRoleService.list(new QueryWrapper<SysRole>()
+                    .inSql("id", "select role_id from sys_user_role where user_id = " + userId));
+
+            if (roles.size() > 0) {
+                String roleCodes = roles.stream().map(r -> "ROLE_" + r.getRoleKey()).collect(Collectors.joining(","));
+                authority = roleCodes.concat(",");
+            }
+
+            // 鑾峰彇鑿滃崟鎿嶄綔缂栫爜
+            List<String> perms = sysMenuMapper.selectPermsByUserId(userId);
+            if (perms.size() > 0) {
+                String menuPerms = String.join(",", perms);
+                authority = authority.concat(menuPerms);
+            }
+
+            redisUtil.setCacheObject("GrantedAuthority:" + sysUser.getUserName(), authority, 60 * 60, TimeUnit.SECONDS);
+        }
+        return Arrays.stream(authority.split(",")).collect(Collectors.toList());
+    }
+
+    @Override
+    public void clearUserAuthorityInfo(String userName) {
+        redisUtil.deleteObject("GrantedAuthority:" + userName);
+    }
+
+    @Override
+    public void clearUserAuthorityInfoByRoleId(Long roleId) {
+        List<SysUser> sysUsers = this.list(new QueryWrapper<SysUser>()
+                .inSql("id", "select user_id from sys_user_role where role_id = " + roleId));
+
+        sysUsers.forEach(u -> {
+            this.clearUserAuthorityInfo(u.getUserName());
+        });
+
+    }
+
+    @Override
+    public void clearUserAuthorityInfoByMenuId(Long menuId) {
+        MPJLambdaWrapper<SysUserRole> wrapper = new MPJLambdaWrapper<SysUserRole>().selectAll(SysUser.class).distinct()
+                .leftJoin(SysUser.class, SysUser::getId, SysUserRole::getUserId)
+                .leftJoin(SysRoleMenu.class, SysRoleMenu::getRoleId, SysUserRole::getRoleId)
+                .eq(SysRoleMenu::getMenuId, menuId);
+        List<SysUser> sysUsers = sysUserRoleService.selectJoinList(SysUser.class, wrapper);
+        sysUsers.forEach(u -> {
+            this.clearUserAuthorityInfo(u.getUserName());
+        });
+    }
+
+    /**
+     * 瀹炵幇UserDetailsService鎺ュ彛锛屼粠鏁版嵁搴撳唴鑾峰彇鐢ㄦ埛鍙婃潈闄愪俊鎭�
+     *
+     * @param username
+     * @return
+     * @throws UsernameNotFoundException
+     */
+    @Override
+    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+        LambdaQueryWrapper<SysUser> lqw = new LambdaQueryWrapper<>();
+        lqw.eq(SysUser::getUserName, username);
+        SysUser user = this.baseMapper.selectOne(lqw);
+        //鍒ゆ柇鏄惁涓虹┖
+        if (Objects.isNull(user)) {
+            throw new RuntimeException("鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒");
+        }
+        //鏌ヨ鏉冮檺淇℃伅
+        List<String> perms = sysMenuMapper.selectPermsByUserId(user.getId());
+
+        return new LoginUser(user, perms);
+    }
+
+
+    private void saveUserRole(List<SysRole> roles, Long userId) {
+        log.info("淇濆瓨鐢ㄦ埛瑙掕壊淇℃伅");
+        List<SysUserRole> userRoles = new ArrayList<>();
+        if (CollectionUtils.isEmpty(roles)) {
+            log.info("淇濆瓨鐢ㄦ埛瑙掕壊淇℃伅涓虹┖锛岀粰榛樿鏅�氱敤鎴疯鑹�");
+            userRoles.add(new SysUserRole(userId, Const.DEFULT_ROLE));
+        } else {
+            log.info("淇濆瓨鐢ㄦ埛瑙掕壊淇℃伅");
+            userRoles = roles.stream().map(e -> new SysUserRole(userId, e.getId())).collect(Collectors.toList());
+        }
+        sysUserRoleService.saveBatch(userRoles);
+    }
+
+}
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/resources/application-dev.yml b/ShangHaiMesParent/common/springsecurity/src/main/resources/application-dev.yml
new file mode 100644
index 0000000..475e8ef
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/resources/application-dev.yml
@@ -0,0 +1,15 @@
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://localhost:3306/jiumumes?serverTimezone=GMT%2b8&characterEncoding=utf-8&useSSL=false
+    username: root
+    password: beibo.123/
+  cloud:
+    nacos:
+      discovery:
+        server-addr: localhost:8848
+  redis:
+    database: 0
+    host: localhost
+    port: 6379
+    password: 123456
\ No newline at end of file
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/resources/application-loc.yml b/ShangHaiMesParent/common/springsecurity/src/main/resources/application-loc.yml
new file mode 100644
index 0000000..618e1eb
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/resources/application-loc.yml
@@ -0,0 +1,15 @@
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://localhost:3306/jiumumes?serverTimezone=GMT%2b8&characterEncoding=utf-8&useSSL=false
+    username: root
+    password: root
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 127.0.0.1:8848
+  redis:
+    database: 0
+    host: 127.0.0.1
+    port: 6379
+    password: 123456
\ No newline at end of file
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/resources/application-prod.yml b/ShangHaiMesParent/common/springsecurity/src/main/resources/application-prod.yml
new file mode 100644
index 0000000..475e8ef
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/resources/application-prod.yml
@@ -0,0 +1,15 @@
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://localhost:3306/jiumumes?serverTimezone=GMT%2b8&characterEncoding=utf-8&useSSL=false
+    username: root
+    password: beibo.123/
+  cloud:
+    nacos:
+      discovery:
+        server-addr: localhost:8848
+  redis:
+    database: 0
+    host: localhost
+    port: 6379
+    password: 123456
\ No newline at end of file
diff --git a/ShangHaiMesParent/common/springsecurity/src/main/resources/mapper/SysMenuMapper.xml b/ShangHaiMesParent/common/springsecurity/src/main/resources/mapper/SysMenuMapper.xml
new file mode 100644
index 0000000..38607e4
--- /dev/null
+++ b/ShangHaiMesParent/common/springsecurity/src/main/resources/mapper/SysMenuMapper.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.mes.menu.mapper.SysMenuMapper">
+
+    <select id="selectPermsByUserId" resultType="java.lang.String">
+        SELECT DISTINCT m.perms
+        FROM sys_user_role ur
+                 LEFT JOIN sys_role r ON ur.role_id = r.id
+                 LEFT JOIN sys_role_menu rm ON ur.role_id = rm.role_id
+                 LEFT JOIN sys_menu m ON m.id = rm.menu_id
+        WHERE user_id = #{userid}
+          AND r.status = 0
+          AND m.status = 0
+    </select>
+</mapper>
diff --git a/ShangHaiMesParent/gateway/gateway1.iml b/ShangHaiMesParent/gateway/gateway1.iml
new file mode 100644
index 0000000..f76df2b
--- /dev/null
+++ b/ShangHaiMesParent/gateway/gateway1.iml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/ShangHaiMesParent/gateway/pom.xml b/ShangHaiMesParent/gateway/pom.xml
new file mode 100644
index 0000000..87a9837
--- /dev/null
+++ b/ShangHaiMesParent/gateway/pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>ShangHaiMesParent</artifactId>
+        <groupId>com.mes</groupId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>gateway</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+    <dependencies>
+        <!--        鏈嶅姟娉ㄥ唽/鍙戠幇-->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-gateway</artifactId>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/ShangHaiMesParent/gateway/src/main/java/com/mes/GateWayApplication.java b/ShangHaiMesParent/gateway/src/main/java/com/mes/GateWayApplication.java
new file mode 100644
index 0000000..a16e459
--- /dev/null
+++ b/ShangHaiMesParent/gateway/src/main/java/com/mes/GateWayApplication.java
@@ -0,0 +1,20 @@
+package com.mes;
+
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+
+/**
+ * @Author : yanzhixin
+ * @Date: 2024/3/28 11:21
+ * @Description:
+ */
+@SpringBootApplication
+@EnableDiscoveryClient
+public class GateWayApplication {
+    
+    public static void main(String[] args) {
+        SpringApplication.run(GateWayApplication.class, args);
+    }
+}
diff --git a/ShangHaiMesParent/gateway/src/main/java/com/mes/config/MyCorsConfig.java b/ShangHaiMesParent/gateway/src/main/java/com/mes/config/MyCorsConfig.java
new file mode 100644
index 0000000..4ed51ec
--- /dev/null
+++ b/ShangHaiMesParent/gateway/src/main/java/com/mes/config/MyCorsConfig.java
@@ -0,0 +1,34 @@
+package com.mes.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.reactive.CorsWebFilter;
+import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
+
+/**
+ * @Author : yanzhixin
+ * @Date: 2024/3/25 14:13
+ * @Description:
+ */
+@Configuration
+public class MyCorsConfig {
+    @Bean
+    public CorsWebFilter corsFilter() {
+
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+        CorsConfiguration corsConfiguration = new CorsConfiguration();
+        //鍏佽鍝簺澶磋法鍩�
+        corsConfiguration.addAllowedHeader("*");
+        // 鍏佽鍝簺鏂瑰紡璺ㄥ煙   get  post  delete 绛夋柟寮�
+        corsConfiguration.addAllowedMethod("*");
+        //鍏佽鍝簺璇锋眰鏉ユ簮璺ㄥ煙    *  浠绘剰鏉ユ簮
+        corsConfiguration.addAllowedOrigin("*");
+        // 鏄惁鍏佽鎼哄甫cooker璺ㄥ煙
+        corsConfiguration.setAllowCredentials(true);
+        //娉ㄥ唽璺ㄨ秺閰嶇疆       /**閰嶇疆璇锋眰璺緞
+        source.registerCorsConfiguration("/**", corsConfiguration);
+        return new CorsWebFilter(source);
+    }
+
+}
diff --git a/ShangHaiMesParent/gateway/src/main/resources/application.yml b/ShangHaiMesParent/gateway/src/main/resources/application.yml
new file mode 100644
index 0000000..a266061
--- /dev/null
+++ b/ShangHaiMesParent/gateway/src/main/resources/application.yml
@@ -0,0 +1,20 @@
+server:
+  port: 88
+spring:
+  application:
+    name: gateway
+  cloud:
+    nacos:
+      discovery:
+        server-addr: localhost:8848
+    gateway:
+      discovery:
+        locator:
+          enabled: true
+      routes:
+        - id: deviceInteraction
+          uri: lb://deviceInteraction
+          predicates:
+            - Path=/api/deviceInteraction/**
+          filters:
+            - StripPrefix=2
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/pom.xml b/ShangHaiMesParent/moduleService/plcConnectModule/pom.xml
new file mode 100644
index 0000000..d70cc4b
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/pom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>moduleService</artifactId>
+        <groupId>com.mes</groupId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>plcConnect</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.samba.jcifs</groupId>
+            <artifactId>jcifs</artifactId>
+            <version>1.2.19</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.s7connector</groupId>
+            <artifactId>s7connector</artifactId>
+            <version>2.1</version>
+        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.github.yulichang</groupId>-->
+<!--            <artifactId>mybatis-plus-join-boot-starter</artifactId>-->
+<!--            <version>1.4.12</version>-->
+<!--        </dependency>-->
+    </dependencies>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+
+</project>
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/AppRunnerConfig.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/AppRunnerConfig.java
new file mode 100644
index 0000000..026476d
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/AppRunnerConfig.java
@@ -0,0 +1,48 @@
+package com.mes;
+
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.mes.connect.IndustrialInterface.Api;
+import com.mes.connect.Thread.MachineThread;
+import com.mes.model.entity.Machine;
+import com.mes.model.mapper.MachineMapper;
+import com.mes.model.service.MachineService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Component
+@Order(1)
+
+public class AppRunnerConfig implements ApplicationRunner {
+
+    @Autowired
+    Api api;
+    @Autowired
+    MachineService machineService;
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        // TODO Auto-generated method stub
+        //1.鏍规嵁鏁版嵁搴撹澶囪〃鍔犺浇鏁版嵁  寰楀埌鍏ㄩ儴 璁惧淇℃伅
+        List<Machine> listMachine = machineService.getMachineConfig();
+        //2.鏍规嵁璁惧閰嶇疆杩涜鍔犺浇澶氱嚎绋�
+        for (int i = 1; i < listMachine.size(); i++)
+            try {
+                Machine machine = listMachine.get(i);
+                Thread thread = new Thread(new MachineThread(machine, api));
+                thread.start();
+                thread.setName(machine.getName());
+            } catch (Exception e) {
+                // TODO: handle exception
+                System.out.println("澶氱嚎绋嬪紓甯革紒锛�");
+            }
+    }
+}
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/common/JsonConversion.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/common/JsonConversion.java
new file mode 100644
index 0000000..9572d14
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/common/JsonConversion.java
@@ -0,0 +1,18 @@
+package com.mes.common;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class JsonConversion {
+    /**
+     * 浣跨敤Jackson灏咼SON瀛楃涓茶浆鎹负瀹炰綋绫�
+     */
+    public static <T> T jsonToObjectByJackson(String json, Class<T> clazz) {
+        try {
+            ObjectMapper mapper = new ObjectMapper();
+            return mapper.readValue(json, clazz);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/common/ReadFile.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/common/ReadFile.java
new file mode 100644
index 0000000..f3cbc35
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/common/ReadFile.java
@@ -0,0 +1,40 @@
+package com.mes.common;
+
+import com.alibaba.fastjson.JSONException;
+import com.alibaba.fastjson.JSONObject;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+public class ReadFile {
+    // 璇诲彇Json鏂囦欢鍐呭
+    public static JSONObject readJson(String fileName) throws IOException {
+        // 璧勬簮璺緞锛堢浉瀵逛簬resources鏍圭洰褰曪級
+        String resourcePath = "jsonFile/"+fileName;
+        // 鑾峰彇绫诲姞杞藉櫒
+        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+        // 璇诲彇璧勬簮
+        try (InputStream inputStream = classLoader.getResourceAsStream(resourcePath)) {
+            if (inputStream == null) {
+                throw new IOException("璧勬簮鏈壘鍒�: " + resourcePath);
+            }
+            StringBuilder content = new StringBuilder();
+            // 璇诲彇鏂囨湰鍐呭
+            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+            String line;
+            while ((line = reader.readLine()) != null) {
+                content.append(line);
+            }
+            String str = content.toString();
+
+            return JSONObject.parseObject(str);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (JSONException e) {
+            throw new RuntimeException(e);
+        }
+        return null;
+    }
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/common/RestTemplateConfig.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/common/RestTemplateConfig.java
new file mode 100644
index 0000000..2ffbfbe
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/common/RestTemplateConfig.java
@@ -0,0 +1,13 @@
+package com.mes.common;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class RestTemplateConfig {
+    @Bean
+    public RestTemplate restTemplate() {
+        return new RestTemplate();
+    }
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/ExampleDataHandler.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/ExampleDataHandler.java
new file mode 100644
index 0000000..962f943
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/ExampleDataHandler.java
@@ -0,0 +1,169 @@
+package com.mes.connect;
+
+import com.mes.connect.IndustrialInterface.IndustrialDataHandler;
+import com.mes.connect.addressParser.ModbusAddressParser;
+import com.mes.connect.protocol.ProtocolAddress;
+
+public class ExampleDataHandler implements IndustrialDataHandler {
+    private final boolean[] coils = new boolean[1000];
+    private final boolean[] discreteInputs = new boolean[1000];
+    private final int[] holdingRegisters = new int[1000];
+    private final int[] inputRegisters = new int[1000];
+
+    @Override
+    public boolean handleReadBit(String address) {
+        ProtocolAddress parsedAddress = new ModbusAddressParser().parse(address);
+        if (parsedAddress.getFunctionCode() == 1) { // 绾垮湀
+            int index = parsedAddress.getAddress();
+            return coils[index];
+        } else if (parsedAddress.getFunctionCode() == 2) { // 绂绘暎杈撳叆
+            int index = parsedAddress.getAddress();
+            return discreteInputs[index];
+        }
+        return false;
+    }
+
+    @Override
+    public void handleWriteBit(String address, boolean value) {
+        ProtocolAddress parsedAddress = new ModbusAddressParser().parse(address);
+        if (parsedAddress.getFunctionCode() == 1) { // 绾垮湀
+            int index = parsedAddress.getAddress();
+            coils[index] = value;
+            System.out.println("鍐欏叆绾垮湀 " + address + " 鍊�: " + value);
+        }
+    }
+
+    @Override
+    public int handleReadRegister(String address) {
+        ProtocolAddress parsedAddress = new ModbusAddressParser().parse(address);
+        if (parsedAddress.getFunctionCode() == 3) { // 淇濇寔瀵勫瓨鍣�
+            int index = parsedAddress.getAddress();
+            return holdingRegisters[index];
+        } else if (parsedAddress.getFunctionCode() == 4) { // 杈撳叆瀵勫瓨鍣�
+            int index = parsedAddress.getAddress();
+            return inputRegisters[index];
+        }
+        return 0;
+    }
+
+    @Override
+    public void handleWriteRegister(String address, int value) {
+        ProtocolAddress parsedAddress = new ModbusAddressParser().parse(address);
+        if (parsedAddress.getFunctionCode() == 3) { // 淇濇寔瀵勫瓨鍣�
+            int index = parsedAddress.getAddress();
+            holdingRegisters[index] = value;
+            System.out.println("鍐欏叆瀵勫瓨鍣� " + address + " 鍊�: " + value);
+        }
+    }
+
+    @Override
+    public void handleWriteRegisters(String address, int[] values) {
+        ProtocolAddress parsedAddress = new ModbusAddressParser().parse(address);
+        if (parsedAddress.getFunctionCode() == 16) { // 鍐欏涓瘎瀛樺櫒
+            int index = parsedAddress.getAddress();
+            System.arraycopy(values, 0, holdingRegisters, index, values.length);
+            System.out.println("鍐欏叆瀵勫瓨鍣� " + address + " 鏁伴噺: " + values.length);
+        }
+    }
+    @Override
+    public int[] handleReadRegisters(String address, int quantity) {
+        ProtocolAddress parsedAddress = new ModbusAddressParser().parse(address);
+        if (parsedAddress.getFunctionCode() == 3) { // 淇濇寔瀵勫瓨鍣�
+            int startIndex = parsedAddress.getAddress();
+            int[] result = new int[quantity];
+            System.arraycopy(holdingRegisters, startIndex, result, 0, Math.min(quantity, holdingRegisters.length - startIndex));
+            return result;
+        } else if (parsedAddress.getFunctionCode() == 4) { // 杈撳叆瀵勫瓨鍣�
+            int startIndex = parsedAddress.getAddress();
+            int[] result = new int[quantity];
+            System.arraycopy(inputRegisters, startIndex, result, 0, Math.min(quantity, inputRegisters.length - startIndex));
+            return result;
+        } else if (address.startsWith("S7.")) {
+            return handleS7ReadRegisters(address, quantity);
+        }
+        return new int[0];
+    }
+
+    private int[] handleS7ReadRegisters(String address, int quantity) {
+        // 瑙f瀽S7鍦板潃鏍煎紡骞惰鍙栧涓瘎瀛樺櫒
+        String[] parts = address.split("\\.");
+        if (parts.length >= 3 && parts[0].equals("S7") && parts[1].startsWith("DB")) {
+            try {
+                int dbNumber = Integer.parseInt(parts[1].substring(2));
+                String type = parts[2].substring(0, 3);
+                int startIndex = Integer.parseInt(parts[2].substring(3));
+
+                int baseIndex = dbNumber * 1000 + startIndex;
+                int[] result = new int[quantity];
+
+                if (type.equals("DBW")) {
+                    // 瀛�(16浣�)鏁扮粍
+                    for (int i = 0; i < quantity && baseIndex + i < holdingRegisters.length; i++) {
+                        result[i] = holdingRegisters[baseIndex + i];
+                    }
+                } else if (type.equals("DBD")) {
+                    // 鍙屽瓧(32浣�)鏁扮粍锛屾瘡涓弻瀛楀崰涓や釜瀵勫瓨鍣ㄤ綅缃�
+                    for (int i = 0; i < quantity && baseIndex + i * 2 + 1 < holdingRegisters.length; i++) {
+                        result[i] = (holdingRegisters[baseIndex + i * 2] << 16) |
+                                (holdingRegisters[baseIndex + i * 2 + 1] & 0xFFFF);
+                    }
+                }
+
+                return result;
+            } catch (NumberFormatException e) {
+                System.err.println("鍦板潃瑙f瀽閿欒: " + address);
+            }
+        }
+        return new int[0];
+    }
+
+    @Override
+    public float handleReadFloat(String address) {
+        int[] registers = handleReadRegisters(address, 2);
+        if (registers.length >= 2) {
+            int intBits = (registers[0] << 16) | registers[1];
+            return Float.intBitsToFloat(intBits);
+        }
+        return 0.0f;
+    }
+
+    @Override
+    public void handleWriteFloat(String address, float value) {
+        int intBits = Float.floatToIntBits(value);
+        int highWord = (intBits >> 16) & 0xFFFF;
+        int lowWord = intBits & 0xFFFF;
+        handleWriteRegisters(address, new int[]{highWord, lowWord});
+    }
+
+    @Override
+    public String handleReadString(String address, int length) {
+        int[] registers = handleReadRegisters(address, (length + 1) / 2);
+        byte[] bytes = new byte[registers.length * 2];
+
+        for (int i = 0; i < registers.length; i++) {
+            bytes[i * 2] = (byte) ((registers[i] >> 8) & 0xFF);
+            bytes[i * 2 + 1] = (byte) (registers[i] & 0xFF);
+        }
+
+        return new String(bytes, 0, length);
+    }
+
+    @Override
+    public void handleWriteString(String address, String value) {
+        byte[] bytes = value.getBytes();
+        int[] registers = new int[(bytes.length + 1) / 2];
+
+        for (int i = 0; i < bytes.length; i++) {
+            int regIndex = i / 2;
+            int byteIndex = i % 2;
+
+            if (byteIndex == 0) {
+                registers[regIndex] = (bytes[i] & 0xFF) << 8;
+            } else {
+                registers[regIndex] |= (bytes[i] & 0xFF);
+            }
+        }
+
+        handleWriteRegisters(address, registers);
+    }
+}
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/AddressParser.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/AddressParser.java
new file mode 100644
index 0000000..9a46cb1
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/AddressParser.java
@@ -0,0 +1,10 @@
+package com.mes.connect.IndustrialInterface;
+
+import com.mes.connect.protocol.ProtocolAddress;
+
+/**
+ * 鍦板潃瑙f瀽鍣ㄦ帴鍙�
+ */
+public interface AddressParser {
+    ProtocolAddress parse(String address);
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/Api.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/Api.java
new file mode 100644
index 0000000..609a592
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/Api.java
@@ -0,0 +1,232 @@
+package com.mes.connect.IndustrialInterface;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.*;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.SqlOutParameter;
+import org.springframework.jdbc.core.SqlParameter;
+import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import org.springframework.jdbc.core.simple.SimpleJdbcCall;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class Api implements ApiService {
+
+
+
+    private final RestTemplate restTemplate;
+
+    private final JdbcTemplate jdbcTemplate;
+    @Autowired
+    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
+
+    // 浣跨敤鏋勯�犲嚱鏁版敞鍏�
+    @Autowired
+    public Api(RestTemplate restTemplate, JdbcTemplate jdbcTemplate) {
+        this.restTemplate = restTemplate;
+        this.jdbcTemplate = jdbcTemplate;
+    }
+    /**
+     * 鍙戦�丠TTP璇锋眰锛屾敮鎸丟ET鍜孭OST鏂规硶
+     *
+     * @param url 璇锋眰URL
+     * @param data 璇锋眰鍙傛暟鎴栬姹備綋
+     * @return 鍝嶅簲鍐呭鎸夎鍒嗗壊鐨勬暟缁�
+     */
+    @DS("mes_machine")
+    @Override
+    public List<String> httpApi(String url,Map<String, Object> data) {
+        try {
+            // 鏋勫缓URL
+            UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
+            // 澶勭悊鍝嶅簲
+            String responseBody;
+            String method=data.get("method").toString();
+            data.remove("method");
+            if ("GET".equals(method)) {
+                // GET璇锋眰锛氬皢鍙傛暟娣诲姞鍒癠RL鏌ヨ鍙傛暟涓�
+                if (data != null) {
+                    data.forEach(builder::queryParam);
+                }
+                // 鍙戦�丟ET璇锋眰
+                ResponseEntity<String> response = restTemplate.exchange(
+                        builder.toUriString(),
+                        HttpMethod.GET,
+                        null,
+                        String.class
+                );
+                responseBody = response.getBody();
+            } else if ("POST".equals(method)) {
+                // POST璇锋眰锛氬皢鍙傛暟浣滀负璇锋眰浣�
+                HttpHeaders headers = new HttpHeaders();
+                headers.setContentType(MediaType.APPLICATION_JSON);
+                HttpEntity<?> entity = new HttpEntity<>(data, headers);
+                // 鍙戦�丳OST璇锋眰
+                ResponseEntity<String> response = restTemplate.exchange(
+                        builder.toUriString(),
+                        HttpMethod.POST,
+                        entity,
+                        String.class
+                );
+                responseBody = response.getBody();
+            } else {
+                throw new IllegalArgumentException("涓嶆敮鎸佺殑HTTP鏂规硶: " + method);
+            }
+            // 鐩存帴鎻愬彇data鏁扮粍
+            List<String> dataList = JSON.parseObject(responseBody)
+                    .getJSONArray("data")
+                    .toJavaList(String.class);
+            return dataList;
+            //return responseBody != null ? responseBody.split("\n") : new String[0];
+        } catch (Exception e) {
+            // 寮傚父澶勭悊
+            e.printStackTrace();
+            return null;
+        }
+    }
+    @DS("mes_machine")
+    @Override
+    public List<String> viewApi(String viewName, Map<String, Object> params) {
+        // 楠岃瘉瑙嗗浘鍚嶆槸鍚﹀悎娉曪紝闃叉SQL娉ㄥ叆
+        if (!isValidViewName(viewName)) {
+            throw new IllegalArgumentException("鏃犳晥鐨勮鍥惧悕绉�");
+        }
+
+        // 浣跨敤棰勭紪璇戣鍙ユ瀯寤烘煡璇�
+        StringBuilder sql = new StringBuilder("SELECT * FROM " + viewName);
+        MapSqlParameterSource paramSource = new MapSqlParameterSource();
+
+        if (params != null && !params.isEmpty()) {
+            sql.append(" WHERE ");
+            boolean first = true;
+
+            for (Map.Entry<String, Object> entry : params.entrySet()) {
+                if (!first) {
+                    sql.append(" AND ");
+                }
+                sql.append(entry.getKey()).append(" = :").append(entry.getKey());
+                paramSource.addValue(entry.getKey(), entry.getValue());
+                first = false;
+            }
+        }
+        // 浣跨敤Map鍙傛暟鎵ц鏌ヨ骞惰浆鎹㈢粨鏋�
+        List<Map<String, Object>> resultList = namedParameterJdbcTemplate.queryForList(
+                sql.toString(),
+                paramSource.getValues()
+        );
+
+        return convertResultToList(resultList);
+    }
+    @DS("jiumumes")
+    @Override
+    public List<String> procedureAPI(String procedureName, Map<String, Object> params,Map<String, Object> outParams) {
+        try {
+            if (!isValidProcedureName(procedureName)) {
+                throw new IllegalArgumentException("鏃犳晥鐨勫瓨鍌ㄨ繃绋嬪悕绉�");
+            }
+
+            SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
+                    .withProcedureName(procedureName)
+                    .withoutProcedureColumnMetaDataAccess();
+
+            if (params != null) {
+                for (Map.Entry<String, Object> entry : params.entrySet()) {
+                    // 纭畾鍙傛暟绫诲瀷
+                    int sqlType = getSqlType(entry.getValue());
+
+                    // 妫�鏌ユ槸鍚︿负杈撳嚭鍙傛暟
+                    if (outParams != null && outParams.containsKey(entry.getKey())) {
+                        Object outParamInfo = outParams.get(entry.getKey());
+                        int outSqlType;
+
+                        // 浠庤緭鍑哄弬鏁颁俊鎭腑鑾峰彇SQL绫诲瀷
+                        if (outParamInfo instanceof Integer) {
+                            outSqlType = (Integer) outParamInfo;
+                        } else if (outParamInfo instanceof Map) {
+                            // 鍋囪Map涓寘鍚�"sqlType"閿�
+                            Map<String, Object> outParamMap = (Map<String, Object>) outParamInfo;
+                            outSqlType = (Integer) outParamMap.getOrDefault("sqlType", sqlType);
+                        } else {
+                            // 榛樿浣跨敤杈撳叆鍙傛暟鐨凷QL绫诲瀷
+                            outSqlType = sqlType;
+                        }
+
+                        // 浣跨敤鎸囧畾鐨凷QL绫诲瀷浣滀负杈撳嚭鍙傛暟
+                        jdbcCall.declareParameters(
+                                new SqlOutParameter(entry.getKey(), outSqlType)
+                        );
+                    } else {
+                        // 浣滀负杈撳叆鍙傛暟
+                        jdbcCall.declareParameters(
+                                new SqlParameter(entry.getKey(), sqlType)
+                        );
+                    }
+                }
+            }
+
+            // 鎵ц瀛樺偍杩囩▼骞惰幏鍙栫粨鏋�
+            Map<String, Object> result = jdbcCall.execute(params);
+
+            // 澶勭悊杈撳嚭鍙傛暟
+            if (outParams != null) {
+                for (String paramName : outParams.keySet()) {
+                    if (result.containsKey(paramName)) {
+                        // 灏嗚緭鍑哄弬鏁扮殑鍊兼斁鍥炲師鍙傛暟Map涓�
+                        params.put(paramName, result.get(paramName));
+                    }
+                }
+            }
+
+            // 杩斿洖缁撴灉淇℃伅
+            return null;
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    // 灏嗘煡璇㈢粨鏋滆浆鎹负瀛楃涓叉暟缁�
+    private List<String> convertResultToList(List<Map<String, Object>> resultList) {
+        List<String> resultStrings = new ArrayList<>();
+        for (Map<String, Object> row : resultList) {
+            for (String key : row.keySet()) {
+                resultStrings.add(row.get(key).toString());
+            }
+            return resultStrings;
+        }
+        //return resultStrings.toArray(new String[0]);
+        return resultStrings;
+    }
+
+    // 绫诲瀷鏄犲皠鏂规硶
+    private int getSqlType(Object value) {
+        if (value instanceof String) return Types.VARCHAR;
+        if (value instanceof Integer) return Types.INTEGER;
+        if (value instanceof Double) return Types.DOUBLE;
+        if (value instanceof java.util.Date) return Types.TIMESTAMP;
+        if (value instanceof Boolean) return Types.BOOLEAN;
+        return Types.VARCHAR;
+    }
+
+    // 楠岃瘉瑙嗗浘鍚嶇О锛堥槻姝QL娉ㄥ叆锛�
+    private boolean isValidViewName(String viewName) {
+        // 绠�鍗曢獙璇侊細鍙厑璁稿瓧姣嶃�佹暟瀛楀拰涓嬪垝绾匡紝涓旈暱搴︿笉瓒呰繃50
+        return viewName.matches("^[a-zA-Z0-9_]{1,50}$");
+    }
+
+    // 楠岃瘉瀛樺偍杩囩▼鍚嶇О
+    private boolean isValidProcedureName(String procedureName) {
+        return procedureName.matches("^[a-zA-Z0-9_]{1,50}$");
+    }
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/ApiService.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/ApiService.java
new file mode 100644
index 0000000..dd6c553
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/ApiService.java
@@ -0,0 +1,44 @@
+package com.mes.connect.IndustrialInterface;
+
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璐︽埛琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author wu
+ * @since 2024-08-28
+ */
+public interface ApiService {
+    /**
+     * 璋冪敤HTTP鎺ュ彛
+     * @param url HTTP璇锋眰鍦板潃
+     * @param data 璇锋眰鍙傛暟
+     * @return 鍝嶅簲缁撴灉
+     */
+    List<String> httpApi(String url, Map<String, Object> data);
+
+    /**
+     * 璋冪敤瑙嗗浘API
+     * @param viewName 瑙嗗浘鍚嶇О
+     * @param data 璇锋眰鍙傛暟
+     * @return 瑙嗗浘娓叉煋缁撴灉
+     */
+
+    List<String> viewApi(String viewName, Map<String, Object> data);
+
+    /**
+     * 璋冪敤瀛樺偍杩囩▼
+     * @param procedureName 瀛樺偍杩囩▼鍚嶇О
+     * @param params 杈撳叆鍙傛暟
+     * @param outParams 杈撳嚭鍙傛暟
+     * @return 瀛樺偍杩囩▼鎵ц缁撴灉
+     */
+    List<String> procedureAPI(String procedureName, Map<String, Object> params,Map<String, Object> outParams);
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/IndustrialClient.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/IndustrialClient.java
new file mode 100644
index 0000000..557a314
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/IndustrialClient.java
@@ -0,0 +1,27 @@
+package com.mes.connect.IndustrialInterface;
+
+import java.io.IOException;
+
+/**
+ * 宸ヤ笟閫氫俊缁熶竴鎺ュ彛 - 瀹㈡埛绔ā寮�
+ */
+public interface IndustrialClient extends AutoCloseable {
+    void connect() throws IOException;
+    void disconnect();
+    boolean isConnected();
+    
+    // 鏁版嵁璇诲啓鏂规硶
+    boolean readBit(String address) throws IOException;
+    void writeBit(String address, boolean value) throws IOException;
+    int readRegister(String address) throws IOException;
+    void writeRegister(String address, int value) throws IOException;
+    int[] readRegisters(String address, int quantity) throws IOException;
+    void writeRegisters(String address, int[] values) throws IOException;
+    float readFloat(String address) throws IOException;
+    void writeFloat(String address, float value) throws IOException;
+    String readString(String address, int length) throws IOException;
+    void writeString(String address, String value) throws IOException;
+    
+    @Override
+    void close() throws IOException;
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/IndustrialDataHandler.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/IndustrialDataHandler.java
new file mode 100644
index 0000000..89c808c
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/IndustrialDataHandler.java
@@ -0,0 +1,17 @@
+package com.mes.connect.IndustrialInterface;
+
+/**
+ * 宸ヤ笟閫氫俊鏁版嵁澶勭悊鍣ㄦ帴鍙�
+ */
+public interface IndustrialDataHandler {
+    boolean handleReadBit(String address);
+    void handleWriteBit(String address, boolean value);
+    int handleReadRegister(String address);
+    void handleWriteRegister(String address, int value);
+    int[] handleReadRegisters(String address, int quantity);
+    void handleWriteRegisters(String address, int[] values);
+    float handleReadFloat(String address);
+    void handleWriteFloat(String address, float value);
+    String handleReadString(String address, int length);
+    void handleWriteString(String address, String value);
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/IndustrialServer.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/IndustrialServer.java
new file mode 100644
index 0000000..960ad01
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/IndustrialInterface/IndustrialServer.java
@@ -0,0 +1,16 @@
+package com.mes.connect.IndustrialInterface;
+
+import java.io.IOException;
+
+/**
+ * 宸ヤ笟閫氫俊缁熶竴鎺ュ彛 - 鏈嶅姟鍣ㄦā寮�
+ */
+public interface IndustrialServer extends AutoCloseable {
+    void start() throws IOException;
+    void stop();
+    boolean isRunning();
+    void setDataHandler(IndustrialDataHandler handler);
+    
+    @Override
+    void close() throws IOException;
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/Thread/MachineThread.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/Thread/MachineThread.java
new file mode 100644
index 0000000..aa1cdc0
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/Thread/MachineThread.java
@@ -0,0 +1,394 @@
+package com.mes.connect.Thread;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONException;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.mes.common.JsonConversion;
+import com.mes.common.ReadFile;
+import com.mes.connect.IndustrialInterface.Api;
+import com.mes.connect.IndustrialInterface.IndustrialClient;
+import com.mes.connect.entity.*;
+import com.mes.connect.modbus.ModbusIpClient;
+import com.mes.connect.modbus.ModbusTcpClient;
+import com.mes.connect.protocol.ProtocolType;
+import com.mes.connect.s7.S7Client;
+import com.mes.connect.s7.S7ClientOld;
+import com.mes.model.entity.Machine;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpMethod;
+import org.springframework.stereotype.Service;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+@Slf4j
+public class MachineThread extends Thread {
+    //褰撳墠璁惧鐨勫弬鏁�
+    private Machine machine;
+    private ProtocolType protocolType;
+    private IndustrialClient client;
+    private PlcParameters plcParameters;
+    private LogicConfig logicConfig;
+    private Api api;
+
+    // 瀛樺偍鎵�鏈夐�昏緫绾跨▼
+    private Map<String, Thread> logicThreads = new ConcurrentHashMap<>();
+    // 鎺у埗閫昏緫绾跨▼杩愯鐨勬爣蹇�
+    private Map<String, Boolean> logicRunningFlags = new ConcurrentHashMap<>();
+    // 涓荤嚎绋嬭繍琛屾爣蹇�
+    private boolean running = true;
+    // 涓荤嚎绋嬫墽琛岄棿闅�
+    private int mainThreadInterval = 1000;
+
+    public MachineThread(Machine machine, Api api) throws IOException {
+        this.machine = machine;
+        this.api = api;
+        this.logicConfig = JsonConversion.jsonToObjectByJackson(ReadFile.readJson(machine.getLogicFile()).toString(), LogicConfig.class);
+        this.plcParameters = JsonConversion.jsonToObjectByJackson(ReadFile.readJson(machine.getMachineFile()).toString(), PlcParameters.class);
+        switch (machine.getProtocolType().getName()) {
+            case "ModbusTcp":
+                client = new ModbusTcpClient(machine.getIp(), machine.getPort(), 1);
+                break;
+            case "ModbusIp":
+                client = new ModbusIpClient(machine.getIp(), machine.getPort());
+                break;
+            case "S7":
+                client = new S7Client(machine.getIp(), machine.getPort(), 0, 1);
+                break;
+            case "S7Old":
+                client = new S7ClientOld(machine.getPlcType().getName(),machine.getIp(), machine.getPort(), 0, 1);;
+                break;
+            default:
+                log.error("鏃犳晥鐨勫崗璁被鍨�: {}", protocolType);
+                throw new IllegalArgumentException("鏃犳晥鐨勫崗璁被鍨�: " + protocolType);
+        }
+        if (client != null) {
+            client.connect();
+            boolean connected = client.isConnected();
+            if (!connected) {
+                log.error("杩炴帴PLC澶辫触: {}", machine.getIp());
+            }
+        }
+    }
+
+    @Override
+    public void run() {
+        log.info("MachineThread鍚姩锛岃澶嘔P: {}", machine.getIp());
+        if (client == null || !client.isConnected()) {
+            log.error("PLC瀹㈡埛绔湭杩炴帴锛岀嚎绋嬮��鍑�");
+            return;
+        }
+
+        plcParameters.Initialization();
+
+        try {
+            // 鍒濆鍖栬鍙朠LC鍙傛暟
+            readPlcParameter();
+        } catch (Exception e) {
+            log.error("鍒濆鍖栬鍙朠LC鍙傛暟澶辫触: {}", e.getMessage(), e);
+            return;
+        }
+        // 涓烘瘡涓�昏緫椤瑰垱寤哄苟鍚姩瀛愮嚎绋�
+        //startLogicThread(logicConfig.getLogics().get(0));
+        for (LogicItem logicItem : logicConfig.getLogics()) {
+            startLogicThread(logicItem);
+            //startLogicThread(logicConfig.getLogics().get(0));
+        }
+
+        // 涓荤嚎绋嬫寔缁繍琛岋紝瀹氭湡璇诲彇PLC鍙傛暟骞剁洃鎺ц繛鎺ョ姸鎬�
+        while (running) {
+            try {
+                // 璇诲彇PLC鍙傛暟锛屼负閫昏緫澶勭悊鎻愪緵鏈�鏂版暟鎹�
+                readPlcParameter();
+
+                // 妫�鏌LC杩炴帴鐘舵��
+                if (!client.isConnected()) {
+                    log.warn("PLC杩炴帴鏂紑锛屽皾璇曢噸鏂拌繛鎺�");
+                    tryReconnect();
+                }
+
+                // 妫�鏌ラ�昏緫绾跨▼鐘舵�侊紝閲嶅惎宸茬粓姝㈢殑绾跨▼
+                checkLogicThreadsStatus();
+
+                // 绛夊緟涓嬩竴涓墽琛屽懆鏈�
+                Thread.sleep(mainThreadInterval);
+            } catch (InterruptedException e) {
+                log.info("涓荤嚎绋嬭涓柇锛屽噯澶囬��鍑�");
+                running = false;
+                Thread.currentThread().interrupt();
+            } catch (Exception e) {
+                log.error("鎵ц杩囩▼涓彂鐢熼敊璇�: {}", e.getMessage(), e);
+                // 灏濊瘯閲嶆柊杩炴帴
+                tryReconnect();
+                // 绛夊緟涓�娈垫椂闂村啀缁х画鎵ц
+                try {
+                    Thread.sleep(5000);
+                } catch (InterruptedException ie) {
+                    log.info("涓荤嚎绋嬭涓柇锛屽噯澶囬��鍑�");
+                    running = false;
+                    Thread.currentThread().interrupt();
+                }
+            }
+        }
+
+        // 绾跨▼閫�鍑哄墠鍏抽棴鎵�鏈夎祫婧�
+        shutdown();
+        log.info("MachineThread宸查��鍑猴紝璁惧IP: {}", machine.getIp());
+    }
+
+    // 涓烘寚瀹氶�昏緫椤瑰垱寤哄苟鍚姩瀛愮嚎绋�
+    private void startLogicThread(LogicItem logicItem) {
+        String logicId = logicItem.getName(); // 鍋囪姣忎釜LogicItem鏈夊敮涓�ID
+        if (logicThreads.containsKey(logicId) && logicThreads.get(logicId).isAlive()) {
+            log.warn("閫昏緫椤圭嚎绋嬪凡鍦ㄨ繍琛�: {}", logicId);
+            return;
+        }
+
+        // 璁剧疆杩愯鏍囧織
+        logicRunningFlags.put(logicId, true);
+
+        // 鍒涘缓骞跺惎鍔ㄧ嚎绋�
+        Thread thread = new Thread(() -> {
+            log.info("閫昏緫椤圭嚎绋嬪惎鍔�: {}", logicId);
+
+            // 閫昏緫椤瑰瓙绾跨▼鎸佺画杩愯鐨勫惊鐜�
+            while (logicRunningFlags.getOrDefault(logicId, false)) {
+                try {
+                    // 鎵ц瀹為檯涓氬姟閫昏緫
+                    basicsLogic(logicItem);
+
+                    // 鏍规嵁閫昏緫椤圭殑鎵ц棰戠巼璁剧疆绛夊緟鏃堕棿锛岄粯璁�1000ms
+                    int logicInterval = 1000;
+                    Thread.sleep(logicInterval);
+                } catch (InterruptedException e) {
+                    log.info("閫昏緫椤圭嚎绋嬭涓柇锛屽噯澶囬��鍑�: {}", logicId);
+                    logicRunningFlags.put(logicId, false);
+                    Thread.currentThread().interrupt();
+                } catch (Exception e) {
+                    log.error("鎵ц閫昏緫椤瑰け璐�: {}, 閿欒: {}", logicId, e.getMessage(), e);
+                    // 绛夊緟涓�娈垫椂闂村啀缁х画鎵ц
+                    try {
+                        Thread.sleep(5000);
+                    } catch (InterruptedException ie) {
+                        log.info("閫昏緫椤圭嚎绋嬭涓柇锛屽噯澶囬��鍑�: {}", logicId);
+                        logicRunningFlags.put(logicId, false);
+                        Thread.currentThread().interrupt();
+                    }
+                }
+            }
+
+            log.info("閫昏緫椤圭嚎绋嬪凡閫�鍑�: {}", logicId);
+        });
+
+        // 璁剧疆绾跨▼鍚嶇О
+        thread.setName("Logic-" + logicId);
+
+        // 瀛樺偍绾跨▼寮曠敤
+        logicThreads.put(logicId, thread);
+
+        // 鍚姩绾跨▼
+        thread.start();
+        log.info("宸插惎鍔ㄩ�昏緫椤圭嚎绋�: {}", logicId);
+    }
+
+    // 妫�鏌ラ�昏緫绾跨▼鐘舵�侊紝閲嶅惎宸茬粓姝㈢殑绾跨▼
+    private void checkLogicThreadsStatus() {
+        for (LogicItem logicItem : logicConfig.getLogics()) {
+            String logicId = logicItem.getName();
+            Thread thread = logicThreads.get(logicId);
+
+            // 濡傛灉绾跨▼涓嶅瓨鍦ㄦ垨宸茬粓姝笖杩愯鏍囧織涓簍rue锛屽垯閲嶅惎绾跨▼
+            if ((thread == null || !thread.isAlive()) &&
+                    logicRunningFlags.getOrDefault(logicId, false)) {
+                log.warn("閫昏緫椤圭嚎绋嬪凡缁堟锛屽噯澶囬噸鍚�: {}", logicId);
+                startLogicThread(logicItem);
+            }
+        }
+    }
+
+    // 灏濊瘯閲嶆柊杩炴帴PLC
+    private void tryReconnect() {
+        if (client != null) {
+            try {
+                log.info("灏濊瘯閲嶆柊杩炴帴PLC: {}", machine.getIp());
+                client.disconnect();
+                Thread.sleep(2000);
+                boolean reconnected = client.isConnected();
+                if (reconnected) {
+                    log.info("PLC閲嶆柊杩炴帴鎴愬姛: {}", machine.getIp());
+                } else {
+                    log.error("PLC閲嶆柊杩炴帴澶辫触: {}", machine.getIp());
+                }
+            } catch (Exception e) {
+                log.error("閲嶆柊杩炴帴PLC寮傚父: {}", e.getMessage(), e);
+            }
+        }
+    }
+
+    // 鍏抽棴绾跨▼鍓嶇殑娓呯悊宸ヤ綔
+    public void shutdown() {
+        running = false;
+
+        // 鍋滄鎵�鏈夐�昏緫绾跨▼
+        for (String logicId : logicRunningFlags.keySet()) {
+            logicRunningFlags.put(logicId, false);
+            Thread thread = logicThreads.get(logicId);
+            if (thread != null && thread.isAlive()) {
+                thread.interrupt();
+            }
+        }
+
+        // 绛夊緟鎵�鏈夐�昏緫绾跨▼缁撴潫
+        for (String logicId : logicThreads.keySet()) {
+            Thread thread = logicThreads.get(logicId);
+            if (thread != null && thread.isAlive()) {
+                try {
+                    thread.join(1000); // 绛夊緟鏈�澶�1绉�
+                } catch (InterruptedException e) {
+                    log.error("绛夊緟閫昏緫绾跨▼缁撴潫鏃惰涓柇: {}", e.getMessage());
+                    Thread.currentThread().interrupt();
+                }
+            }
+        }
+
+        // 娓呯┖绾跨▼鏄犲皠
+        logicThreads.clear();
+        logicRunningFlags.clear();
+
+        // 鍏抽棴PLC杩炴帴
+        if (client != null) {
+            try {
+                client.disconnect();
+                log.info("PLC杩炴帴宸插叧闂�: {}", machine.getIp());
+            } catch (Exception e) {
+                log.error("鍏抽棴PLC杩炴帴寮傚父: {}", e.getMessage(), e);
+            }
+        }
+    }
+
+    //绀轰緥   瑙h閰嶇疆 鏍规嵁鎺ュ彛杩斿唴瀹圭粰PLC
+    public void basicsLogic(LogicItem logicItem) throws JSONException, IOException {
+        //1.璇诲彇PLC褰撳墠鍙傛暟
+        try {
+            //閬嶅巻閫昏緫
+            boolean isEqual=true;
+            for (Logic logic:logicItem.getLogic()){
+                String plcValue=plcParameters.getMap().get(logic.getCodeId()).getReadValue().toString();
+                if (!logic.getValue().contains(plcValue)){
+                    isEqual=false;
+                    logic.setEquals(false);
+                    logicItem.setEquals(false);
+                    break;
+                }
+            }
+            if (isEqual){
+                List<String> result=new ArrayList<>();
+                //3.鏌ヨ姝ら�昏緫涓嬮渶瑕佽繑鍥炵粰PLC鐨勬暟鎹� result鍙帴鏀�  HTTP鎺ュ彛,瑙嗗浘,瀛樺偍杩囩▼ 绛�  濡備笅
+                try{
+                    String connectType=logicItem.getConnectType();
+                    String connectAddress=logicItem.getConnectAddress();
+                    Map map=new HashMap();
+                    switch (connectType) {
+                        case "Http":
+                            map.put("method","POST");
+                            map.put("plcParameter",plcParameters);
+                            result= api.httpApi(connectAddress,map);
+                            log.info("鎺ュ彛杩斿洖鍐呭锛歿}",result);
+                            break;
+                        case "View": // 瑙嗗浘/琛�
+                            result= api.viewApi(connectAddress,map);
+                            break;
+                        case "Procedure": // 瀛樺偍杩囩▼
+                            //result= api.procedureAPI(connectAddress,plcParameter);
+                            break;
+                        default:
+                            log.warn("涓嶆敮鎸佺殑杩炴帴绫诲瀷: {}", connectType);
+                            return; // 涓嶆敮鎸佺殑鏂瑰紡
+                    }
+
+                }catch (Exception e){
+                    log.error("璋冪敤鎺ュ彛澶辫触: {}", e.getMessage(), e);
+                }
+                //4.杩斿洖PLC鍐呭
+                if (result != null&&!result.isEmpty()) {
+                    basicsResult(result,logicItem.getReturnValue());
+                }
+            }
+        }  catch (Exception e) {
+            log.error("鎵цbasicsLogic澶辫触: {}", e.getMessage(), e);
+        }
+    }
+
+    //浼犲叆闇�瑕佸彂閫佺殑鏁版嵁
+    public boolean basicsResult(List<String> sendData, List<ReturnValue> returnValue) throws JSONException, IOException {
+        for (ReturnValue itemReturnValue:returnValue){
+            //闇�瑕佽繑鍥濸LC鐨勫��
+            String values ="";
+            if (itemReturnValue.isFixed()){
+                //鍥哄畾鍊�
+                values= itemReturnValue.getValue();
+            }else{
+                //鎸変紶閫掔殑鍙傛暟鍊�
+                values= sendData.get(Integer.valueOf(itemReturnValue.getValue())-1);
+            }
+            if (values!=null && !values.equals("")){
+                //杩橀渶澧炴坊  涓嶅悓绫诲瀷璋冪敤涓嶅悓鏂规硶
+                switch (itemReturnValue.getPlcDataType()) {
+                    case "int":
+                        client.writeRegister(itemReturnValue.getAddress(),(int)Double.parseDouble(values));
+                        break;
+                    case "string":
+                        client.writeString(itemReturnValue.getAddress(),values);
+                        break;
+                    case "float":
+                        client.writeFloat(itemReturnValue.getAddress(),Float.valueOf(values));
+                        break;
+                    default:
+                        log.error("涓嶆敮鎸佺殑鏁版嵁绫诲瀷: {}", itemReturnValue.getPlcDataType());
+                        return false;
+                }
+
+            }
+        }
+        return true;
+    }
+
+    // 鎸夌収json鏂囦欢璇诲彇plc鍐呭
+    private PlcParameters readPlcParameter() throws IOException, JSONException {
+        List<Parameters> parametersList=plcParameters.getParameters();
+        for (int i=0;i<parametersList.size();i++){
+            //鏍规嵁绫诲瀷璇诲彇
+            switch (parametersList.get(i).getPlcDataType()) {
+                case "Word":
+                    int value=client.readRegister(parametersList.get(i).getAddress());
+                    parametersList.get(i).setReadValue(value);
+                    break;
+                case "string":
+                    //澶氬瘎瀛樺櫒    浼犻�掓暟閲�
+                    String strValue = client.readString(parametersList.get(i).getAddress(), 2);
+                    parametersList.get(i).setReadValue(strValue);
+                    break;
+                case "bit":
+                    //璇荤嚎鍦�
+                    boolean bitValue = client.readBit(parametersList.get(i).getAddress());
+                    parametersList.get(i).setReadValue(bitValue);
+                    break;
+                default:
+                    log.error("涓嶆敮鎸佺殑鏁版嵁绫诲瀷: {}", parametersList.get(i).getPlcDataType());
+                    return null;
+            }
+        }
+        plcParameters.setParameters(parametersList);
+        return plcParameters;
+    }
+}
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/ModbusAddressParser.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/ModbusAddressParser.java
new file mode 100644
index 0000000..aed0d68
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/ModbusAddressParser.java
@@ -0,0 +1,54 @@
+package com.mes.connect.addressParser;
+
+import com.mes.connect.IndustrialInterface.AddressParser;
+import com.mes.connect.protocol.ProtocolAddress;
+import com.mes.connect.protocol.ProtocolType;
+
+/**
+ * Modbus鍦板潃瑙f瀽鍣�
+ */
+public class ModbusAddressParser implements AddressParser {
+    @Override
+    public ProtocolAddress parse(String address) {
+        // 鏍煎紡绀轰緥: "MB.4x0001" 鎴� "MB.0x100.2"
+        if (!address.startsWith("MB.")) {
+            throw new IllegalArgumentException("Invalid Modbus address format: " + address);
+        }
+        
+        String[] parts = address.substring(3).split("\\.");
+        
+        if (parts.length < 1) {
+            throw new IllegalArgumentException("Invalid Modbus address format: " + address);
+        }
+        
+        // 瑙f瀽鍖哄煙
+        String areaStr = parts[0];
+        int functionCode;
+        
+        if (areaStr.startsWith("0x")) {
+            functionCode = 1; // 1璇荤嚎鍦� 5鍐欏崟涓嚎鍦�
+        } else if (areaStr.startsWith("1x")) {
+            functionCode = 2; // 璇荤鏁h緭鍏�
+        } else if (areaStr.startsWith("3x")) {
+            functionCode = 4; // 璇昏緭鍏ュ瘎瀛樺櫒
+        } else if (areaStr.startsWith("4x")) {
+            functionCode = 3; // 璇讳繚鎸佸瘎瀛樺櫒
+        } else {
+            throw new IllegalArgumentException("Invalid Modbus area: " + areaStr);
+        }
+        
+        // 瑙f瀽鍦板潃
+        int addressValue = Integer.parseInt(areaStr.substring(2));
+        if (functionCode == 3 || functionCode == 4) {
+            addressValue--; // Modbus淇濇寔瀵勫瓨鍣ㄥ拰杈撳叆瀵勫瓨鍣ㄥ湴鍧�浠�0寮�濮�
+        }
+        
+        // 瑙f瀽浣嶅湴鍧�锛堝鏋滄湁锛�
+        int bit = 0;
+        if (parts.length > 1) {
+            bit = Integer.parseInt(parts[1]);
+        }
+        
+        return new ProtocolAddress(ProtocolType.MODBUS_TCP, functionCode, 0, addressValue, bit);
+    }
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/ModbusIpAddressParser.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/ModbusIpAddressParser.java
new file mode 100644
index 0000000..241f867
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/ModbusIpAddressParser.java
@@ -0,0 +1,20 @@
+package com.mes.connect.addressParser;
+
+import com.mes.connect.IndustrialInterface.AddressParser;
+import com.mes.connect.protocol.ProtocolAddress;
+
+/**
+ * Modbus IP鍦板潃瑙f瀽鍣�
+ */
+public class ModbusIpAddressParser implements AddressParser {
+    @Override
+    public ProtocolAddress parse(String address) {
+        // 鏍煎紡绀轰緥: "MBIP.4x0001" 鎴� "MBIP.0x100.2"
+        if (!address.startsWith("MBIP.")) {
+            throw new IllegalArgumentException("Invalid Modbus IP address format: " + address);
+        }
+        
+        // 澶嶇敤Modbus鍦板潃瑙f瀽閫昏緫
+        return new ModbusAddressParser().parse("MB." + address.substring(5));
+    }
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/ModbusRtuAddressParser.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/ModbusRtuAddressParser.java
new file mode 100644
index 0000000..9b45415
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/ModbusRtuAddressParser.java
@@ -0,0 +1,15 @@
+package com.mes.connect.addressParser;
+
+import com.mes.connect.IndustrialInterface.AddressParser;
+import com.mes.connect.protocol.ProtocolAddress;
+
+/**
+ * Modbus RTU鍦板潃瑙f瀽鍣�
+ */
+class ModbusRtuAddressParser implements AddressParser {
+    @Override
+    public ProtocolAddress parse(String address) {
+        // 澶嶇敤Modbus鍦板潃瑙f瀽閫昏緫
+        return new ModbusAddressParser().parse(address);
+    }
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/S7AddressParser.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/S7AddressParser.java
new file mode 100644
index 0000000..7ee5153
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/S7AddressParser.java
@@ -0,0 +1,82 @@
+package com.mes.connect.addressParser;
+
+import com.mes.connect.IndustrialInterface.AddressParser;
+import com.mes.connect.protocol.ProtocolAddress;
+import com.mes.connect.protocol.ProtocolType;
+
+/**
+ * S7鍦板潃瑙f瀽鍣�
+ */
+public class S7AddressParser implements AddressParser {
+    @Override
+    public ProtocolAddress parse(String address) {
+        // 鏍煎紡绀轰緥: "S7.DB1.DBX10.2" 鎴� "S7.M100"
+        //浣嶅湴鍧�锛歋7.DB1.DBX0.0 (DB1 鍧椾腑鐨勫瓧鑺� 0 鐨勪綅 0)
+        //瀛楄妭鍦板潃锛歋7.DB1.DBB0 (DB1 鍧椾腑鐨勫瓧鑺� 0)
+        //瀛楀湴鍧�锛歋7.DB1.DBW0 (DB1 鍧椾腑鐨勫瓧 0)
+        //鍙屽瓧鍦板潃锛歋7.DB1.DBD0 (DB1 鍧椾腑鐨勫弻瀛� 0)
+        if (!address.startsWith("S7.")) {
+            throw new IllegalArgumentException("Invalid S7 address format: " + address);
+        }
+        
+        String[] parts = address.substring(3).split("\\.");
+        
+        if (parts.length < 2) {
+            throw new IllegalArgumentException("Invalid S7 address format: " + address);
+        }
+        
+        // 瑙f瀽DB鍙�
+        int dbNumber = 0;
+        int area = 0x84; // 榛樿DB鍖哄煙
+        
+        if (parts[0].startsWith("DB")) {
+            dbNumber = Integer.parseInt(parts[0].substring(2));
+        } else if (parts[0].equals("I")) {
+            area = 0x81; // 杈撳叆鍖哄煙
+        } else if (parts[0].equals("Q")) {
+            area = 0x82; // 杈撳嚭鍖哄煙
+        } else if (parts[0].equals("M")) {
+            area = 0x83; // 鍐呭瓨鍖哄煙
+        } else {
+            throw new IllegalArgumentException("Invalid S7 area: " + parts[0]);
+        }
+        
+        // 瑙f瀽鍦板潃绫诲瀷鍜屽湴鍧�鍊�
+        String addressPart = parts[1];
+        int addressValue = 0;
+        int bit = 0;
+        
+        if (area == 0x84) { // DB鍖哄煙
+            if (addressPart.startsWith("DBX")) {
+                // 浣嶅湴鍧�
+                String[] bitParts = addressPart.substring(3).split("\\.");
+                addressValue = Integer.parseInt(bitParts[0]);
+                if (bitParts.length > 1) {
+                    bit = Integer.parseInt(bitParts[1]);
+                }
+            } else if (addressPart.startsWith("DBW")) {
+                // 瀛楀湴鍧�
+                addressValue = Integer.parseInt(addressPart.substring(3));
+            } else if (addressPart.startsWith("DBD")) {
+                // 鍙屽瓧鍦板潃
+                addressValue = Integer.parseInt(addressPart.substring(3));
+            } else {
+                throw new IllegalArgumentException("Invalid S7 DB address type: " + addressPart);
+            }
+        } else { // I/Q/M鍖哄煙
+            if (addressPart.startsWith("X")) {
+                // 浣嶅湴鍧�
+                String[] bitParts = addressPart.substring(1).split("\\.");
+                addressValue = Integer.parseInt(bitParts[0]);
+                if (bitParts.length > 1) {
+                    bit = Integer.parseInt(bitParts[1]);
+                }
+            } else {
+                // 瀛楀湴鍧�
+                addressValue = Integer.parseInt(addressPart);
+            }
+        }
+        
+        return new ProtocolAddress(ProtocolType.S7, area, dbNumber, addressValue, bit);
+    }
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/S7OldAddressParser.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/S7OldAddressParser.java
new file mode 100644
index 0000000..8021c61
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/addressParser/S7OldAddressParser.java
@@ -0,0 +1,82 @@
+package com.mes.connect.addressParser;
+
+import com.mes.connect.IndustrialInterface.AddressParser;
+import com.mes.connect.protocol.ProtocolAddress;
+import com.mes.connect.protocol.ProtocolType;
+
+/**
+ * S7鍦板潃瑙f瀽鍣�
+ */
+public class S7OldAddressParser implements AddressParser {
+    @Override
+    public ProtocolAddress parse(String address) {
+        // 鏍煎紡绀轰緥: "S7.DB1.DBX10.2" 鎴� "S7.M100"
+        //浣嶅湴鍧�锛歋7.DB1.DBX0.0 (DB1 鍧椾腑鐨勫瓧鑺� 0 鐨勪綅 0)
+        //瀛楄妭鍦板潃锛歋7.DB1.DBB0 (DB1 鍧椾腑鐨勫瓧鑺� 0)
+        //瀛楀湴鍧�锛歋7.DB1.DBW0 (DB1 鍧椾腑鐨勫瓧 0)
+        //鍙屽瓧鍦板潃锛歋7.DB1.DBD0 (DB1 鍧椾腑鐨勫弻瀛� 0)
+        if (!address.startsWith("S7.")) {
+            throw new IllegalArgumentException("Invalid S7 address format: " + address);
+        }
+        
+        String[] parts = address.substring(3).split("\\.");
+        
+        if (parts.length < 2) {
+            throw new IllegalArgumentException("Invalid S7 address format: " + address);
+        }
+        
+        // 瑙f瀽DB鍙�
+        int dbNumber = 0;
+        int area = 0x84; // 榛樿DB鍖哄煙
+        
+        if (parts[0].startsWith("DB")) {
+            dbNumber = Integer.parseInt(parts[0].substring(2));
+        } else if (parts[0].equals("I")) {
+            area = 0x81; // 杈撳叆鍖哄煙
+        } else if (parts[0].equals("Q")) {
+            area = 0x82; // 杈撳嚭鍖哄煙
+        } else if (parts[0].equals("M")) {
+            area = 0x83; // 鍐呭瓨鍖哄煙
+        } else {
+            throw new IllegalArgumentException("Invalid S7 area: " + parts[0]);
+        }
+        
+        // 瑙f瀽鍦板潃绫诲瀷鍜屽湴鍧�鍊�
+        String addressPart = parts[1];
+        int addressValue = 0;
+        int bit = 0;
+        
+        if (area == 0x84) { // DB鍖哄煙
+            if (addressPart.startsWith("DBX")) {
+                // 浣嶅湴鍧�
+                String[] bitParts = addressPart.substring(3).split("\\.");
+                addressValue = Integer.parseInt(bitParts[0]);
+                if (bitParts.length > 1) {
+                    bit = Integer.parseInt(bitParts[1]);
+                }
+            } else if (addressPart.startsWith("DBW")) {
+                // 瀛楀湴鍧�
+                addressValue = Integer.parseInt(addressPart.substring(3));
+            } else if (addressPart.startsWith("DBD")) {
+                // 鍙屽瓧鍦板潃
+                addressValue = Integer.parseInt(addressPart.substring(3));
+            } else {
+                throw new IllegalArgumentException("Invalid S7 DB address type: " + addressPart);
+            }
+        } else { // I/Q/M鍖哄煙
+            if (addressPart.startsWith("X")) {
+                // 浣嶅湴鍧�
+                String[] bitParts = addressPart.substring(1).split("\\.");
+                addressValue = Integer.parseInt(bitParts[0]);
+                if (bitParts.length > 1) {
+                    bit = Integer.parseInt(bitParts[1]);
+                }
+            } else {
+                // 瀛楀湴鍧�
+                addressValue = Integer.parseInt(addressPart);
+            }
+        }
+        
+        return new ProtocolAddress(ProtocolType.S7, area, dbNumber, addressValue, bit);
+    }
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/Logic.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/Logic.java
new file mode 100644
index 0000000..2d55853
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/Logic.java
@@ -0,0 +1,20 @@
+package com.mes.connect.entity;
+
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Data
+public class Logic {
+    private String codeId;
+    private String address;
+    private List<String> value;
+    private String plcDataType;
+    private int length;
+    @Getter
+    @Setter
+    private boolean equals;
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/LogicConfig.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/LogicConfig.java
new file mode 100644
index 0000000..71af220
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/LogicConfig.java
@@ -0,0 +1,19 @@
+package com.mes.connect.entity;
+
+import com.alibaba.fastjson.JSONException;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.mes.common.JsonConversion;
+import com.mes.common.ReadFile;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.util.List;
+
+@Slf4j
+@Data
+public class LogicConfig {
+    private List<LogicItem> logics;
+
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/LogicItem.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/LogicItem.java
new file mode 100644
index 0000000..7b82092
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/LogicItem.java
@@ -0,0 +1,22 @@
+package com.mes.connect.entity;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class LogicItem {
+    private String name;
+    private String sequence;
+    private String connectType;
+    private String method;
+    private String connectAddress;
+    private List<Logic> logic;
+    private List<ReturnValue> returnValue;
+    @Getter
+    @Setter
+    private boolean equals;
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/Parameters.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/Parameters.java
new file mode 100644
index 0000000..1c31463
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/Parameters.java
@@ -0,0 +1,23 @@
+package com.mes.connect.entity;
+
+import lombok.Data;
+
+import java.util.stream.Collectors;
+
+@Data
+public class Parameters {
+    private String serialNumber;
+    private String content;
+    private String codeId;
+    private String plcDataType;
+    private int fontLocation;
+    private int length;
+    private String ratio;
+    private String scale;
+    private String address;
+    private byte[] readByte;
+    private Object readValue;
+    private String remarks;
+
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/PlcParameters.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/PlcParameters.java
new file mode 100644
index 0000000..decd27c
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/PlcParameters.java
@@ -0,0 +1,20 @@
+package com.mes.connect.entity;
+
+import com.alibaba.fastjson.JSONException;
+import lombok.Data;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Data
+public class PlcParameters {
+    private List<Parameters> parameters;
+    private Map<String, Parameters> map;
+
+    public void Initialization() {
+        this.map=parameters.stream().collect(Collectors.toMap(Parameters::getCodeId, item -> item));
+    }
+    
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/ReturnValue.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/ReturnValue.java
new file mode 100644
index 0000000..84c3448
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/entity/ReturnValue.java
@@ -0,0 +1,13 @@
+package com.mes.connect.entity;
+
+import lombok.Data;
+
+@Data
+public class ReturnValue {
+    private String codeId;
+    private String address;
+    private boolean fixed;
+    private String value;
+    private String plcDataType;
+    private int length;
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/modbus/ModbusIpClient.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/modbus/ModbusIpClient.java
new file mode 100644
index 0000000..506b84d
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/modbus/ModbusIpClient.java
@@ -0,0 +1,461 @@
+package com.mes.connect.modbus;
+
+import com.mes.connect.IndustrialInterface.AddressParser;
+import com.mes.connect.IndustrialInterface.IndustrialClient;
+import com.mes.connect.addressParser.ModbusIpAddressParser;
+import com.mes.connect.protocol.ProtocolAddress;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.util.Arrays;
+import java.util.logging.Logger;
+
+/**
+ * Modbus IP瀹㈡埛绔疄鐜帮紙鍩轰簬UDP锛�
+ */
+public class ModbusIpClient implements IndustrialClient {
+    private static final Logger logger = Logger.getLogger(ModbusIpClient.class.getName());
+    private DatagramSocket socket;
+    private final String host;
+    private final int port;
+    private boolean connected;
+    private int transactionId = 0;
+    private final AddressParser addressParser = new ModbusIpAddressParser();
+
+    public ModbusIpClient(String host, int port) {
+        this.host = host;
+        this.port = port;
+    }
+
+    @Override
+    public synchronized void connect() throws IOException {
+        if (!connected) {
+            socket = new DatagramSocket();
+            socket.setSoTimeout(5000); // 5绉掕秴鏃�
+            connected = true;
+            logger.info("Connected to Modbus IP server: " + host + ":" + port);
+        }
+    }
+
+    @Override
+    public synchronized void disconnect() {
+        if (connected) {
+            try {
+                if (socket != null) {
+                    socket.close();
+                }
+            } finally {
+                socket = null;
+                connected = false;
+                logger.info("Disconnected from Modbus IP server");
+            }
+        }
+    }
+
+    @Override
+    public boolean isConnected() {
+        return connected && socket != null && !socket.isClosed();
+    }
+
+
+    @Override
+    public boolean readBit(String address) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        String[] parts = address.split("\\.");
+        String strAddress ="";
+        if (parts.length >1) {
+            strAddress = parts[0]+"."+parts[1];
+        }
+        int[] data = readRegisters(strAddress, 1);
+        int byteValue = data[0];
+        return (byteValue & (1 << parsedAddress.getBit())) != 0;
+    }
+
+    @Override
+    public void writeBit(String address, boolean value) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        String[] parts = address.split("\\.");
+        String strAddress ="";
+        if (parts.length >1) {
+            strAddress = parts[0]+"."+parts[1];
+        }
+        int[] currentData = readRegisters(strAddress, 1);
+        int byteValue = currentData[0];
+        if (value) {
+            byteValue |= (1 << parsedAddress.getBit());
+        } else {
+            byteValue &= ~(1 << parsedAddress.getBit());
+        }
+        writeRegister(strAddress, byteValue);
+    }
+
+//    @Override
+//    public boolean readBit(String address) throws IOException {
+//        ProtocolAddress parsedAddress = addressParser.parse(address);
+//        int functionCode = parsedAddress.getFunctionCode();
+//        int startAddress = parsedAddress.getAddress();
+//        int bit = parsedAddress.getBit();
+//
+//        if (functionCode != 1 && functionCode != 2) {
+//            throw new IllegalArgumentException("Invalid function code for bit operation: " + functionCode);
+//        }
+//
+//        byte[] request = buildReadRequest(functionCode, startAddress, 1);
+//        byte[] response = sendRequest(request);
+//
+//        if (response[7] == functionCode) {
+//            int byteCount = response[8] & 0xFF;
+//            if (byteCount >= 1) {
+//                byte data = response[9];
+//                return (data & (1 << bit)) != 0;
+//            }
+//        } else if (response[7] == functionCode + 0x80) {
+//            int exceptionCode = response[8] & 0xFF;
+//            throw new IOException("Modbus exception: " + exceptionCode);
+//        }
+//
+//        throw new IOException("Invalid Modbus response");
+//    }
+//
+//    @Override
+//    public void writeBit(String address, boolean value) throws IOException {
+//        ProtocolAddress parsedAddress = addressParser.parse(address);
+//        int functionCode = parsedAddress.getFunctionCode();
+//        int startAddress = parsedAddress.getAddress();
+//
+//        if (functionCode != 5) {
+//            throw new IllegalArgumentException("Invalid function code for write bit operation: " + functionCode);
+//        }
+//
+//        int writeValue = value ? 0xFF00 : 0x0000;
+//        byte[] request = buildWriteSingleCoilRequest(startAddress, writeValue);
+//        byte[] response = sendRequest(request);
+//
+//        if (response[7] != functionCode) {
+//            if (response[7] == functionCode + 0x80) {
+//                int exceptionCode = response[8] & 0xFF;
+//                throw new IOException("Modbus exception: " + exceptionCode);
+//            }
+//            throw new IOException("Invalid Modbus response");
+//        }
+//    }
+
+    @Override
+    public int readRegister(String address) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        int functionCode = parsedAddress.getFunctionCode();
+        int startAddress = parsedAddress.getAddress();
+
+        if (functionCode != 3 && functionCode != 4) {
+            throw new IllegalArgumentException("Invalid function code for register operation: " + functionCode);
+        }
+
+        byte[] request = buildReadRequest(functionCode, startAddress, 1);
+        byte[] response = sendRequest(request);
+
+        if (response[7] == functionCode) {
+            int byteCount = response[8] & 0xFF;
+            if (byteCount >= 2) {
+                return ((response[9] & 0xFF) << 8) | (response[10] & 0xFF);
+            }
+        } else if (response[7] == functionCode + 0x80) {
+            int exceptionCode = response[8] & 0xFF;
+            throw new IOException("Modbus exception: " + exceptionCode);
+        }
+
+        throw new IOException("Invalid Modbus response");
+    }
+
+    @Override
+    public void writeRegister(String address, int value) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        int functionCode = parsedAddress.getFunctionCode();
+        int startAddress = parsedAddress.getAddress();
+
+        if (functionCode != 6) {
+            throw new IllegalArgumentException("Invalid function code for write register operation: " + functionCode);
+        }
+
+        byte[] request = buildWriteSingleRegisterRequest(startAddress, value);
+        byte[] response = sendRequest(request);
+
+        if (response[7] != functionCode) {
+            if (response[7] == functionCode + 0x80) {
+                int exceptionCode = response[8] & 0xFF;
+                throw new IOException("Modbus exception: " + exceptionCode);
+            }
+            throw new IOException("Invalid Modbus response");
+        }
+    }
+
+    @Override
+    public int[] readRegisters(String address, int quantity) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        int functionCode = parsedAddress.getFunctionCode();
+        int startAddress = parsedAddress.getAddress();
+
+        if (functionCode != 3 && functionCode != 4) {
+            throw new IllegalArgumentException("Invalid function code for register operation: " + functionCode);
+        }
+
+        byte[] request = buildReadRequest(functionCode, startAddress, quantity);
+        byte[] response = sendRequest(request);
+
+        if (response[7] == functionCode) {
+            int byteCount = response[8] & 0xFF;
+            if (byteCount == quantity * 2) {
+                int[] result = new int[quantity];
+                for (int i = 0; i < quantity; i++) {
+                    result[i] = ((response[9 + i*2] & 0xFF) << 8) | (response[10 + i*2] & 0xFF);
+                }
+                return result;
+            }
+        } else if (response[7] == functionCode + 0x80) {
+            int exceptionCode = response[8] & 0xFF;
+            throw new IOException("Modbus exception: " + exceptionCode);
+        }
+
+        throw new IOException("Invalid Modbus response");
+    }
+
+    @Override
+    public void writeRegisters(String address, int[] values) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        int functionCode = parsedAddress.getFunctionCode();
+        int startAddress = parsedAddress.getAddress();
+
+        if (functionCode != 16) {
+            throw new IllegalArgumentException("Invalid function code for write registers operation: " + functionCode);
+        }
+
+        byte[] request = buildWriteMultipleRegistersRequest(startAddress, values);
+        byte[] response = sendRequest(request);
+
+        if (response[7] != functionCode) {
+            if (response[7] == functionCode + 0x80) {
+                int exceptionCode = response[8] & 0xFF;
+                throw new IOException("Modbus exception: " + exceptionCode);
+            }
+            throw new IOException("Invalid Modbus response");
+        }
+    }
+
+    @Override
+    public float readFloat(String address) throws IOException {
+        int[] registers = readRegisters(address, 2);
+        int intBits = (registers[0] << 16) | registers[1];
+        return Float.intBitsToFloat(intBits);
+    }
+
+    @Override
+    public void writeFloat(String address, float value) throws IOException {
+        int intBits = Float.floatToIntBits(value);
+        int highWord = (intBits >> 16) & 0xFFFF;
+        int lowWord = intBits & 0xFFFF;
+        writeRegisters(address, new int[]{highWord, lowWord});
+    }
+
+    @Override
+    public String readString(String address, int length) throws IOException {
+        int[] registers = readRegisters(address, (length + 1) / 2);
+        byte[] bytes = new byte[registers.length * 2];
+
+        for (int i = 0; i < registers.length; i++) {
+            bytes[i * 2] = (byte) ((registers[i] >> 8) & 0xFF);
+            bytes[i * 2 + 1] = (byte) (registers[i] & 0xFF);
+        }
+
+        return new String(bytes, 0, length);
+    }
+
+    @Override
+    public void writeString(String address, String value) throws IOException {
+        byte[] bytes = value.getBytes();
+        int[] registers = new int[(bytes.length + 1) / 2];
+
+        for (int i = 0; i < bytes.length; i++) {
+            int regIndex = i / 2;
+            int byteIndex = i % 2;
+
+            if (byteIndex == 0) {
+                registers[regIndex] = (bytes[i] & 0xFF) << 8;
+            } else {
+                registers[regIndex] |= (bytes[i] & 0xFF);
+            }
+        }
+
+        writeRegisters(address, registers);
+    }
+
+    @Override
+    public void close() throws IOException {
+        disconnect();
+    }
+
+    private byte[] buildReadRequest(int functionCode, int startAddress, int quantity) {
+        byte[] request = new byte[12];
+
+        // 浜嬪姟鏍囪瘑绗�
+        request[0] = (byte) (transactionId >> 8);
+        request[1] = (byte) transactionId;
+
+        // 鍗忚鏍囪瘑绗� (0)
+        request[2] = 0;
+        request[3] = 0;
+
+        // 闀垮害 (6)
+        request[4] = 0;
+        request[5] = 6;
+
+        // 鍗曞厓鏍囪瘑绗� (1)
+        request[6] = 1;
+
+        // 鍔熻兘鐮�
+        request[7] = (byte) functionCode;
+
+        // 璧峰鍦板潃
+        request[8] = (byte) (startAddress >> 8);
+        request[9] = (byte) startAddress;
+
+        // 鏁伴噺
+        request[10] = (byte) (quantity >> 8);
+        request[11] = (byte) quantity;
+
+        transactionId = (transactionId + 1) % 65536;
+
+        return request;
+    }
+
+    private byte[] buildWriteSingleCoilRequest(int address, int value) {
+        byte[] request = new byte[12];
+
+        // 浜嬪姟鏍囪瘑绗�
+        request[0] = (byte) (transactionId >> 8);
+        request[1] = (byte) transactionId;
+
+        // 鍗忚鏍囪瘑绗� (0)
+        request[2] = 0;
+        request[3] = 0;
+
+        // 闀垮害 (6)
+        request[4] = 0;
+        request[5] = 6;
+
+        // 鍗曞厓鏍囪瘑绗� (1)
+        request[6] = 1;
+
+        // 鍔熻兘鐮� (5)
+        request[7] = 5;
+
+        // 鍦板潃
+        request[8] = (byte) (address >> 8);
+        request[9] = (byte) address;
+
+        // 鍊�
+        request[10] = (byte) (value >> 8);
+        request[11] = (byte) value;
+
+        transactionId = (transactionId + 1) % 65536;
+
+        return request;
+    }
+
+    private byte[] buildWriteSingleRegisterRequest(int address, int value) {
+        byte[] request = new byte[12];
+
+        // 浜嬪姟鏍囪瘑绗�
+        request[0] = (byte) (transactionId >> 8);
+        request[1] = (byte) transactionId;
+
+        // 鍗忚鏍囪瘑绗� (0)
+        request[2] = 0;
+        request[3] = 0;
+
+        // 闀垮害 (6)
+        request[4] = 0;
+        request[5] = 6;
+
+        // 鍗曞厓鏍囪瘑绗� (1)
+        request[6] = 1;
+
+        // 鍔熻兘鐮� (6)
+        request[7] = 6;
+
+        // 鍦板潃
+        request[8] = (byte) (address >> 8);
+        request[9] = (byte) address;
+
+        // 鍊�
+        request[10] = (byte) (value >> 8);
+        request[11] = (byte) value;
+
+        transactionId = (transactionId + 1) % 65536;
+
+        return request;
+    }
+
+    private byte[] buildWriteMultipleRegistersRequest(int address, int[] values) {
+        int byteCount = values.length * 2;
+        byte[] request = new byte[13 + byteCount];
+
+        // 浜嬪姟鏍囪瘑绗�
+        request[0] = (byte) (transactionId >> 8);
+        request[1] = (byte) transactionId;
+
+        // 鍗忚鏍囪瘑绗� (0)
+        request[2] = 0;
+        request[3] = 0;
+
+        // 闀垮害 (7 + byteCount)
+        request[4] = 0;
+        request[5] = (byte) (7 + byteCount);
+
+        // 鍗曞厓鏍囪瘑绗� (1)
+        request[6] = 1;
+
+        // 鍔熻兘鐮� (16)
+        request[7] = 16;
+
+        // 鍦板潃
+        request[8] = (byte) (address >> 8);
+        request[9] = (byte) address;
+
+        // 瀵勫瓨鍣ㄦ暟閲�
+        request[10] = (byte) (values.length >> 8);
+        request[11] = (byte) values.length;
+
+        // 瀛楄妭鏁�
+        request[12] = (byte) byteCount;
+
+        // 鍊�
+        for (int i = 0; i < values.length; i++) {
+            request[13 + i*2] = (byte) (values[i] >> 8);
+            request[14 + i*2] = (byte) values[i];
+        }
+
+        transactionId = (transactionId + 1) % 65536;
+
+        return request;
+    }
+
+    private byte[] sendRequest(byte[] request) throws IOException {
+        if (!isConnected()) {
+            connect();
+        }
+
+        InetAddress address = InetAddress.getByName(host);
+        DatagramPacket sendPacket = new DatagramPacket(request, request.length, address, port);
+
+        // 鍙戦�佽姹�
+        socket.send(sendPacket);
+
+        // 鎺ユ敹鍝嶅簲
+        byte[] receiveBuffer = new byte[1024];
+        DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);
+        socket.receive(receivePacket);
+
+        return Arrays.copyOf(receiveBuffer, receivePacket.getLength());
+    }
+}
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/modbus/ModbusIpServer.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/modbus/ModbusIpServer.java
new file mode 100644
index 0000000..999cc3f
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/modbus/ModbusIpServer.java
@@ -0,0 +1,393 @@
+package com.mes.connect.modbus;
+
+import com.mes.connect.IndustrialInterface.AddressParser;
+import com.mes.connect.IndustrialInterface.IndustrialDataHandler;
+import com.mes.connect.IndustrialInterface.IndustrialServer;
+import com.mes.connect.addressParser.ModbusIpAddressParser;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.logging.Logger;
+
+/**
+ * Modbus IP鏈嶅姟鍣ㄥ疄鐜帮紙鍩轰簬UDP锛�
+ */
+public class ModbusIpServer implements IndustrialServer {
+    private static final Logger logger = Logger.getLogger(ModbusIpServer.class.getName());
+    private DatagramSocket serverSocket;
+    private Thread serverThread;
+    private boolean running;
+    private IndustrialDataHandler handler;
+    private final int port;
+    private final ExecutorService threadPool = Executors.newFixedThreadPool(10);
+    private final AddressParser addressParser = new ModbusIpAddressParser();
+
+    public ModbusIpServer(int port) {
+        this.port = port;
+    }
+
+    @Override
+    public synchronized void start() throws IOException {
+        if (!running) {
+            serverSocket = new DatagramSocket(port);
+            serverThread = new Thread(this::serverLoop);
+            serverThread.setDaemon(true);
+            serverThread.start();
+            running = true;
+            logger.info("Modbus IP (UDP) server started on port " + port);
+        }
+    }
+
+    @Override
+    public synchronized void stop() {
+        if (running) {
+            running = false;
+            try {
+                if (serverSocket != null) {
+                    serverSocket.close();
+                }
+                if (serverThread != null) {
+                    serverThread.interrupt();
+                    serverThread.join(1000);
+                }
+                threadPool.shutdownNow();
+            } catch (InterruptedException e) {
+                logger.warning("Error stopping Modbus IP server: " + e.getMessage());
+            } finally {
+                serverSocket = null;
+                serverThread = null;
+                logger.info("Modbus IP (UDP) server stopped");
+            }
+        }
+    }
+
+    @Override
+    public boolean isRunning() {
+        return running;
+    }
+
+    @Override
+    public void setDataHandler(IndustrialDataHandler handler) {
+        this.handler = handler;
+    }
+
+    @Override
+    public void close() throws IOException {
+        stop();
+    }
+
+    private void serverLoop() {
+        byte[] receiveBuffer = new byte[1024];
+
+        while (running) {
+            try {
+                DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);
+                serverSocket.receive(receivePacket);
+
+                threadPool.submit(() -> handleRequest(receivePacket));
+            } catch (IOException e) {
+                if (running) {
+                    logger.warning("Error receiving packet: " + e.getMessage());
+                }
+            }
+        }
+    }
+
+    private void handleRequest(DatagramPacket requestPacket) {
+        byte[] requestData = new byte[requestPacket.getLength()];
+        System.arraycopy(requestPacket.getData(), requestPacket.getOffset(), requestData, 0, requestPacket.getLength());
+
+        try {
+            byte[] responseData = processRequest(requestData);
+
+            DatagramPacket responsePacket = new DatagramPacket(
+                    responseData,
+                    responseData.length,
+                    requestPacket.getAddress(),
+                    requestPacket.getPort()
+            );
+
+            serverSocket.send(responsePacket);
+        } catch (Exception e) {
+            logger.warning("Error processing request: " + e.getMessage());
+        }
+    }
+
+    private byte[] processRequest(byte[] request) {
+        int transactionId = ((request[0] & 0xFF) << 8) | (request[1] & 0xFF);
+        int unitId = request[6] & 0xFF;
+        int functionCode = request[7] & 0xFF;
+
+        try {
+            switch (functionCode) {
+                case 1: // 璇荤嚎鍦�
+                    return handleReadCoils(request, transactionId, unitId);
+                case 2: // 璇荤鏁h緭鍏�
+                    return handleReadDiscreteInputs(request, transactionId, unitId);
+                case 3: // 璇讳繚鎸佸瘎瀛樺櫒
+                    return handleReadHoldingRegisters(request, transactionId, unitId);
+                case 4: // 璇昏緭鍏ュ瘎瀛樺櫒
+                    return handleReadInputRegisters(request, transactionId, unitId);
+                case 5: // 鍐欏崟涓嚎鍦�
+                    return handleWriteSingleCoil(request, transactionId, unitId);
+                case 6: // 鍐欏崟涓瘎瀛樺櫒
+                    return handleWriteSingleRegister(request, transactionId, unitId);
+                case 15: // 鍐欏涓嚎鍦�
+                    return handleWriteMultipleCoils(request, transactionId, unitId);
+                case 16: // 鍐欏涓瘎瀛樺櫒
+                    return handleWriteMultipleRegisters(request, transactionId, unitId);
+                default:
+                    return buildExceptionResponse(transactionId, unitId, functionCode, 1); // 涓嶆敮鎸佺殑鍔熻兘鐮�
+            }
+        } catch (Exception e) {
+            logger.warning("Error processing request: " + e.getMessage());
+            return buildExceptionResponse(transactionId, unitId, functionCode, 4); // 鏈嶅姟鍣ㄨ澶囨晠闅�
+        }
+    }
+    private byte[] handleReadCoils(byte[] request, int transactionId, int unitId) {
+        int address = ((request[8] & 0xFF) << 8) | (request[9] & 0xFF);
+        int quantity = ((request[10] & 0xFF) << 8) | (request[11] & 0xFF);
+
+        if (quantity > 2000) {
+            return buildExceptionResponse(transactionId, unitId, 1, 3); // 璇锋眰鏁伴噺杩囧ぇ
+        }
+
+        byte[] response = new byte[9 + (quantity + 7) / 8];
+        response[0] = (byte) (transactionId >> 8);
+        response[1] = (byte) transactionId;
+        response[2] = 0; // 鍗忚鏍囪瘑绗﹂珮瀛楄妭
+        response[3] = 0; // 鍗忚鏍囪瘑绗︿綆瀛楄妭
+        response[4] = 0; // 闀垮害楂樺瓧鑺�
+        response[5] = (byte) (response.length - 6); // 闀垮害浣庡瓧鑺�
+        response[6] = (byte) unitId;
+        response[7] = 1; // 鍔熻兘鐮�
+        response[8] = (byte) ((quantity + 7) / 8); // 瀛楄妭鏁�
+
+        // 濉厖绾垮湀鏁版嵁
+        for (int i = 0; i < quantity; i++) {
+            String addressStr = String.format("MB.0x%04d.%d", address + i, 0);
+            boolean value = handler.handleReadBit(addressStr);
+            int byteIndex = 9 + i / 8;
+            int bitIndex = i % 8;
+            if (value) {
+                response[byteIndex] |= (1 << bitIndex);
+            }
+        }
+
+        return response;
+    }
+    private byte[] handleReadDiscreteInputs(byte[] request, int transactionId, int unitId) {
+        int address = ((request[8] & 0xFF) << 8) | (request[9] & 0xFF);
+        int quantity = ((request[10] & 0xFF) << 8) | (request[11] & 0xFF);
+
+        if (quantity > 2000) {
+            return buildExceptionResponse(transactionId, unitId, 2, 3); // 璇锋眰鏁伴噺杩囧ぇ
+        }
+
+        byte[] response = new byte[9 + (quantity + 7) / 8];
+        response[0] = (byte) (transactionId >> 8);
+        response[1] = (byte) transactionId;
+        response[2] = 0; // 鍗忚鏍囪瘑绗﹂珮瀛楄妭
+        response[3] = 0; // 鍗忚鏍囪瘑绗︿綆瀛楄妭
+        response[4] = 0; // 闀垮害楂樺瓧鑺�
+        response[5] = (byte) (response.length - 6); // 闀垮害浣庡瓧鑺�
+        response[6] = (byte) unitId;
+        response[7] = 2; // 鍔熻兘鐮�
+        response[8] = (byte) ((quantity + 7) / 8); // 瀛楄妭鏁�
+
+        // 濉厖绂绘暎杈撳叆鏁版嵁
+        for (int i = 0; i < quantity; i++) {
+            String addressStr = String.format("MB.1x%04d.%d", address + i, 0);
+            boolean value = handler.handleReadBit(addressStr);
+            int byteIndex = 9 + i / 8;
+            int bitIndex = i % 8;
+            if (value) {
+                response[byteIndex] |= (1 << bitIndex);
+            }
+        }
+
+        return response;
+    }
+
+    private byte[] handleReadInputRegisters(byte[] request, int transactionId, int unitId) {
+        int address = ((request[8] & 0xFF) << 8) | (request[9] & 0xFF);
+        int quantity = ((request[10] & 0xFF) << 8) | (request[11] & 0xFF);
+
+        if (quantity > 125) {
+            return buildExceptionResponse(transactionId, unitId, 4, 3); // 璇锋眰鏁伴噺杩囧ぇ
+        }
+
+        byte[] response = new byte[9 + quantity * 2];
+        response[0] = (byte) (transactionId >> 8);
+        response[1] = (byte) transactionId;
+        response[2] = 0; // 鍗忚鏍囪瘑绗﹂珮瀛楄妭
+        response[3] = 0; // 鍗忚鏍囪瘑绗︿綆瀛楄妭
+        response[4] = 0; // 闀垮害楂樺瓧鑺�
+        response[5] = (byte) (response.length - 6); // 闀垮害浣庡瓧鑺�
+        response[6] = (byte) unitId;
+        response[7] = 4; // 鍔熻兘鐮�
+        response[8] = (byte) (quantity * 2); // 瀛楄妭鏁�
+
+        // 濉厖杈撳叆瀵勫瓨鍣ㄦ暟鎹�
+        for (int i = 0; i < quantity; i++) {
+            String addressStr = String.format("MB.3x%04d", address + i);
+            int value = handler.handleReadRegister(addressStr);
+            int byteIndex = 9 + i * 2;
+            response[byteIndex] = (byte) (value >> 8);
+            response[byteIndex + 1] = (byte) value;
+        }
+
+        return response;
+    }
+
+    private byte[] handleReadHoldingRegisters(byte[] request, int transactionId, int unitId) {
+        int address = ((request[8] & 0xFF) << 8) | (request[9] & 0xFF);
+        int quantity = ((request[10] & 0xFF) << 8) | (request[11] & 0xFF);
+
+        if (quantity > 125) {
+            return buildExceptionResponse(transactionId, unitId, 3, 3); // 璇锋眰鏁伴噺杩囧ぇ
+        }
+
+        byte[] response = new byte[9 + quantity * 2];
+        response[0] = (byte) (transactionId >> 8);
+        response[1] = (byte) transactionId;
+        response[2] = 0; // 鍗忚鏍囪瘑绗﹂珮瀛楄妭
+        response[3] = 0; // 鍗忚鏍囪瘑绗︿綆瀛楄妭
+        response[4] = 0; // 闀垮害楂樺瓧鑺�
+        response[5] = (byte) (response.length - 6); // 闀垮害浣庡瓧鑺�
+        response[6] = (byte) unitId;
+        response[7] = 3; // 鍔熻兘鐮�
+        response[8] = (byte) (quantity * 2); // 瀛楄妭鏁�
+
+        // 濉厖淇濇寔瀵勫瓨鍣ㄦ暟鎹�
+        for (int i = 0; i < quantity; i++) {
+            String addressStr = String.format("MB.4x%04d", address + i);
+            int value = handler.handleReadRegister(addressStr);
+            int byteIndex = 9 + i * 2;
+            response[byteIndex] = (byte) (value >> 8);
+            response[byteIndex + 1] = (byte) value;
+        }
+
+        return response;
+    }
+
+    private byte[] handleWriteSingleCoil(byte[] request, int transactionId, int unitId) {
+        int address = ((request[8] & 0xFF) << 8) | (request[9] & 0xFF);
+        int value = ((request[10] & 0xFF) << 8) | (request[11] & 0xFF);
+
+        boolean coilValue = (value == 0xFF00);
+        String addressStr = String.format("MB.0x%04d.%d", address, 0);
+
+        handler.handleWriteBit(addressStr, coilValue);
+
+        // 杩斿洖涓庤姹傜浉鍚岀殑鏁版嵁浣滀负纭
+        byte[] response = new byte[12];
+        System.arraycopy(request, 0, response, 0, 12);
+        return response;
+    }
+
+    private byte[] handleWriteSingleRegister(byte[] request, int transactionId, int unitId) {
+        int address = ((request[8] & 0xFF) << 8) | (request[9] & 0xFF);
+        int value = ((request[10] & 0xFF) << 8) | (request[11] & 0xFF);
+
+        String addressStr = String.format("MB.4x%04d", address);
+        handler.handleWriteRegister(addressStr, value);
+
+        // 杩斿洖涓庤姹傜浉鍚岀殑鏁版嵁浣滀负纭
+        byte[] response = new byte[12];
+        System.arraycopy(request, 0, response, 0, 12);
+        return response;
+    }
+
+    private byte[] handleWriteMultipleCoils(byte[] request, int transactionId, int unitId) {
+        int address = ((request[8] & 0xFF) << 8) | (request[9] & 0xFF);
+        int quantity = ((request[10] & 0xFF) << 8) | (request[11] & 0xFF);
+        int byteCount = request[12] & 0xFF;
+
+        if (quantity > 1968) {
+            return buildExceptionResponse(transactionId, unitId, 15, 3); // 璇锋眰鏁伴噺杩囧ぇ
+        }
+
+        // 澶勭悊绾垮湀鍊�
+        for (int i = 0; i < quantity; i++) {
+            int byteIndex = 13 + i / 8;
+            int bitIndex = i % 8;
+            boolean value = ((request[byteIndex] & (1 << bitIndex)) != 0);
+            String addressStr = String.format("MB.0x%04d.%d", address + i, 0);
+            handler.handleWriteBit(addressStr, value);
+        }
+
+        // 鏋勫缓鍝嶅簲
+        byte[] response = new byte[12];
+        response[0] = (byte) (transactionId >> 8);
+        response[1] = (byte) transactionId;
+        response[2] = 0; // 鍗忚鏍囪瘑绗﹂珮瀛楄妭
+        response[3] = 0; // 鍗忚鏍囪瘑绗︿綆瀛楄妭
+        response[4] = 0; // 闀垮害楂樺瓧鑺�
+        response[5] = 6; // 闀垮害浣庡瓧鑺�
+        response[6] = (byte) unitId;
+        response[7] = 15; // 鍔熻兘鐮�
+        response[8] = (byte) (address >> 8); // 璧峰鍦板潃楂樺瓧鑺�
+        response[9] = (byte) address; // 璧峰鍦板潃浣庡瓧鑺�
+        response[10] = (byte) (quantity >> 8); // 鏁伴噺楂樺瓧鑺�
+        response[11] = (byte) quantity; // 鏁伴噺浣庡瓧鑺�
+
+        return response;
+    }
+
+    private byte[] handleWriteMultipleRegisters(byte[] request, int transactionId, int unitId) {
+        int address = ((request[8] & 0xFF) << 8) | (request[9] & 0xFF);
+        int quantity = ((request[10] & 0xFF) << 8) | (request[11] & 0xFF);
+        int byteCount = request[12] & 0xFF;
+
+        if (quantity > 123) {
+            return buildExceptionResponse(transactionId, unitId, 16, 3); // 璇锋眰鏁伴噺杩囧ぇ
+        }
+
+        int[] values = new int[quantity];
+
+        // 瑙f瀽瀵勫瓨鍣ㄥ��
+        for (int i = 0; i < quantity; i++) {
+            int byteIndex = 13 + i * 2;
+            values[i] = ((request[byteIndex] & 0xFF) << 8) | (request[byteIndex + 1] & 0xFF);
+        }
+
+        // 澶勭悊鍐欏叆璇锋眰
+        String addressStr = String.format("MB.4x%04d", address);
+        handler.handleWriteRegisters(addressStr, values);
+
+        // 鏋勫缓鍝嶅簲
+        byte[] response = new byte[12];
+        response[0] = (byte) (transactionId >> 8);
+        response[1] = (byte) transactionId;
+        response[2] = 0; // 鍗忚鏍囪瘑绗﹂珮瀛楄妭
+        response[3] = 0; // 鍗忚鏍囪瘑绗︿綆瀛楄妭
+        response[4] = 0; // 闀垮害楂樺瓧鑺�
+        response[5] = 6; // 闀垮害浣庡瓧鑺�
+        response[6] = (byte) unitId;
+        response[7] = 16; // 鍔熻兘鐮�
+        response[8] = (byte) (address >> 8); // 璧峰鍦板潃楂樺瓧鑺�
+        response[9] = (byte) address; // 璧峰鍦板潃浣庡瓧鑺�
+        response[10] = (byte) (quantity >> 8); // 鏁伴噺楂樺瓧鑺�
+        response[11] = (byte) quantity; // 鏁伴噺浣庡瓧鑺�
+
+        return response;
+    }
+
+    private byte[] buildExceptionResponse(int transactionId, int unitId, int functionCode, int exceptionCode) {
+        byte[] response = new byte[9];
+        response[0] = (byte) (transactionId >> 8);
+        response[1] = (byte) transactionId;
+        response[2] = 0; // 鍗忚鏍囪瘑绗﹂珮瀛楄妭
+        response[3] = 0; // 鍗忚鏍囪瘑绗︿綆瀛楄妭
+        response[4] = 0; // 闀垮害楂樺瓧鑺�
+        response[5] = 3; // 闀垮害浣庡瓧鑺�
+        response[6] = (byte) unitId;
+        response[7] = (byte) (functionCode + 0x80); // 寮傚父鍔熻兘鐮�
+        response[8] = (byte) exceptionCode; // 寮傚父鐮�
+        return response;
+    }
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/modbus/ModbusTcpClient.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/modbus/ModbusTcpClient.java
new file mode 100644
index 0000000..5897e09
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/modbus/ModbusTcpClient.java
@@ -0,0 +1,374 @@
+package com.mes.connect.modbus;
+
+import com.mes.connect.IndustrialInterface.AddressParser;
+import com.mes.connect.IndustrialInterface.IndustrialClient;
+import com.mes.connect.addressParser.ModbusAddressParser;
+import com.mes.connect.protocol.ProtocolAddress;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.Socket;
+import java.util.logging.Logger;
+
+/**
+ * Modbus TCP瀹㈡埛绔疄鐜�
+ */
+public class ModbusTcpClient implements IndustrialClient {
+    private static final Logger logger = Logger.getLogger(ModbusTcpClient.class.getName());
+    private Socket socket;
+    private DataInputStream inputStream;
+    private DataOutputStream outputStream;
+    private final String host;
+    private final int port;
+    private final int unitId;
+    private int transactionId = 0;
+    private boolean connected;
+    private final AddressParser addressParser = new ModbusAddressParser();
+    
+    public ModbusTcpClient(String host, int port, int unitId) {
+        this.host = host;
+        this.port = port;
+        this.unitId = unitId;
+    }
+    
+    @Override
+    public synchronized void connect() throws IOException {
+        if (!connected) {
+            socket = new Socket(host, port);
+            socket.setSoTimeout(5000); // 5绉掕秴鏃�
+            inputStream = new DataInputStream(socket.getInputStream());
+            outputStream = new DataOutputStream(socket.getOutputStream());
+            connected = true;
+            logger.info("Connected to Modbus TCP server: " + host + ":" + port);
+        }
+    }
+    
+    @Override
+    public synchronized void disconnect() {
+        if (connected) {
+            try {
+                if (outputStream != null) outputStream.close();
+                if (inputStream != null) inputStream.close();
+                if (socket != null) socket.close();
+            } catch (IOException e) {
+                logger.warning("Error closing Modbus TCP connection: " + e.getMessage());
+            } finally {
+                outputStream = null;
+                inputStream = null;
+                socket = null;
+                connected = false;
+                logger.info("Disconnected from Modbus TCP server");
+            }
+        }
+    }
+    
+    @Override
+    public boolean isConnected() {
+        return connected && socket != null && socket.isConnected() && !socket.isClosed();
+    }
+
+    @Override
+    public boolean readBit(String address) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        String[] parts = address.split("\\.");
+        String strAddress ="";
+        if (parts.length >1) {
+            strAddress = parts[0]+"."+parts[1];
+        }
+        int[] data = readRegisters(strAddress, 1);
+        int byteValue = data[0];
+        return (byteValue & (1 << parsedAddress.getBit())) != 0;
+    }
+
+    @Override
+    public void writeBit(String address, boolean value) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        String[] parts = address.split("\\.");
+        String strAddress ="";
+        if (parts.length >1) {
+            strAddress = parts[0]+"."+parts[1];
+        }
+        int[] currentData = readRegisters(strAddress, 1);
+        int byteValue = currentData[0];
+        if (value) {
+            byteValue |= (1 << parsedAddress.getBit());
+        } else {
+            byteValue &= ~(1 << parsedAddress.getBit());
+        }
+        writeRegister(strAddress, byteValue);
+    }
+//    @Override
+//    public boolean readBit(String address) throws IOException {
+//        ProtocolAddress parsedAddress = addressParser.parse(address);
+//        int functionCode = parsedAddress.getFunctionCode();
+//        if (functionCode != 1 && functionCode != 2) {
+//            throw new IllegalArgumentException("Invalid function code for reading bit: " + functionCode);
+//        }
+//
+//        byte[] request = buildReadRequest(functionCode, parsedAddress.getAddress(), 1);
+//        byte[] response = sendRequest(request);
+//
+//        if (response[8] == 0x01) { // 1瀛楄妭鏁版嵁
+//            return (response[9] & (1 << parsedAddress.getBit())) != 0;
+//        }
+//
+//        throw new IOException("Unexpected response format for reading bit");
+//    }
+//
+//    @Override
+//    public void writeBit(String address, boolean value) throws IOException {
+//        ProtocolAddress parsedAddress = addressParser.parse(address);
+//        int functionCode = 5; // 鍐欏崟涓嚎鍦�
+//
+//        byte[] request = new byte[12];
+//        request[0] = (byte) (transactionId >> 8);    // 浜嬪姟鏍囪瘑绗﹂珮瀛楄妭
+//        request[1] = (byte) transactionId++;         // 浜嬪姟鏍囪瘑绗︿綆瀛楄妭
+//        request[2] = 0;                            // 鍗忚鏍囪瘑绗﹂珮瀛楄妭 (0)
+//        request[3] = 0;                            // 鍗忚鏍囪瘑绗︿綆瀛楄妭 (0)
+//        request[4] = 0;                            // 闀垮害楂樺瓧鑺�
+//        request[5] = 6;                            // 闀垮害浣庡瓧鑺� (6)
+//        request[6] = (byte) unitId;                // 鍗曞厓鏍囪瘑绗�
+//        request[7] = (byte) functionCode;          // 鍔熻兘鐮�
+//        request[8] = (byte) (parsedAddress.getAddress() >> 8); // 鍦板潃楂樺瓧鑺�
+//        request[9] = (byte) parsedAddress.getAddress();        // 鍦板潃浣庡瓧鑺�
+//        request[10] = value ? (byte) 0xFF : 0;     // 鍊� (0xFF00 = ON, 0x0000 = OFF)
+//        request[11] = 0;                           // 鍊间綆瀛楄妭
+//
+//        byte[] response = sendRequest(request);
+//
+//        // 楠岃瘉鍝嶅簲
+//        if (response[7] != functionCode) {
+//            throw new IOException("Modbus exception: " + (response[7] & 0xFF));
+//        }
+//    }
+    
+    @Override
+    public int readRegister(String address) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        int functionCode = parsedAddress.getFunctionCode();
+        if (functionCode != 3 && functionCode != 4) {
+            throw new IllegalArgumentException("Invalid function code for reading register: " + functionCode);
+        }
+        
+        byte[] request = buildReadRequest(functionCode, parsedAddress.getAddress(), 1);
+        byte[] response = sendRequest(request);
+        
+        if (response[8] == 0x02) { // 2瀛楄妭鏁版嵁
+            return ((response[9] & 0xFF) << 8) | (response[10] & 0xFF);
+        }
+        
+        throw new IOException("Unexpected response format for reading register");
+    }
+    
+    @Override
+    public void writeRegister(String address, int value) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        int functionCode = 6; // 鍐欏崟涓瘎瀛樺櫒
+        
+        byte[] request = new byte[12];
+        request[0] = (byte) (transactionId >> 8);    // 浜嬪姟鏍囪瘑绗﹂珮瀛楄妭
+        request[1] = (byte) transactionId++;         // 浜嬪姟鏍囪瘑绗︿綆瀛楄妭
+        request[2] = 0;                            // 鍗忚鏍囪瘑绗﹂珮瀛楄妭 (0)
+        request[3] = 0;                            // 鍗忚鏍囪瘑绗︿綆瀛楄妭 (0)
+        request[4] = 0;                            // 闀垮害楂樺瓧鑺�
+        request[5] = 6;                            // 闀垮害浣庡瓧鑺� (6)
+        request[6] = (byte) unitId;                // 鍗曞厓鏍囪瘑绗�
+        request[7] = (byte) functionCode;          // 鍔熻兘鐮�
+        request[8] = (byte) (parsedAddress.getAddress() >> 8); // 鍦板潃楂樺瓧鑺�
+        request[9] = (byte) parsedAddress.getAddress();        // 鍦板潃浣庡瓧鑺�
+        request[10] = (byte) (value >> 8);         // 鍊奸珮瀛楄妭
+        request[11] = (byte) value;                // 鍊间綆瀛楄妭
+        
+        byte[] response = sendRequest(request);
+        
+        // 楠岃瘉鍝嶅簲
+        if (response[7] != functionCode) {
+            throw new IOException("Modbus exception: " + (response[7] & 0xFF));
+        }
+    }
+    
+    @Override
+    public int[] readRegisters(String address, int quantity) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        int functionCode = parsedAddress.getFunctionCode();
+        if (functionCode != 3 && functionCode != 4) {
+            throw new IllegalArgumentException("Invalid function code for reading registers: " + functionCode);
+        }
+        
+        byte[] request = buildReadRequest(functionCode, parsedAddress.getAddress(), quantity);
+        byte[] response = sendRequest(request);
+        
+        int byteCount = response[8] & 0xFF;
+        int[] result = new int[byteCount / 2];
+        
+        for (int i = 0; i < result.length; i++) {
+            int index = 9 + i * 2;
+            result[i] = ((response[index] & 0xFF) << 8) | (response[index + 1] & 0xFF);
+        }
+        
+        return result;
+    }
+    
+    @Override
+    public void writeRegisters(String address, int[] values) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        int functionCode = 16; // 鍐欏涓瘎瀛樺櫒
+        
+        int byteCount = values.length * 2;
+        int requestLength = 9 + byteCount;
+        byte[] request = new byte[requestLength];
+        
+        request[0] = (byte) (transactionId >> 8);    // 浜嬪姟鏍囪瘑绗﹂珮瀛楄妭
+        request[1] = (byte) transactionId++;         // 浜嬪姟鏍囪瘑绗︿綆瀛楄妭
+        request[2] = 0;                            // 鍗忚鏍囪瘑绗﹂珮瀛楄妭 (0)
+        request[3] = 0;                            // 鍗忚鏍囪瘑绗︿綆瀛楄妭 (0)
+        request[4] = (byte) ((requestLength - 6) >> 8); // 闀垮害楂樺瓧鑺�
+        request[5] = (byte) (requestLength - 6);         // 闀垮害浣庡瓧鑺�
+        request[6] = (byte) unitId;                // 鍗曞厓鏍囪瘑绗�
+        request[7] = (byte) functionCode;          // 鍔熻兘鐮�
+        request[8] = (byte) (parsedAddress.getAddress() >> 8); // 鍦板潃楂樺瓧鑺�
+        request[9] = (byte) parsedAddress.getAddress();        // 鍦板潃浣庡瓧鑺�
+        request[10] = (byte) (values.length >> 8);  // 瀵勫瓨鍣ㄦ暟閲忛珮瀛楄妭
+        request[11] = (byte) values.length;         // 瀵勫瓨鍣ㄦ暟閲忎綆瀛楄妭
+        request[12] = (byte) byteCount;             // 瀛楄妭鏁�
+        
+        // 濉厖瀵勫瓨鍣ㄥ��
+        for (int i = 0; i < values.length; i++) {
+            int index = 13 + i * 2;
+            request[index] = (byte) (values[i] >> 8);     // 鍊奸珮瀛楄妭
+            request[index + 1] = (byte) values[i];        // 鍊间綆瀛楄妭
+        }
+        
+        byte[] response = sendRequest(request);
+        
+        // 楠岃瘉鍝嶅簲
+        if (response[7] != functionCode) {
+            throw new IOException("Modbus exception: " + (response[7] & 0xFF));
+        }
+    }
+    
+    @Override
+    public float readFloat(String address) throws IOException {
+        int[] registers = readRegisters(address, 2);
+        int intBits = (registers[0] << 16) | registers[1];
+        return Float.intBitsToFloat(intBits);
+    }
+    
+    @Override
+    public void writeFloat(String address, float value) throws IOException {
+        int intBits = Float.floatToIntBits(value);
+        int highWord = (intBits >> 16) & 0xFFFF;
+        int lowWord = intBits & 0xFFFF;
+        writeRegisters(address, new int[]{highWord, lowWord});
+    }
+    
+    @Override
+    public String readString(String address, int length) throws IOException {
+        int[] registers = readRegisters(address, (length + 1) / 2);
+        byte[] bytes = new byte[registers.length * 2];
+        
+        for (int i = 0; i < registers.length; i++) {
+            bytes[i * 2] = (byte) ((registers[i] >> 8) & 0xFF);
+            bytes[i * 2 + 1] = (byte) (registers[i] & 0xFF);
+        }
+        
+        return new String(bytes, 0, length);
+    }
+    
+    @Override
+    public void writeString(String address, String value) throws IOException {
+        byte[] bytes = value.getBytes();
+        int[] registers = new int[(bytes.length + 1) / 2];
+        
+        for (int i = 0; i < bytes.length; i++) {
+            int regIndex = i / 2;
+            int byteIndex = i % 2;
+            
+            if (byteIndex == 0) {
+                registers[regIndex] = (bytes[i] & 0xFF) << 8;
+            } else {
+                registers[regIndex] |= (bytes[i] & 0xFF);
+            }
+        }
+        
+        writeRegisters(address, registers);
+    }
+    
+    @Override
+    public void close() throws IOException {
+        disconnect();
+    }
+    
+    private byte[] buildReadRequest(int functionCode, int address, int quantity) {
+        byte[] request = new byte[12];
+        request[0] = (byte) (transactionId >> 8);    // 浜嬪姟鏍囪瘑绗﹂珮瀛楄妭
+        request[1] = (byte) transactionId++;         // 浜嬪姟鏍囪瘑绗︿綆瀛楄妭
+        request[2] = 0;                            // 鍗忚鏍囪瘑绗﹂珮瀛楄妭 (0)
+        request[3] = 0;                            // 鍗忚鏍囪瘑绗︿綆瀛楄妭 (0)
+        request[4] = 0;                            // 闀垮害楂樺瓧鑺�
+        request[5] = 6;                            // 闀垮害浣庡瓧鑺� (6)
+        request[6] = (byte) unitId;                // 鍗曞厓鏍囪瘑绗�
+        request[7] = (byte) functionCode;          // 鍔熻兘鐮�
+        request[8] = (byte) (address >> 8);        // 鍦板潃楂樺瓧鑺�
+        request[9] = (byte) address;               // 鍦板潃浣庡瓧鑺�
+        request[10] = (byte) (quantity >> 8);      // 鏁伴噺楂樺瓧鑺�
+        request[11] = (byte) quantity;             // 鏁伴噺浣庡瓧鑺�
+        
+        return request;
+    }
+    
+    private byte[] sendRequest(byte[] request) throws IOException {
+        if (!isConnected()) {
+            connect();
+        }
+        
+        // 鍙戦�佽姹�
+        outputStream.write(request);
+        outputStream.flush();
+        
+        // 鎺ユ敹鍝嶅簲
+        byte[] header = new byte[6];
+        int bytesRead = 0;
+        
+        // 璇诲彇澶撮儴
+        while (bytesRead < 6) {
+            int count = inputStream.read(header, bytesRead, 6 - bytesRead);
+            if (count == -1) {
+                throw new IOException("Connection closed while reading response header");
+            }
+            bytesRead += count;
+        }
+        
+        int length = ((header[4] & 0xFF) << 8) | (header[5] & 0xFF);
+        byte[] response = new byte[6 + length];
+        
+        // 澶嶅埗澶撮儴
+        System.arraycopy(header, 0, response, 0, 6);
+        
+        // 璇诲彇鍓╀綑閮ㄥ垎
+        bytesRead = 0;
+        while (bytesRead < length) {
+            int count = inputStream.read(response, 6 + bytesRead, length - bytesRead);
+            if (count == -1) {
+                throw new IOException("Connection closed while reading response body");
+            }
+            bytesRead += count;
+        }
+        // 妫�鏌ヤ簨鍔℃爣璇嗙
+        if ((response[0] & 0xFF) != (request[0] & 0xFF) || (response[1] & 0xFF) != (request[1] & 0xFF)) {
+            logger.warning("Transaction ID mismatch in response - expected: " +
+                    ((request[0] & 0xFF) << 8 | (request[1] & 0xFF)) +
+                    ", got: " + ((response[0] & 0xFF) << 8 | (response[1] & 0xFF)));
+            // 铏界劧浜嬪姟ID涓嶅尮閰嶏紝浣嗗彲鑳芥槸涔嬪墠璇锋眰鐨勫搷搴旓紝閫夋嫨缁х画澶勭悊鑰屼笉鏄姏鍑哄紓甯�
+        }
+        
+        // 妫�鏌ュ姛鑳界爜锛堝鏋滄湁寮傚父锛屽姛鑳界爜浼氭槸0x80 + 鍘熷姛鑳界爜锛�
+        if ((response[7] & 0xFF) > 0x80) {
+            int exceptionCode = response[8] & 0xFF;
+            throw new IOException("Modbus exception: " + exceptionCode);
+        }
+        
+        return response;
+    }
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/modbus/ModbusTcpServer.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/modbus/ModbusTcpServer.java
new file mode 100644
index 0000000..fb5dd35
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/modbus/ModbusTcpServer.java
@@ -0,0 +1,419 @@
+package com.mes.connect.modbus;
+
+import com.mes.connect.IndustrialInterface.AddressParser;
+import com.mes.connect.IndustrialInterface.IndustrialDataHandler;
+import com.mes.connect.IndustrialInterface.IndustrialServer;
+import com.mes.connect.addressParser.ModbusAddressParser;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.logging.Logger;
+
+/**
+ * Modbus TCP鏈嶅姟鍣ㄥ疄鐜�
+ */
+public class ModbusTcpServer implements IndustrialServer {
+    private static final Logger logger = Logger.getLogger(ModbusTcpServer.class.getName());
+    private ServerSocket serverSocket;
+    private Thread serverThread;
+    private boolean running;
+    private IndustrialDataHandler handler;
+    private final int port;
+    private final ExecutorService threadPool = Executors.newFixedThreadPool(10);
+    private final AddressParser addressParser = new ModbusAddressParser();
+    
+    public ModbusTcpServer(int port) {
+        this.port = port;
+    }
+    
+    @Override
+    public synchronized void start() throws IOException {
+        if (!running) {
+            serverSocket = new ServerSocket(port);
+            serverThread = new Thread(this::serverLoop);
+            serverThread.setDaemon(true);
+            serverThread.start();
+            running = true;
+            logger.info("Modbus TCP server started on port " + port);
+        }
+    }
+    
+    @Override
+    public synchronized void stop() {
+        if (running) {
+            running = false;
+            try {
+                if (serverSocket != null) {
+                    serverSocket.close();
+                }
+                if (serverThread != null) {
+                    serverThread.interrupt();
+                    serverThread.join(1000);
+                }
+                threadPool.shutdownNow();
+            } catch (IOException | InterruptedException e) {
+                logger.warning("Error stopping Modbus TCP server: " + e.getMessage());
+            } finally {
+                serverSocket = null;
+                serverThread = null;
+                logger.info("Modbus TCP server stopped");
+            }
+        }
+    }
+    
+    @Override
+    public boolean isRunning() {
+        return running;
+    }
+    
+    @Override
+    public void setDataHandler(IndustrialDataHandler handler) {
+        this.handler = handler;
+    }
+    
+    @Override
+    public void close() throws IOException {
+        stop();
+    }
+    
+    private void serverLoop() {
+        while (running) {
+            try {
+                Socket clientSocket = serverSocket.accept();
+                threadPool.submit(() -> handleClient(clientSocket));
+            } catch (IOException e) {
+                if (running) {
+                    logger.warning("Error accepting client connection: " + e.getMessage());
+                }
+            }
+        }
+    }
+    
+    private void handleClient(Socket clientSocket) {
+        try (DataInputStream input = new DataInputStream(clientSocket.getInputStream());
+             DataOutputStream output = new DataOutputStream(clientSocket.getOutputStream())) {
+            
+            byte[] request = readRequest(input);
+            byte[] response = processRequest(request);
+            output.write(response);
+            
+        } catch (IOException e) {
+            logger.warning("Error handling client: " + e.getMessage());
+        }
+    }
+    
+    private byte[] readRequest(DataInputStream input) throws IOException {
+        // 璇诲彇Modbus TCP璇锋眰
+        byte[] header = new byte[6];
+        int bytesRead = 0;
+        
+        // 璇诲彇澶撮儴
+        while (bytesRead < 6) {
+            int count = input.read(header, bytesRead, 6 - bytesRead);
+            if (count == -1) {
+                throw new IOException("Connection closed while reading request header");
+            }
+            bytesRead += count;
+        }
+        
+        int length = ((header[4] & 0xFF) << 8) | (header[5] & 0xFF);
+        byte[] request = new byte[6 + length];
+        
+        // 澶嶅埗澶撮儴
+        System.arraycopy(header, 0, request, 0, 6);
+        
+        // 璇诲彇鍓╀綑閮ㄥ垎
+        bytesRead = 0;
+        while (bytesRead < length) {
+            int count = input.read(request, 6 + bytesRead, length - bytesRead);
+            if (count == -1) {
+                throw new IOException("Connection closed while reading request body");
+            }
+            bytesRead += count;
+        }
+        
+        return request;
+    }
+    
+    private byte[] processRequest(byte[] request) {
+        int transactionId = ((request[0] & 0xFF) << 8) | (request[1] & 0xFF);
+        int unitId = request[6] & 0xFF;
+        int functionCode = request[7] & 0xFF;
+        
+        try {
+            switch (functionCode) {
+                case 1: // 璇荤嚎鍦�
+                    return handleReadCoils(request, transactionId, unitId);
+                case 2: // 璇荤鏁h緭鍏�
+                    return handleReadDiscreteInputs(request, transactionId, unitId);
+                case 3: // 璇讳繚鎸佸瘎瀛樺櫒
+                    return handleReadHoldingRegisters(request, transactionId, unitId);
+                case 4: // 璇昏緭鍏ュ瘎瀛樺櫒
+                    return handleReadInputRegisters(request, transactionId, unitId);
+                case 5: // 鍐欏崟涓嚎鍦�
+                    return handleWriteSingleCoil(request, transactionId, unitId);
+                case 6: // 鍐欏崟涓瘎瀛樺櫒
+                    return handleWriteSingleRegister(request, transactionId, unitId);
+                case 15: // 鍐欏涓嚎鍦�
+                    return handleWriteMultipleCoils(request, transactionId, unitId);
+                case 16: // 鍐欏涓瘎瀛樺櫒
+                    return handleWriteMultipleRegisters(request, transactionId, unitId);
+                default:
+                    return buildExceptionResponse(transactionId, unitId, functionCode, 1); // 涓嶆敮鎸佺殑鍔熻兘鐮�
+            }
+        } catch (Exception e) {
+            logger.warning("Error processing request: " + e.getMessage());
+            return buildExceptionResponse(transactionId, unitId, functionCode, 4); // 鏈嶅姟鍣ㄨ澶囨晠闅�
+        }
+    }
+    
+    private byte[] handleReadCoils(byte[] request, int transactionId, int unitId) {
+        int address = ((request[8] & 0xFF) << 8) | (request[9] & 0xFF);
+        int quantity = ((request[10] & 0xFF) << 8) | (request[11] & 0xFF);
+        
+        if (quantity > 2000) {
+            return buildExceptionResponse(transactionId, unitId, 1, 3); // 璇锋眰鏁伴噺杩囧ぇ
+        }
+        
+        byte[] response = new byte[9 + (quantity + 7) / 8];
+        response[0] = (byte) (transactionId >> 8);
+        response[1] = (byte) transactionId;
+        response[2] = 0; // 鍗忚鏍囪瘑绗﹂珮瀛楄妭
+        response[3] = 0; // 鍗忚鏍囪瘑绗︿綆瀛楄妭
+        response[4] = 0; // 闀垮害楂樺瓧鑺�
+        response[5] = (byte) (response.length - 6); // 闀垮害浣庡瓧鑺�
+        response[6] = (byte) unitId;
+        response[7] = 1; // 鍔熻兘鐮�
+        response[8] = (byte) ((quantity + 7) / 8); // 瀛楄妭鏁�
+        
+        // 濉厖绾垮湀鏁版嵁
+        for (int i = 0; i < quantity; i++) {
+            String addressStr = String.format("MB.0x%04d.%d", address + i, 0);
+            boolean value = handler.handleReadBit(addressStr);
+            int byteIndex = 9 + i / 8;
+            int bitIndex = i % 8;
+            if (value) {
+                response[byteIndex] |= (1 << bitIndex);
+            }
+        }
+        
+        return response;
+    }
+    
+    private byte[] handleReadDiscreteInputs(byte[] request, int transactionId, int unitId) {
+        int address = ((request[8] & 0xFF) << 8) | (request[9] & 0xFF);
+        int quantity = ((request[10] & 0xFF) << 8) | (request[11] & 0xFF);
+        
+        if (quantity > 2000) {
+            return buildExceptionResponse(transactionId, unitId, 2, 3); // 璇锋眰鏁伴噺杩囧ぇ
+        }
+        
+        byte[] response = new byte[9 + (quantity + 7) / 8];
+        response[0] = (byte) (transactionId >> 8);
+        response[1] = (byte) transactionId;
+        response[2] = 0; // 鍗忚鏍囪瘑绗﹂珮瀛楄妭
+        response[3] = 0; // 鍗忚鏍囪瘑绗︿綆瀛楄妭
+        response[4] = 0; // 闀垮害楂樺瓧鑺�
+        response[5] = (byte) (response.length - 6); // 闀垮害浣庡瓧鑺�
+        response[6] = (byte) unitId;
+        response[7] = 2; // 鍔熻兘鐮�
+        response[8] = (byte) ((quantity + 7) / 8); // 瀛楄妭鏁�
+        
+        // 濉厖绂绘暎杈撳叆鏁版嵁
+        for (int i = 0; i < quantity; i++) {
+            String addressStr = String.format("MB.1x%04d.%d", address + i, 0);
+            boolean value = handler.handleReadBit(addressStr);
+            int byteIndex = 9 + i / 8;
+            int bitIndex = i % 8;
+            if (value) {
+                response[byteIndex] |= (1 << bitIndex);
+            }
+        }
+        
+        return response;
+    }
+    
+    private byte[] handleReadHoldingRegisters(byte[] request, int transactionId, int unitId) {
+        int address = ((request[8] & 0xFF) << 8) | (request[9] & 0xFF);
+        int quantity = ((request[10] & 0xFF) << 8) | (request[11] & 0xFF);
+        
+        if (quantity > 125) {
+            return buildExceptionResponse(transactionId, unitId, 3, 3); // 璇锋眰鏁伴噺杩囧ぇ
+        }
+        
+        byte[] response = new byte[9 + quantity * 2];
+        response[0] = (byte) (transactionId >> 8);
+        response[1] = (byte) transactionId;
+        response[2] = 0; // 鍗忚鏍囪瘑绗﹂珮瀛楄妭
+        response[3] = 0; // 鍗忚鏍囪瘑绗︿綆瀛楄妭
+        response[4] = 0; // 闀垮害楂樺瓧鑺�
+        response[5] = (byte) (response.length - 6); // 闀垮害浣庡瓧鑺�
+        response[6] = (byte) unitId;
+        response[7] = 3; // 鍔熻兘鐮�
+        response[8] = (byte) (quantity * 2); // 瀛楄妭鏁�
+        
+        // 濉厖淇濇寔瀵勫瓨鍣ㄦ暟鎹�
+        for (int i = 0; i < quantity; i++) {
+            String addressStr = String.format("MB.4x%04d", address + i);
+            int value = handler.handleReadRegister(addressStr);
+            int byteIndex = 9 + i * 2;
+            response[byteIndex] = (byte) (value >> 8);
+            response[byteIndex + 1] = (byte) value;
+        }
+        
+        return response;
+    }
+    
+    private byte[] handleReadInputRegisters(byte[] request, int transactionId, int unitId) {
+        int address = ((request[8] & 0xFF) << 8) | (request[9] & 0xFF);
+        int quantity = ((request[10] & 0xFF) << 8) | (request[11] & 0xFF);
+        
+        if (quantity > 125) {
+            return buildExceptionResponse(transactionId, unitId, 4, 3); // 璇锋眰鏁伴噺杩囧ぇ
+        }
+        
+        byte[] response = new byte[9 + quantity * 2];
+        response[0] = (byte) (transactionId >> 8);
+        response[1] = (byte) transactionId;
+        response[2] = 0; // 鍗忚鏍囪瘑绗﹂珮瀛楄妭
+        response[3] = 0; // 鍗忚鏍囪瘑绗︿綆瀛楄妭
+        response[4] = 0; // 闀垮害楂樺瓧鑺�
+        response[5] = (byte) (response.length - 6); // 闀垮害浣庡瓧鑺�
+        response[6] = (byte) unitId;
+        response[7] = 4; // 鍔熻兘鐮�
+        response[8] = (byte) (quantity * 2); // 瀛楄妭鏁�
+        
+        // 濉厖杈撳叆瀵勫瓨鍣ㄦ暟鎹�
+        for (int i = 0; i < quantity; i++) {
+            String addressStr = String.format("MB.3x%04d", address + i);
+            int value = handler.handleReadRegister(addressStr);
+            int byteIndex = 9 + i * 2;
+            response[byteIndex] = (byte) (value >> 8);
+            response[byteIndex + 1] = (byte) value;
+        }
+        
+        return response;
+    }
+    
+    private byte[] handleWriteSingleCoil(byte[] request, int transactionId, int unitId) {
+        int address = ((request[8] & 0xFF) << 8) | (request[9] & 0xFF);
+        int value = ((request[10] & 0xFF) << 8) | (request[11] & 0xFF);
+        
+        boolean coilValue = (value == 0xFF00);
+        String addressStr = String.format("MB.0x%04d.%d", address, 0);
+        
+        handler.handleWriteBit(addressStr, coilValue);
+        
+        // 杩斿洖涓庤姹傜浉鍚岀殑鏁版嵁浣滀负纭
+        byte[] response = new byte[12];
+        System.arraycopy(request, 0, response, 0, 12);
+        return response;
+    }
+    
+    private byte[] handleWriteSingleRegister(byte[] request, int transactionId, int unitId) {
+        int address = ((request[8] & 0xFF) << 8) | (request[9] & 0xFF);
+        int value = ((request[10] & 0xFF) << 8) | (request[11] & 0xFF);
+        
+        String addressStr = String.format("MB.4x%04d", address);
+        handler.handleWriteRegister(addressStr, value);
+        
+        // 杩斿洖涓庤姹傜浉鍚岀殑鏁版嵁浣滀负纭
+        byte[] response = new byte[12];
+        System.arraycopy(request, 0, response, 0, 12);
+        return response;
+    }
+    
+    private byte[] handleWriteMultipleCoils(byte[] request, int transactionId, int unitId) {
+        int address = ((request[8] & 0xFF) << 8) | (request[9] & 0xFF);
+        int quantity = ((request[10] & 0xFF) << 8) | (request[11] & 0xFF);
+        int byteCount = request[12] & 0xFF;
+        
+        if (quantity > 1968) {
+            return buildExceptionResponse(transactionId, unitId, 15, 3); // 璇锋眰鏁伴噺杩囧ぇ
+        }
+        
+        // 澶勭悊绾垮湀鍊�
+        for (int i = 0; i < quantity; i++) {
+            int byteIndex = 13 + i / 8;
+            int bitIndex = i % 8;
+            boolean value = ((request[byteIndex] & (1 << bitIndex)) != 0);
+            String addressStr = String.format("MB.0x%04d.%d", address + i, 0);
+            handler.handleWriteBit(addressStr, value);
+        }
+        
+        // 鏋勫缓鍝嶅簲
+        byte[] response = new byte[12];
+        response[0] = (byte) (transactionId >> 8);
+        response[1] = (byte) transactionId;
+        response[2] = 0; // 鍗忚鏍囪瘑绗﹂珮瀛楄妭
+        response[3] = 0; // 鍗忚鏍囪瘑绗︿綆瀛楄妭
+        response[4] = 0; // 闀垮害楂樺瓧鑺�
+        response[5] = 6; // 闀垮害浣庡瓧鑺�
+        response[6] = (byte) unitId;
+        response[7] = 15; // 鍔熻兘鐮�
+        response[8] = (byte) (address >> 8); // 璧峰鍦板潃楂樺瓧鑺�
+        response[9] = (byte) address; // 璧峰鍦板潃浣庡瓧鑺�
+        response[10] = (byte) (quantity >> 8); // 鏁伴噺楂樺瓧鑺�
+        response[11] = (byte) quantity; // 鏁伴噺浣庡瓧鑺�
+        
+        return response;
+    }
+    
+    private byte[] handleWriteMultipleRegisters(byte[] request, int transactionId, int unitId) {
+        int address = ((request[8] & 0xFF) << 8) | (request[9] & 0xFF);
+        int quantity = ((request[10] & 0xFF) << 8) | (request[11] & 0xFF);
+        int byteCount = request[12] & 0xFF;
+        
+        if (quantity > 123) {
+            return buildExceptionResponse(transactionId, unitId, 16, 3); // 璇锋眰鏁伴噺杩囧ぇ
+        }
+        
+        int[] values = new int[quantity];
+        
+        // 瑙f瀽瀵勫瓨鍣ㄥ��
+        for (int i = 0; i < quantity; i++) {
+            int byteIndex = 13 + i * 2;
+            values[i] = ((request[byteIndex] & 0xFF) << 8) | (request[byteIndex + 1] & 0xFF);
+        }
+        
+        // 澶勭悊鍐欏叆璇锋眰
+        String addressStr = String.format("MB.4x%04d", address);
+        handler.handleWriteRegisters(addressStr, values);
+        
+        // 鏋勫缓鍝嶅簲
+        byte[] response = new byte[12];
+        response[0] = (byte) (transactionId >> 8);
+        response[1] = (byte) transactionId;
+        response[2] = 0; // 鍗忚鏍囪瘑绗﹂珮瀛楄妭
+        response[3] = 0; // 鍗忚鏍囪瘑绗︿綆瀛楄妭
+        response[4] = 0; // 闀垮害楂樺瓧鑺�
+        response[5] = 6; // 闀垮害浣庡瓧鑺�
+        response[6] = (byte) unitId;
+        response[7] = 16; // 鍔熻兘鐮�
+        response[8] = (byte) (address >> 8); // 璧峰鍦板潃楂樺瓧鑺�
+        response[9] = (byte) address; // 璧峰鍦板潃浣庡瓧鑺�
+        response[10] = (byte) (quantity >> 8); // 鏁伴噺楂樺瓧鑺�
+        response[11] = (byte) quantity; // 鏁伴噺浣庡瓧鑺�
+        
+        return response;
+    }
+    
+    private byte[] buildExceptionResponse(int transactionId, int unitId, int functionCode, int exceptionCode) {
+        byte[] response = new byte[9];
+        response[0] = (byte) (transactionId >> 8);
+        response[1] = (byte) transactionId;
+        response[2] = 0; // 鍗忚鏍囪瘑绗﹂珮瀛楄妭
+        response[3] = 0; // 鍗忚鏍囪瘑绗︿綆瀛楄妭
+        response[4] = 0; // 闀垮害楂樺瓧鑺�
+        response[5] = 3; // 闀垮害浣庡瓧鑺�
+        response[6] = (byte) unitId;
+        response[7] = (byte) (functionCode + 0x80); // 寮傚父鍔熻兘鐮�
+        response[8] = (byte) exceptionCode; // 寮傚父鐮�
+        return response;
+    }
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/protocol/ProtocolAddress.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/protocol/ProtocolAddress.java
new file mode 100644
index 0000000..38fe241
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/protocol/ProtocolAddress.java
@@ -0,0 +1,38 @@
+package com.mes.connect.protocol;
+
+/**
+ * 鍗忚鍦板潃绫�
+ */
+public class ProtocolAddress {
+    private final ProtocolType protocol;
+    private final int functionCode;
+    private final int dbNumber;
+    private final int address;
+    private final int bit;
+    
+    public ProtocolAddress(ProtocolType protocol, int functionCode, int dbNumber, int address, int bit) {
+        this.protocol = protocol;
+        this.functionCode = functionCode;
+        this.dbNumber = dbNumber;
+        this.address = address;
+        this.bit = bit;
+    }
+    
+    // Getters
+    public ProtocolType getProtocol() { return protocol; }
+    public int getFunctionCode() { return functionCode; }
+    public int getDbNumber() { return dbNumber; }
+    public int getAddress() { return address; }
+    public int getBit() { return bit; }
+    
+    @Override
+    public String toString() {
+        return "ProtocolAddress{" +
+                "protocol=" + protocol +
+                ", functionCode=" + functionCode +
+                ", dbNumber=" + dbNumber +
+                ", address=" + address +
+                ", bit=" + bit +
+                '}';
+    }
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/protocol/ProtocolType.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/protocol/ProtocolType.java
new file mode 100644
index 0000000..b3bee6f
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/protocol/ProtocolType.java
@@ -0,0 +1,8 @@
+package com.mes.connect.protocol;
+
+/**
+ * 鍗忚绫诲瀷鏋氫妇
+ */
+public enum ProtocolType {
+    S7, MODBUS_TCP, MODBUS_IP, MODBUS_RTU
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/s7/S7Client.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/s7/S7Client.java
new file mode 100644
index 0000000..cfe767a
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/s7/S7Client.java
@@ -0,0 +1,615 @@
+package com.mes.connect.s7;
+
+import com.mes.connect.IndustrialInterface.AddressParser;
+import com.mes.connect.IndustrialInterface.IndustrialClient;
+import com.mes.connect.addressParser.S7AddressParser;
+import com.mes.connect.protocol.ProtocolAddress;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.Socket;
+import java.util.Random;
+import java.util.logging.Logger;
+
+/**
+ * S7鍗忚瀹㈡埛绔疄鐜�
+ */
+public class S7Client implements IndustrialClient {
+    private static final Logger logger = Logger.getLogger(S7Client.class.getName());
+    private Socket socket;
+    private DataInputStream inputStream;
+    private DataOutputStream outputStream;
+    private final String host;
+    private final int port;
+    private final int rack;
+    private final int slot;
+    private boolean connected;
+    private int pduSize = 480;
+    private int jobId = new Random().nextInt(0xFFFF);
+    private final AddressParser addressParser = new S7AddressParser();
+    
+    public S7Client(String host, int port, int rack, int slot) {
+        this.host = host;
+        this.port = port;
+        this.rack = rack;
+        this.slot = slot;
+    }
+    
+    @Override
+    public synchronized void connect() throws IOException {
+        if (!connected) {
+            socket = new Socket(host, port);
+            socket.setSoTimeout(5000); // 5绉掕秴鏃�
+            inputStream = new DataInputStream(socket.getInputStream());
+            outputStream = new DataOutputStream(socket.getOutputStream());
+            
+            // 寤虹珛COTP杩炴帴
+            if (!establishCotpConnection()) {
+                disconnect();
+                throw new IOException("Failed to establish COTP connection");
+            }
+
+            // 寤虹珛ISO杩炴帴
+            if (!establishIsoConnection()) {
+                disconnect();
+                throw new IOException("Failed to establish ISO connection");
+            }
+            
+            // 寤虹珛S7杩炴帴
+            if (!establishS7Connection()) {
+                disconnect();
+                throw new IOException("Failed to establish S7 connection");
+            }
+            
+            connected = true;
+            logger.info("Connected to S7 server: " + host + ":" + port);
+        }
+    }
+    private boolean establishCotpConnection() throws IOException {
+        // 鎵撳嵃璋冭瘯淇℃伅
+        logger.info("Attempting to establish COTP connection");
+
+        // 鏋勯�燙OTP杩炴帴璇锋眰鍖�(CR)
+        byte[] request = new byte[11];
+        request[0] = 0x02;          // 鍖呴暱搴�(鍥哄畾涓�2瀛楄妭)
+        request[1] = (byte) 0xE0;   // COTP TPDU绫诲瀷: CR(杩炴帴璇锋眰)
+        request[2] = 0x00;          // 鐩爣鍙傝�冨彿(楂樺瓧鑺�)
+        request[3] = 0x01;          // 鐩爣鍙傝�冨彿(浣庡瓧鑺�)
+        request[4] = 0x00;          // 婧愬弬鑰冨彿(楂樺瓧鑺�)
+        request[5] = 0x00;          // 婧愬弬鑰冨彿(浣庡瓧鑺�)
+        request[6] = 0x00;          // 绫�/閫夐」
+        request[7] = (byte) 0xC0;   // 鍙傛暟浠g爜: TPDU-size
+        request[8] = 0x01;          // 鍙傛暟闀垮害
+        request[9] = 0x14;          // TPDU-size(20瀛楄妭锛岄儴鍒哖LC瑕佹眰姝ゅ��)
+        request[10] = 0x00;         // 鍙傛暟缁撴潫鏍囪
+
+        // 鍙戦�丆OTP璇锋眰
+        outputStream.write(request);
+        outputStream.flush();
+
+        // 鎵撳嵃鍙戦�佺殑璇锋眰鍖�(16杩涘埗)
+        logger.info("Sent COTP CR: " + bytesToHex(request));
+
+        // 璇诲彇鍝嶅簲鍖�
+        byte[] response = new byte[256];
+        int bytesRead = 0;
+        try {
+            // 澧炲姞璇诲彇瓒呮椂澶勭悊
+            socket.setSoTimeout(2000); // 寤堕暱璇诲彇瓒呮椂涓�2绉�
+            bytesRead = inputStream.read(response);
+        } catch (IOException e) {
+            logger.warning("COTP response read timeout: " + e.getMessage());
+            return false;
+        } finally {
+            socket.setSoTimeout(5000); // 鎭㈠榛樿瓒呮椂
+        }
+
+        // 鎵撳嵃鎺ユ敹鐨勫搷搴斿寘(16杩涘埗)
+        if (bytesRead > 0) {
+            logger.info("Received COTP response, bytesRead: " + bytesRead);
+            logger.info("COTP response: " + bytesToHex(response, bytesRead));
+        } else {
+            logger.warning("COTP response is empty");
+            return false;
+        }
+
+        // 澧炲己鍝嶅簲楠岃瘉閫昏緫
+        if (bytesRead >= 6) {
+            byte tpduType = response[1];
+            // 鍏佽CC(0xD0)鎴朎R(0xF0)鍝嶅簲锛屼究浜庤皟璇�
+            if (tpduType == 0xD0) { // CC: 杩炴帴纭
+                logger.info("COTP connection established successfully");
+                return true;
+            } else if (tpduType == 0xF0) { // ER: 杩炴帴鎷掔粷
+                logger.warning("COTP connection rejected");
+                if (bytesRead >= 8) {
+                    logger.warning("COTP error code: 0x" +
+                            String.format("%02X", response[7]));
+                }
+            } else {
+                logger.warning("Unexpected COTP TPDU type: 0x" +
+                        String.format("%02X", tpduType));
+            }
+        } else {
+            logger.warning("Invalid COTP response length: " + bytesRead);
+        }
+
+        return false;
+    }
+
+    // 杈呭姪鏂规硶锛氬瓧鑺傛暟缁勮浆16杩涘埗瀛楃涓�
+    private String bytesToHex(byte[] bytes) {
+        return bytesToHex(bytes, bytes.length);
+    }
+
+    private String bytesToHex(byte[] bytes, int length) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < length; i++) {
+            sb.append(String.format("%02X ", bytes[i]));
+            if (i % 16 == 15) sb.append("\n"); // 姣�16瀛楄妭鎹㈣
+        }
+        return sb.toString();
+    }
+    @Override
+    public synchronized void disconnect() {
+        if (connected) {
+            try {
+                if (outputStream != null) outputStream.close();
+                if (inputStream != null) inputStream.close();
+                if (socket != null) socket.close();
+            } catch (IOException e) {
+                logger.warning("Error closing S7 connection: " + e.getMessage());
+            } finally {
+                outputStream = null;
+                inputStream = null;
+                socket = null;
+                connected = false;
+                logger.info("Disconnected from S7 server");
+            }
+        }
+    }
+    
+    @Override
+    public boolean isConnected() {
+        return connected && socket != null && socket.isConnected() && !socket.isClosed();
+    }
+    
+    @Override
+    public boolean readBit(String address) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        int dbNumber = parsedAddress.getDbNumber();
+        int area = parsedAddress.getFunctionCode();
+        int startAddress = parsedAddress.getAddress();
+        int bit = parsedAddress.getBit();
+        
+        byte[] request = buildS7ReadRequest(area, dbNumber, startAddress, 1, 0x04); // 璇诲彇瀛楄妭
+        byte[] response = sendS7Request(request);
+        
+        if (response[22] == 0x00) { // 鎴愬姛
+            byte data = response[25];
+            return (data & (1 << bit)) != 0;
+        }
+        
+        throw new IOException("S7 read error: " + response[22]);
+    }
+    
+    @Override
+    public void writeBit(String address, boolean value) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        int dbNumber = parsedAddress.getDbNumber();
+        int area = parsedAddress.getFunctionCode();
+        int startAddress = parsedAddress.getAddress();
+        int bit = parsedAddress.getBit();
+        
+        // 鍏堣鍙栧綋鍓嶅��
+        byte[] request = buildS7ReadRequest(area, dbNumber, startAddress, 1, 0x04); // 璇诲彇瀛楄妭
+        byte[] response = sendS7Request(request);
+        
+        if (response[22] != 0x00) { // 璇诲彇澶辫触
+            throw new IOException("S7 read error: " + response[22]);
+        }
+        
+        byte data = response[25];
+        
+        // 淇敼浣嶅��
+        if (value) {
+            data |= (1 << bit);
+        } else {
+            data &= ~(1 << bit);
+        }
+        
+        // 鍐欏叆淇敼鍚庣殑鍊�
+        request = buildS7WriteRequest(area, dbNumber, startAddress, new byte[]{data}, 0x04);
+        response = sendS7Request(request);
+        
+        if (response[22] != 0x00) { // 鍐欏叆澶辫触
+            throw new IOException("S7 write error: " + response[22]);
+        }
+    }
+    
+    @Override
+    public int readRegister(String address) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        int dbNumber = parsedAddress.getDbNumber();
+        int area = parsedAddress.getFunctionCode();
+        int startAddress = parsedAddress.getAddress();
+        
+        byte[] request = buildS7ReadRequest(area, dbNumber, startAddress, 2, 0x06); // 璇诲彇瀛�
+        byte[] response = sendS7Request(request);
+        
+        if (response[22] == 0x00) { // 鎴愬姛
+            return ((response[25] & 0xFF) << 8) | (response[26] & 0xFF);
+        }
+        
+        throw new IOException("S7 read error: " + response[22]);
+    }
+    
+    @Override
+    public void writeRegister(String address, int value) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        int dbNumber = parsedAddress.getDbNumber();
+        int area = parsedAddress.getFunctionCode();
+        int startAddress = parsedAddress.getAddress();
+        
+        byte[] data = new byte[2];
+        data[0] = (byte) (value >> 8);
+        data[1] = (byte) value;
+        
+        byte[] request = buildS7WriteRequest(area, dbNumber, startAddress, data, 0x06);
+        byte[] response = sendS7Request(request);
+        
+        if (response[22] != 0x00) { // 鍐欏叆澶辫触
+            throw new IOException("S7 write error: " + response[22]);
+        }
+    }
+    
+    @Override
+    public int[] readRegisters(String address, int quantity) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        int dbNumber = parsedAddress.getDbNumber();
+        int area = parsedAddress.getFunctionCode();
+        int startAddress = parsedAddress.getAddress();
+        
+        byte[] request = buildS7ReadRequest(area, dbNumber, startAddress, quantity * 2, 0x06); // 璇诲彇澶氫釜瀛�
+        byte[] response = sendS7Request(request);
+        
+        if (response[22] == 0x00) { // 鎴愬姛
+            int[] result = new int[quantity];
+            for (int i = 0; i < quantity; i++) {
+                result[i] = ((response[25 + i * 2] & 0xFF) << 8) | (response[26 + i * 2] & 0xFF);
+            }
+            return result;
+        }
+        
+        throw new IOException("S7 read error: " + response[22]);
+    }
+    
+    @Override
+    public void writeRegisters(String address, int[] values) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        int dbNumber = parsedAddress.getDbNumber();
+        int area = parsedAddress.getFunctionCode();
+        int startAddress = parsedAddress.getAddress();
+        
+        byte[] data = new byte[values.length * 2];
+        for (int i = 0; i < values.length; i++) {
+            data[i * 2] = (byte) (values[i] >> 8);
+            data[i * 2 + 1] = (byte) values[i];
+        }
+        
+        byte[] request = buildS7WriteRequest(area, dbNumber, startAddress, data, 0x06);
+        byte[] response = sendS7Request(request);
+        
+        if (response[22] != 0x00) { // 鍐欏叆澶辫触
+            throw new IOException("S7 write error: " + response[22]);
+        }
+    }
+    
+    @Override
+    public float readFloat(String address) throws IOException {
+        int[] registers = readRegisters(address, 2);
+        int intBits = (registers[0] << 16) | registers[1];
+        return Float.intBitsToFloat(intBits);
+    }
+    
+    @Override
+    public void writeFloat(String address, float value) throws IOException {
+        int intBits = Float.floatToIntBits(value);
+        int highWord = (intBits >> 16) & 0xFFFF;
+        int lowWord = intBits & 0xFFFF;
+        writeRegisters(address, new int[]{highWord, lowWord});
+    }
+    
+    @Override
+    public String readString(String address, int length) throws IOException {
+        int[] registers = readRegisters(address, (length + 1) / 2);
+        byte[] bytes = new byte[registers.length * 2];
+        
+        for (int i = 0; i < registers.length; i++) {
+            bytes[i * 2] = (byte) ((registers[i] >> 8) & 0xFF);
+            bytes[i * 2 + 1] = (byte) (registers[i] & 0xFF);
+        }
+        
+        return new String(bytes, 0, length);
+    }
+    
+    @Override
+    public void writeString(String address, String value) throws IOException {
+        byte[] bytes = value.getBytes();
+        int[] registers = new int[(bytes.length + 1) / 2];
+        
+        for (int i = 0; i < bytes.length; i++) {
+            int regIndex = i / 2;
+            int byteIndex = i % 2;
+            
+            if (byteIndex == 0) {
+                registers[regIndex] = (bytes[i] & 0xFF) << 8;
+            } else {
+                registers[regIndex] |= (bytes[i] & 0xFF);
+            }
+        }
+        
+        writeRegisters(address, registers);
+    }
+    
+    @Override
+    public void close() throws IOException {
+        disconnect();
+    }
+
+    
+    private boolean establishIsoConnection() throws IOException {
+        byte[] request = new byte[21];
+        request[0] = 0x03; // Protocol ID
+        request[1] = 0x00;
+        request[2] = 0x00;
+        request[3] = 0x15; // Length
+        request[4] = 0x02; // COTP header length
+        request[5] = (byte) 0xF0; // COTP TPDU type: DT
+        request[6] = (byte) 0x80; // TPDU number
+        request[7] = 0x00; // Parameter code: ISO-COTP
+        request[8] = 0x0A; // Parameter length
+        request[9] = 0x02; // Protocol version
+        request[10] = 0x01; // Reserved
+        request[11] = 0x00; // Source TSAP high
+        request[12] = 0x01; // Source TSAP low
+        request[13] = 0x00; // Destination TSAP high
+        request[14] = 0x01; // Destination TSAP low
+        request[15] = 0x00; // User data length
+        request[16] = 0x04; // S7 header length
+        request[17] = 0x00; // S7 protocol ID
+        request[18] = 0x11; // S7 setup communication
+        request[19] = 0x00; // Reserved
+        request[20] = 0x00; // Reserved
+        
+        outputStream.write(request);
+        
+        byte[] response = new byte[256];
+        int bytesRead = inputStream.read(response);
+        
+        // 楠岃瘉鍝嶅簲
+        return bytesRead >= 22 && 
+               response[17] == 0x00 && 
+               response[18] == 0x0E && 
+               response[19] == 0x00;
+    }
+    
+    private boolean establishS7Connection() throws IOException {
+        byte[] request = new byte[48];
+        request[0] = 0x03; // Protocol ID
+        request[1] = 0x00;
+        request[2] = 0x00;
+        request[3] = 0x2C; // Length
+        request[4] = 0x02; // COTP header length
+        request[5] = (byte) 0xF0; // COTP TPDU type: DT
+        request[6] = (byte) 0x80; // TPDU number
+        request[7] = 0x00; // Parameter code: ISO-COTP
+        request[8] = 0x0A; // Parameter length
+        request[9] = 0x02; // Protocol version
+        request[10] = 0x01; // Reserved
+        request[11] = 0x00; // Source TSAP high
+        request[12] = 0x01; // Source TSAP low
+        request[13] = 0x00; // Destination TSAP high
+        request[14] = 0x01; // Destination TSAP low
+        request[15] = 0x00; // User data length
+        request[16] = 0x12; // S7 header length
+        request[17] = 0x02; // S7 protocol ID
+        request[18] = (byte) 0xF0; // ROSCTR (Job)
+        request[19] = (byte) 0x80; // Reserved
+        request[20] = (byte) (jobId >> 8); // Job ID high
+        request[21] = (byte) jobId; // Job ID low
+        request[22] = 0x00; // Parameter length high
+        request[23] = 0x14; // Parameter length low
+        request[24] = 0x04; // CPU function: Connect
+        request[25] = 0x00; // Reserved
+        request[26] = 0x00; // Source rack
+        request[27] = 0x00; // Source slot
+        request[28] = 0x00; // Destination rack
+        request[29] = 0x01; // Destination slot
+        request[30] = 0x00; // PDU length high
+        request[31] = (byte) pduSize; // PDU length low
+        request[32] = 0x00; // Max AMQ call high
+        request[33] = 0x01; // Max AMQ call low
+        request[34] = 0x00; // Max AMQ confirm high
+        request[35] = 0x01; // Max AMQ confirm low
+        request[36] = 0x00; // PDU timeout high
+        request[37] = 0x00; // PDU timeout medium
+        request[38] = 0x00; // PDU timeout low
+        request[39] = 0x0A; // S7 version
+        request[40] = 0x00; // Data length high
+        request[41] = 0x00; // Data length low
+        
+        outputStream.write(request);
+        
+        byte[] response = new byte[256];
+        int bytesRead = inputStream.read(response);
+        
+        // 楠岃瘉鍝嶅簲
+        if (bytesRead >= 38 && 
+            response[18] == 0xF0 &&  // ROSCTR (Ack_Data)
+            response[24] == 0x04 &&  // CPU function: Connect
+            response[32] == 0x00) {  // Return code: Success
+            
+            pduSize = ((response[34] & 0xFF) << 8) | (response[35] & 0xFF);
+            jobId++;
+            return true;
+        }
+        
+        return false;
+    }
+    
+    private byte[] buildS7ReadRequest(int area, int dbNumber, int startAddress, int size, int wordLen) {
+        int requestLength = 44;
+        byte[] request = new byte[requestLength];
+        
+        request[0] = 0x03; // Protocol ID
+        request[1] = 0x00;
+        request[2] = 0x00;
+        request[3] = (byte) (requestLength - 4); // Length
+        request[4] = 0x02; // COTP header length
+        request[5] = (byte) 0xF0; // COTP TPDU type: DT
+        request[6] = (byte) 0x80; // TPDU number
+        request[7] = 0x00; // Parameter code: ISO-COTP
+        request[8] = 0x0A; // Parameter length
+        request[9] = 0x02; // Protocol version
+        request[10] = 0x01; // Reserved
+        request[11] = 0x00; // Source TSAP high
+        request[12] = 0x01; // Source TSAP low
+        request[13] = 0x00; // Destination TSAP high
+        request[14] = 0x01; // Destination TSAP low
+        request[15] = 0x00; // User data length
+        request[16] = 0x12; // S7 header length
+        request[17] = 0x02; // S7 protocol ID
+        request[18] = (byte) 0xF0; // ROSCTR (Job)
+        request[19] = 0x00; // Reserved
+        request[20] = (byte) (jobId >> 8); // Job ID high
+        request[21] = (byte) jobId; // Job ID low
+        request[22] = 0x00; // Parameter length high
+        request[23] = 0x0E; // Parameter length low
+        request[24] = 0x04; // CPU function: Read Var
+        request[25] = 0x01; // Item count
+        request[26] = 0x12; // Item specification length
+        request[27] = 0x0A; // Syntax ID: S7ANY
+        request[28] = (byte) wordLen; // Variable Type (Byte/Word/DWord)
+        request[29] = 0x01; // Transport size (1 = bit, 2 = byte, 4 = word, 8 = dword)
+        request[30] = 0x00; // Transport size high
+        request[31] = (byte) (size & 0xFF); // Number of items
+        request[32] = (byte) ((size >> 8) & 0xFF); // Number of items high
+        request[33] = 0x10; // DB specification
+        request[34] = (byte) ((dbNumber >> 8) & 0xFF); // DB number high
+        request[35] = (byte) (dbNumber & 0xFF); // DB number low
+        request[36] = (byte) area; // Area
+        request[37] = (byte) ((startAddress >> 16) & 0xFF); // Address high
+        request[38] = (byte) ((startAddress >> 8) & 0xFF); // Address medium
+        request[39] = (byte) (startAddress & 0xFF); // Address low
+        request[40] = 0x00; // Data length high
+        request[41] = 0x00; // Data length low
+        
+        jobId++;
+        return request;
+    }
+    
+    private byte[] buildS7WriteRequest(int area, int dbNumber, int startAddress, byte[] data, int wordLen) {
+        int dataLength = data.length;
+        int requestLength = 44 + dataLength;
+        byte[] request = new byte[requestLength];
+        
+        request[0] = 0x03; // Protocol ID
+        request[1] = 0x00;
+        request[2] = 0x00;
+        request[3] = (byte) (requestLength - 4); // Length
+        request[4] = 0x02; // COTP header length
+        request[5] = (byte) 0xF0; // COTP TPDU type: DT
+        request[6] = (byte) 0x80; // TPDU number
+        request[7] = 0x00; // Parameter code: ISO-COTP
+        request[8] = 0x0A; // Parameter length
+        request[9] = 0x02; // Protocol version
+        request[10] = 0x01; // Reserved
+        request[11] = 0x00; // Source TSAP high
+        request[12] = 0x01; // Source TSAP low
+        request[13] = 0x00; // Destination TSAP high
+        request[14] = 0x01; // Destination TSAP low
+        request[15] = 0x00; // User data length
+        request[16] = 0x12; // S7 header length
+        request[17] = 0x02; // S7 protocol ID
+        request[18] = (byte) 0xF0; // ROSCTR (Job)
+        request[19] = 0x00; // Reserved
+        request[20] = (byte) (jobId >> 8); // Job ID high
+        request[21] = (byte) jobId; // Job ID low
+        request[22] = 0x00; // Parameter length high
+        request[23] = 0x0E; // Parameter length low
+        request[24] = 0x05; // CPU function: Write Var
+        request[25] = 0x01; // Item count
+        request[26] = 0x12; // Item specification length
+        request[27] = 0x0A; // Syntax ID: S7ANY
+        request[28] = (byte) wordLen; // Variable Type (Byte/Word/DWord)
+        request[29] = 0x01; // Transport size (1 = bit, 2 = byte, 4 = word, 8 = dword)
+        request[30] = 0x00; // Transport size high
+        request[31] = (byte) (dataLength & 0xFF); // Number of items
+        request[32] = (byte) ((dataLength >> 8) & 0xFF); // Number of items high
+        request[33] = 0x10; // DB specification
+        request[34] = (byte) ((dbNumber >> 8) & 0xFF); // DB number high
+        request[35] = (byte) (dbNumber & 0xFF); // DB number low
+        request[36] = (byte) area; // Area
+        request[37] = (byte) ((startAddress >> 16) & 0xFF); // Address high
+        request[38] = (byte) ((startAddress >> 8) & 0xFF); // Address medium
+        request[39] = (byte) (startAddress & 0xFF); // Address low
+        request[40] = 0x00; // Data length high
+        request[41] = (byte) (dataLength + 2); // Data length low
+        request[42] = 0x04; // Return code: 0x04 = Success
+        request[43] = (byte) dataLength; // Data length
+        
+        // 澶嶅埗鏁版嵁
+        System.arraycopy(data, 0, request, 44, dataLength);
+        
+        jobId++;
+        return request;
+    }
+    
+    private byte[] sendS7Request(byte[] request) throws IOException {
+        if (!isConnected()) {
+            connect();
+        }
+        
+        // 鍙戦�佽姹�
+        outputStream.write(request);
+        
+        // 鎺ユ敹鍝嶅簲
+        byte[] header = new byte[4];
+        int bytesRead = 0;
+        
+        // 璇诲彇澶撮儴
+        while (bytesRead < 4) {
+            int count = inputStream.read(header, bytesRead, 4 - bytesRead);
+            if (count == -1) {
+                throw new IOException("Connection closed while reading response header");
+            }
+            bytesRead += count;
+        }
+        
+        int length = ((header[2] & 0xFF) << 8) | (header[3] & 0xFF);
+        byte[] response = new byte[length + 4];
+        
+        // 澶嶅埗澶撮儴
+        System.arraycopy(header, 0, response, 0, 4);
+        
+        // 璇诲彇鍓╀綑閮ㄥ垎
+        bytesRead = 0;
+        while (bytesRead < length) {
+            int count = inputStream.read(response, 4 + bytesRead, length - bytesRead);
+            if (count == -1) {
+                throw new IOException("Connection closed while reading response body");
+            }
+            bytesRead += count;
+        }
+        
+        // 妫�鏌ob ID
+        int responseJobId = ((response[20] & 0xFF) << 8) | (response[21] & 0xFF);
+        if (responseJobId != (jobId - 1)) {
+            throw new IOException("Job ID mismatch in response");
+        }
+        
+        return response;
+    }
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/s7/S7ClientOld.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/s7/S7ClientOld.java
new file mode 100644
index 0000000..95cb599
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/s7/S7ClientOld.java
@@ -0,0 +1,185 @@
+package com.mes.connect.s7;
+
+import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType;
+import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
+import com.mes.connect.IndustrialInterface.AddressParser;
+import com.mes.connect.IndustrialInterface.IndustrialClient;
+import com.mes.connect.addressParser.S7AddressParser;
+import com.mes.connect.addressParser.S7OldAddressParser;
+import com.mes.connect.protocol.ProtocolAddress;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.Socket;
+import java.util.Random;
+import java.util.logging.Logger;
+
+/**
+ * S7鍗忚瀹㈡埛绔疄鐜�
+ */
+@Slf4j
+public class S7ClientOld implements IndustrialClient {
+    private static final Logger logger = Logger.getLogger(S7ClientOld.class.getName());
+    private final String host;
+    private final int port;
+    private final int rack;
+    private final int slot;
+    private boolean connected;
+    private S7PLC s7PLC;
+    private final AddressParser addressParser = new S7OldAddressParser();
+    private EPlcType ePlcType;
+
+    public S7ClientOld(String plcType,String host, int port, int rack, int slot) {
+        this.host = host;
+        this.port = port;
+        this.rack = rack;
+        this.slot = slot;
+        switch (plcType) {
+            case "S200_SMART":
+                ePlcType=EPlcType.S200_SMART;
+                break;
+            case "S200":
+                ePlcType=EPlcType.S200;
+                break;
+            case "S300":
+                ePlcType=EPlcType.S300;
+                break;
+            case "S400":
+                ePlcType=EPlcType.S400;
+                break;
+            case "S1200":
+                ePlcType=EPlcType.S1200;
+                break;
+            case "S1500":
+                ePlcType=EPlcType.S1500;
+                break;
+            default:
+                throw new IllegalArgumentException("鏃犳晥鐨勮タ闂ㄥ瓙PLC绫诲瀷: " + plcType);
+        }
+    }
+    
+    @Override
+    public synchronized void connect() throws IOException {
+        if (!connected) {
+            this.s7PLC = new S7PLC(this.ePlcType, this.host, port, rack, slot);
+            connected = true;
+            logger.info("Connected to S7 server: " + host + ":" + port);
+        }
+    }
+
+    @Override
+    public synchronized void disconnect() {
+        if (connected) {
+            this.s7PLC.close();
+        }
+    }
+    
+    @Override
+    public boolean isConnected() {
+        return this.connected;
+    }
+    
+    @Override
+    public boolean readBit(String address) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        int dbNumber = parsedAddress.getDbNumber();
+        int area = parsedAddress.getFunctionCode();
+        int startAddress = parsedAddress.getAddress();
+        int bit = parsedAddress.getBit();
+        return  this.s7PLC.readBoolean(getAddress(parsedAddress));
+    }
+    
+    @Override
+    public void writeBit(String address, boolean value) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        int dbNumber = parsedAddress.getDbNumber();
+        int area = parsedAddress.getFunctionCode();
+        int startAddress = parsedAddress.getAddress();
+        int bit = parsedAddress.getBit();
+        this.s7PLC.writeBoolean(getAddress(parsedAddress),value);
+    }
+    
+    @Override
+    public int readRegister(String address) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        return this.s7PLC.readUInt16(getAddress(parsedAddress));
+    }
+    
+    @Override
+    public void writeRegister(String address, int value) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        this.s7PLC.writeUInt16(getAddress(parsedAddress),value);
+    }
+    
+    @Override
+    public int[] readRegisters(String address, int quantity) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        int dbNumber = parsedAddress.getDbNumber();
+        int area = parsedAddress.getFunctionCode();
+        int startAddress = parsedAddress.getAddress();
+        // 璁$畻闇�瑕佽鍙栫殑瀛楄妭鏁� (姣忎釜UInt16鍗犵敤2瀛楄妭)
+        int byteCount = quantity * 2;
+        // 璇诲彇瀛楄妭鏁扮粍
+        byte[] bytes = this.s7PLC.readByte(getAddress(parsedAddress), byteCount);
+        // 灏嗗瓧鑺傝浆鎹负鏃犵鍙锋暣鏁版暟缁�
+        int[] result = new int[quantity];
+        for (int i = 0; i < quantity; i++) {
+            int index = i * 2;
+            // 缁勫悎涓や釜瀛楄妭涓轰竴涓棤绗﹀彿16浣嶆暣鏁�
+            result[i] = ((bytes[index] & 0xFF) << 8) | (bytes[index + 1] & 0xFF);
+        }
+        return result;
+    }
+    
+    @Override
+    public void writeRegisters(String address, int[] values) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        int dbNumber = parsedAddress.getDbNumber();
+        int area = parsedAddress.getFunctionCode();
+        int startAddress = parsedAddress.getAddress();
+        // 杞崲鏁存暟鏁扮粍涓哄瓧鑺傛暟缁�
+        byte[] bytes = new byte[values.length * 2];
+        for (int i = 0; i < values.length; i++) {
+            int index = i * 2;
+            // 灏嗘暣鏁版媶鍒嗕负涓や釜瀛楄妭
+            bytes[index] = (byte) ((values[i] >> 8) & 0xFF);
+            bytes[index + 1] = (byte) (values[i] & 0xFF);
+        }
+        this.s7PLC.writeByte(getAddress(parsedAddress),bytes);
+    }
+    @Override
+    public float readFloat(String address) throws IOException {
+        int[] registers = readRegisters(address, 2);
+        int intBits = (registers[0] << 16) | registers[1];
+        return Float.intBitsToFloat(intBits);
+    }
+    @Override
+    public void writeFloat(String address, float value) throws IOException {
+        int intBits = Float.floatToIntBits(value);
+        int highWord = (intBits >> 16) & 0xFFFF;
+        int lowWord = intBits & 0xFFFF;
+        writeRegisters(address, new int[]{highWord, lowWord});
+    }
+    
+    @Override
+    public String readString(String address, int length) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        return this.s7PLC.readString(getAddress(parsedAddress));
+    }
+    
+    @Override
+    public void writeString(String address, String value) throws IOException {
+        ProtocolAddress parsedAddress = addressParser.parse(address);
+        this.s7PLC.writeString(getAddress(parsedAddress),value);
+    }
+    
+    @Override
+    public void close() throws IOException {
+        disconnect();
+    }
+    private String getAddress(ProtocolAddress parsedAddress){
+        return "DB"+parsedAddress.getDbNumber()+"."+parsedAddress.getAddress();
+    }
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/s7/S7Server.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/s7/S7Server.java
new file mode 100644
index 0000000..091a528
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/connect/s7/S7Server.java
@@ -0,0 +1,434 @@
+package com.mes.connect.s7;
+
+import com.mes.connect.IndustrialInterface.AddressParser;
+import com.mes.connect.IndustrialInterface.IndustrialDataHandler;
+import com.mes.connect.IndustrialInterface.IndustrialServer;
+import com.mes.connect.addressParser.S7AddressParser;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.logging.Logger;
+
+/**
+ * S7鍗忚鏈嶅姟鍣ㄥ疄鐜帮紙绠�鍖栫増锛�
+ */
+public class S7Server implements IndustrialServer {
+    private static final Logger logger = Logger.getLogger(S7Server.class.getName());
+    private ServerSocket serverSocket;
+    private Thread serverThread;
+    private boolean running;
+    private IndustrialDataHandler handler;
+    private final int port;
+    private final ExecutorService threadPool = Executors.newFixedThreadPool(10);
+    private final AddressParser addressParser = new S7AddressParser();
+    
+    public S7Server(int port) {
+        this.port = port;
+    }
+    
+    @Override
+    public synchronized void start() throws IOException {
+        if (!running) {
+            serverSocket = new ServerSocket(port);
+            serverThread = new Thread(this::serverLoop);
+            serverThread.setDaemon(true);
+            serverThread.start();
+            running = true;
+            logger.info("S7 server started on port " + port);
+        }
+    }
+    
+    @Override
+    public synchronized void stop() {
+        if (running) {
+            running = false;
+            try {
+                if (serverSocket != null) {
+                    serverSocket.close();
+                }
+                if (serverThread != null) {
+                    serverThread.interrupt();
+                    serverThread.join(1000);
+                }
+                threadPool.shutdownNow();
+            } catch (IOException | InterruptedException e) {
+                logger.warning("Error stopping S7 server: " + e.getMessage());
+            } finally {
+                serverSocket = null;
+                serverThread = null;
+                logger.info("S7 server stopped");
+            }
+        }
+    }
+    
+    @Override
+    public boolean isRunning() {
+        return running;
+    }
+    
+    @Override
+    public void setDataHandler(IndustrialDataHandler handler) {
+        this.handler = handler;
+    }
+    
+    @Override
+    public void close() throws IOException {
+        stop();
+    }
+    
+    private void serverLoop() {
+        while (running) {
+            try {
+                Socket clientSocket = serverSocket.accept();
+                threadPool.submit(() -> handleClient(clientSocket));
+            } catch (IOException e) {
+                if (running) {
+                    logger.warning("Error accepting client connection: " + e.getMessage());
+                }
+            }
+        }
+    }
+    
+    private void handleClient(Socket clientSocket) {
+        try (DataInputStream input = new DataInputStream(clientSocket.getInputStream());
+             DataOutputStream output = new DataOutputStream(clientSocket.getOutputStream())) {
+            
+            // S7閫氫俊娴佺▼锛欳OTP杩炴帴寤虹珛 -> ISO杩炴帴寤虹珛 -> S7鍗忚鏁版嵁浜ゆ崲
+            
+            // 1. 澶勭悊COTP杩炴帴璇锋眰
+            if (!handleCotpConnection(input, output)) {
+                return;
+            }
+            
+            // 2. 澶勭悊ISO杩炴帴璇锋眰
+            if (!handleIsoConnection(input, output)) {
+                return;
+            }
+            
+            // 3. 澶勭悊S7鍗忚鏁版嵁
+            handleS7Protocol(input, output);
+            
+        } catch (IOException e) {
+            logger.warning("Error handling client: " + e.getMessage());
+        }
+    }
+    
+    private boolean handleCotpConnection(DataInputStream input, DataOutputStream output) throws IOException {
+        // 璇诲彇COTP杩炴帴璇锋眰
+        byte[] buffer = new byte[256];
+        int bytesRead = input.read(buffer);
+        
+        // 绠�鍗曢獙璇丆OTP杩炴帴璇锋眰
+        if (bytesRead < 6 || buffer[0] != 0x02 || buffer[1] != 0xF0 || buffer[2] != 0x80) {
+            logger.warning("Invalid COTP connection request");
+            return false;
+        }
+        
+        // 鏋勫缓COTP杩炴帴纭
+        byte[] response = new byte[6];
+        response[0] = 0x02; // Length
+        response[1] = (byte) 0xF0; // COTP TPDU type: DT
+        response[2] = (byte) 0xD0; // TPDU number
+        response[3] = 0x00; // Parameters
+        response[4] = 0x00;
+        response[5] = 0x00;
+        
+        output.write(response);
+        return true;
+    }
+    
+    private boolean handleIsoConnection(DataInputStream input, DataOutputStream output) throws IOException {
+        // 璇诲彇ISO杩炴帴璇锋眰
+        byte[] buffer = new byte[256];
+        int bytesRead = input.read(buffer);
+        
+        // 绠�鍗曢獙璇両SO杩炴帴璇锋眰
+        if (bytesRead < 10 || buffer[0] != 0x03 || buffer[1] != 0x00) {
+            logger.warning("Invalid ISO connection request");
+            return false;
+        }
+        
+        // 鏋勫缓ISO杩炴帴纭
+        byte[] response = new byte[10];
+        response[0] = 0x03; // Protocol ID
+        response[1] = 0x00;
+        response[2] = 0x00;
+        response[3] = 0x0A; // Length
+        response[4] = 0x02; // COTP header length
+        response[5] = (byte) 0xF0; // COTP TPDU type: CC
+        response[6] = (byte) 0x81; // Parameters
+        response[7] = 0x00;
+        response[8] = 0x00;
+        response[9] = 0x00;
+        
+        output.write(response);
+        return true;
+    }
+    
+    private void handleS7Protocol(DataInputStream input, DataOutputStream output) throws IOException {
+        byte[] buffer = new byte[1024];
+        
+        while (true) {
+            int bytesRead = input.read(buffer);
+            if (bytesRead <= 0) {
+                break;
+            }
+            
+            // 瑙f瀽S7璇锋眰
+            byte[] response = processS7Request(buffer, bytesRead);
+            if (response != null) {
+                output.write(response);
+            }
+        }
+    }
+    
+    private byte[] processS7Request(byte[] request, int length) {
+        // 瑙f瀽S7璇锋眰PDU
+        int protocolId = request[0] & 0xFF;
+        int rosctr = request[1] & 0xFF; // 1 = Job, 3 = Ack_Data
+        
+        if (protocolId != 0x32 || rosctr != 1) {
+            logger.warning("Unsupported S7 request type");
+            return null;
+        }
+        
+        int function = request[12] & 0xFF;
+        
+        try {
+            switch (function) {
+                case 0x04: // 璇昏姹�
+                    return handleS7ReadRequest(request, length);
+                case 0x05: // 鍐欒姹�
+                    return handleS7WriteRequest(request, length);
+                default:
+                    logger.warning("Unsupported S7 function: " + function);
+                    return buildS7ErrorResponse(request, 0x01); // 鍔熻兘涓嶆敮鎸�
+            }
+        } catch (Exception e) {
+            logger.warning("Error processing S7 request: " + e.getMessage());
+            return buildS7ErrorResponse(request, 0x03); // 澶勭悊閿欒
+        }
+    }
+    
+    private byte[] handleS7ReadRequest(byte[] request, int length) {
+        // 瑙f瀽璇锋眰鍙傛暟
+        int itemCount = request[22] & 0xFF;
+        
+        // 鏋勫缓鍝嶅簲
+        int responseLength = 24 + itemCount * 12;
+        byte[] response = new byte[responseLength];
+        
+        // 澶嶅埗閫氱敤澶撮儴
+        System.arraycopy(request, 0, response, 0, 12);
+        
+        // 璁剧疆鍝嶅簲鐗瑰畾瀛楁
+        response[1] = 0x03; // ROSCTR = Ack_Data
+        response[10] = 0x00; // 鍙傛暟闀垮害
+        response[11] = 0x00;
+        response[12] = 0x04; // 鍔熻兘鐮侊細璇�
+        
+        // 璁剧疆鏁版嵁閮ㄥ垎
+        response[13] = 0x00; // 鏁版嵁闀垮害楂樺瓧鑺�
+        response[14] = (byte) (responseLength - 16); // 鏁版嵁闀垮害浣庡瓧鑺�
+        response[15] = 0x00; // 杩斿洖浠g爜锛氭垚鍔�
+        
+        // 澶勭悊姣忎釜璇诲彇椤�
+        int offset = 16;
+        for (int i = 0; i < itemCount; i++) {
+            int area = request[offset + 2] & 0xFF;
+            int dbNumber = ((request[offset + 3] & 0xFF) << 8) | (request[offset + 4] & 0xFF);
+            int wordLen = request[offset + 5] & 0xFF;
+            int startAddress = ((request[offset + 6] & 0xFF) << 16) | 
+                              ((request[offset + 7] & 0xFF) << 8) | 
+                               (request[offset + 8] & 0xFF);
+            int count = ((request[offset + 9] & 0xFF) << 8) | (request[offset + 10] & 0xFF);
+            
+            // 鏋勫缓鍦板潃瀛楃涓�
+            String addressStr;
+            if (area == 0x84) { // DB
+                addressStr = String.format("S7.DB%d.DBW%d", dbNumber, startAddress);
+            } else if (area == 0x81) { // 杈撳叆
+                addressStr = String.format("S7.I%d", startAddress);
+            } else if (area == 0x82) { // 杈撳嚭
+                addressStr = String.format("S7.Q%d", startAddress);
+            } else if (area == 0x83) { // 鍐呭瓨
+                addressStr = String.format("S7.M%d", startAddress);
+            } else {
+                response[offset] = (byte) 0x81; // 杩斿洖浠g爜锛氬弬鏁伴敊璇�
+                response[offset + 1] = 0x00;
+                response[offset + 2] = 0x00;
+                offset += 3;
+                continue;
+            }
+            
+            // 鏍规嵁鏁版嵁绫诲瀷澶勭悊璇诲彇
+            if (wordLen == 0x04) { // 瀛楄妭
+                response[offset] = 0x00; // 杩斿洖浠g爜锛氭垚鍔�
+                response[offset + 1] = 0x01; // 鍙橀噺瑙勮寖闀垮害
+                response[offset + 2] = 0x04; // 鏁版嵁绫诲瀷锛氬瓧鑺�
+                response[offset + 3] = (byte) count; // 鏁版嵁闀垮害
+                
+                for (int j = 0; j < count; j++) {
+                    String byteAddress = String.format("%s.%d", addressStr, j);
+                    int value = handler.handleReadRegister(byteAddress) & 0xFF;
+                    response[offset + 4 + j] = (byte) value;
+                }
+                
+                offset += 4 + count;
+            } else if (wordLen == 0x06) { // 瀛�
+                response[offset] = 0x00; // 杩斿洖浠g爜锛氭垚鍔�
+                response[offset + 1] = 0x01; // 鍙橀噺瑙勮寖闀垮害
+                response[offset + 2] = 0x06; // 鏁版嵁绫诲瀷锛氬瓧
+                response[offset + 3] = (byte) (count * 2); // 鏁版嵁闀垮害
+                
+                for (int j = 0; j < count; j++) {
+                    String wordAddress = String.format("%s.%d", addressStr, j);
+                    int value = handler.handleReadRegister(wordAddress);
+                    response[offset + 4 + j * 2] = (byte) (value >> 8);
+                    response[offset + 5 + j * 2] = (byte) value;
+                }
+                
+                offset += 4 + count * 2;
+            } else if (wordLen == 0x08) { // 鍙屽瓧
+                response[offset] = 0x00; // 杩斿洖浠g爜锛氭垚鍔�
+                response[offset + 1] = 0x01; // 鍙橀噺瑙勮寖闀垮害
+                response[offset + 2] = 0x08; // 鏁版嵁绫诲瀷锛氬弻瀛�
+                response[offset + 3] = (byte) (count * 4); // 鏁版嵁闀垮害
+                
+                for (int j = 0; j < count; j++) {
+                    String dwordAddress = String.format("%s.%d", addressStr, j);
+                    int value = handler.handleReadRegister(dwordAddress);
+                    response[offset + 4 + j * 4] = (byte) (value >> 24);
+                    response[offset + 5 + j * 4] = (byte) (value >> 16);
+                    response[offset + 6 + j * 4] = (byte) (value >> 8);
+                    response[offset + 7 + j * 4] = (byte) value;
+                }
+                
+                offset += 4 + count * 4;
+            } else {
+                response[offset] = (byte) 0x81; // 杩斿洖浠g爜锛氬弬鏁伴敊璇�
+                response[offset + 1] = 0x00;
+                response[offset + 2] = 0x00;
+                offset += 3;
+            }
+        }
+        
+        return response;
+    }
+    
+    private byte[] handleS7WriteRequest(byte[] request, int length) {
+        // 瑙f瀽璇锋眰鍙傛暟
+        int itemCount = request[22] & 0xFF;
+        
+        // 鏋勫缓鍝嶅簲
+        byte[] response = new byte[24 + itemCount * 3];
+        
+        // 澶嶅埗閫氱敤澶撮儴
+        System.arraycopy(request, 0, response, 0, 12);
+        
+        // 璁剧疆鍝嶅簲鐗瑰畾瀛楁
+        response[1] = 0x03; // ROSCTR = Ack_Data
+        response[10] = 0x00; // 鍙傛暟闀垮害
+        response[11] = 0x00;
+        response[12] = 0x05; // 鍔熻兘鐮侊細鍐�
+        
+        // 璁剧疆鏁版嵁閮ㄥ垎
+        response[13] = 0x00; // 鏁版嵁闀垮害楂樺瓧鑺�
+        response[14] = (byte) (itemCount * 3); // 鏁版嵁闀垮害浣庡瓧鑺�
+        
+        // 澶勭悊姣忎釜鍐欏叆椤�
+        int offset = 16;
+        for (int i = 0; i < itemCount; i++) {
+            int area = request[offset + 2] & 0xFF;
+            int dbNumber = ((request[offset + 3] & 0xFF) << 8) | (request[offset + 4] & 0xFF);
+            int wordLen = request[offset + 5] & 0xFF;
+            int startAddress = ((request[offset + 6] & 0xFF) << 16) | 
+                              ((request[offset + 7] & 0xFF) << 8) | 
+                               (request[offset + 8] & 0xFF);
+            int count = ((request[offset + 9] & 0xFF) << 8) | (request[offset + 10] & 0xFF);
+            int dataLength = request[offset + 11] & 0xFF;
+            
+            // 鏋勫缓鍦板潃瀛楃涓�
+            String addressStr;
+            if (area == 0x84) { // DB
+                addressStr = String.format("S7.DB%d.DBW%d", dbNumber, startAddress);
+            } else if (area == 0x81) { // 杈撳叆
+                addressStr = String.format("S7.I%d", startAddress);
+            } else if (area == 0x82) { // 杈撳嚭
+                addressStr = String.format("S7.Q%d", startAddress);
+            } else if (area == 0x83) { // 鍐呭瓨
+                addressStr = String.format("S7.M%d", startAddress);
+            } else {
+                response[offset] = (byte) 0x81; // 杩斿洖浠g爜锛氬弬鏁伴敊璇�
+                offset += 3;
+                continue;
+            }
+            
+            // 鏍规嵁鏁版嵁绫诲瀷澶勭悊鍐欏叆
+            if (wordLen == 0x04) { // 瀛楄妭
+                int[] values = new int[count];
+                for (int j = 0; j < count; j++) {
+                    values[j] = request[offset + 12 + j] & 0xFF;
+                    String byteAddress = String.format("%s.%d", addressStr, j);
+                    handler.handleWriteRegister(byteAddress, values[j]);
+                }
+                
+                response[offset] = 0x00; // 杩斿洖浠g爜锛氭垚鍔�
+                offset += 3;
+            } else if (wordLen == 0x06) { // 瀛�
+                int[] values = new int[count];
+                for (int j = 0; j < count; j++) {
+                    values[j] = ((request[offset + 12 + j * 2] & 0xFF) << 8) | 
+                                (request[offset + 13 + j * 2] & 0xFF);
+                    String wordAddress = String.format("%s.%d", addressStr, j);
+                    handler.handleWriteRegister(wordAddress, values[j]);
+                }
+                
+                response[offset] = 0x00; // 杩斿洖浠g爜锛氭垚鍔�
+                offset += 3;
+            } else if (wordLen == 0x08) { // 鍙屽瓧
+                for (int j = 0; j < count; j++) {
+                    int value = ((request[offset + 12 + j * 4] & 0xFF) << 24) | 
+                               ((request[offset + 13 + j * 4] & 0xFF) << 16) | 
+                               ((request[offset + 14 + j * 4] & 0xFF) << 8) | 
+                                (request[offset + 15 + j * 4] & 0xFF);
+                    String dwordAddress = String.format("%s.%d", addressStr, j);
+                    handler.handleWriteRegister(dwordAddress, value);
+                }
+                
+                response[offset] = 0x00; // 杩斿洖浠g爜锛氭垚鍔�
+                offset += 3;
+            } else {
+                response[offset] = (byte) 0x81; // 杩斿洖浠g爜锛氬弬鏁伴敊璇�
+                offset += 3;
+            }
+        }
+        
+        return response;
+    }
+    
+    private byte[] buildS7ErrorResponse(byte[] request, int errorCode) {
+        byte[] response = new byte[24];
+        
+        // 澶嶅埗閫氱敤澶撮儴
+        System.arraycopy(request, 0, response, 0, 12);
+        
+        // 璁剧疆鍝嶅簲鐗瑰畾瀛楁
+        response[1] = 0x03; // ROSCTR = Ack_Data
+        response[10] = 0x00; // 鍙傛暟闀垮害
+        response[11] = 0x00;
+        response[12] = request[12]; // 鍔熻兘鐮�
+        
+        // 璁剧疆鏁版嵁閮ㄥ垎
+        response[13] = 0x00; // 鏁版嵁闀垮害楂樺瓧鑺�
+        response[14] = 0x03; // 鏁版嵁闀垮害浣庡瓧鑺�
+        response[15] = (byte) errorCode; // 杩斿洖浠g爜
+        
+        return response;
+    }
+}    
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/controller/AccountController.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/controller/AccountController.java
new file mode 100644
index 0000000..92ac2de
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/controller/AccountController.java
@@ -0,0 +1,37 @@
+package com.mes.model.controller;
+import com.mes.model.service.AccountService;
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.mes.utils.Result;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 璐︽埛琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author wu
+ * @since 2024-08-28
+ */
+@Api(tags = "璐︽埛")
+@RestController
+@RequestMapping("/account")
+public class AccountController {
+
+    @Autowired
+    AccountService accountService;
+    @ApiOperation("httpAPi娴嬭瘯")
+    @PostMapping("/testApi")
+    @ResponseBody
+    public Result testApi (@RequestBody Map<String, Object> arguments) {
+        String str[]={"123","456"};
+        return Result.build(200,"杩炴帴鎴愬姛",str);
+    }
+
+}
+
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/entity/Account.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/entity/Account.java
new file mode 100644
index 0000000..4d2a9aa
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/entity/Account.java
@@ -0,0 +1,51 @@
+package com.mes.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 璐︽埛琛�
+ * </p>
+ *
+ * @author wu
+ * @since 2024-08-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class Account implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 璐︽埛琛ㄤ富閿�
+     */
+      @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鐢ㄦ埛鍚嶇О
+     */
+    private String userName;
+
+    /**
+     * 瑙掕壊id
+     */
+    private Long roleId;
+
+    /**
+     * 璐︽埛
+     */
+    private String account;
+
+    /**
+     * 瀵嗙爜
+     */
+    private String password;
+
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/entity/Machine.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/entity/Machine.java
new file mode 100644
index 0000000..267d49c
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/entity/Machine.java
@@ -0,0 +1,74 @@
+package com.mes.model.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.mes.model.mapper.MachineMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 璐︽埛琛�
+ * </p>
+ *
+ * @author wu
+ * @since 2024-08-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class Machine implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 璐︽埛琛ㄤ富閿�
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 璁惧鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鍗忚绫诲瀷ID
+     */
+    // 鍙互鐩存帴娣诲姞鍏宠仈瀵硅薄
+    @TableField(exist = false, fill = FieldFill.INSERT_UPDATE)
+    private ProtocolType protocolType;
+    private Long protocolTypeId;
+    /**
+     * PLC绫诲瀷
+     */
+    @TableField(exist = false)
+    private PlcType plcType;
+    private String plcTypeId;
+
+    /**
+     * ip
+     */
+    private String ip;
+
+    /**
+     * 绔彛
+     */
+    private int port;
+
+    /**
+     * 绔彛
+     */
+    private String machineFile;
+
+    /**
+     * 绔彛
+     */
+    private String logicFile;
+
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/entity/PlcType.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/entity/PlcType.java
new file mode 100644
index 0000000..2b03598
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/entity/PlcType.java
@@ -0,0 +1,41 @@
+package com.mes.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * plc鍨嬪彿琛�
+ * </p>
+ *
+ * @author yzx
+ * @since 2025-06-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class PlcType implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 璐︽埛琛ㄤ富閿�
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 璁惧鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 澶囨敞
+     */
+    private String remarks;
+
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/entity/ProtocolType.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/entity/ProtocolType.java
new file mode 100644
index 0000000..a5ba86d
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/entity/ProtocolType.java
@@ -0,0 +1,41 @@
+package com.mes.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 鍗忚绫诲瀷琛�
+ * </p>
+ *
+ * @author yzx
+ * @since 2025-06-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ProtocolType implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鍗忚鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 澶囨敞
+     */
+    private String remarks;
+
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/AccountMapper.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/AccountMapper.java
new file mode 100644
index 0000000..cc4d7ef
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/AccountMapper.java
@@ -0,0 +1,16 @@
+package com.mes.model.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.mes.model.entity.Account;
+
+/**
+ * <p>
+ * 璐︽埛琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author wu
+ * @since 2024-08-28
+ */
+public interface AccountMapper extends MPJBaseMapper<Account> {
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/MachineMapper.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/MachineMapper.java
new file mode 100644
index 0000000..57bc5bb
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/MachineMapper.java
@@ -0,0 +1,24 @@
+package com.mes.model.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.mes.model.entity.Account;
+import com.mes.model.entity.Machine;
+import com.mes.model.entity.ProtocolType;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璐︽埛琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author wu
+ * @since 2024-08-28
+ */
+@Mapper
+public interface MachineMapper extends MPJBaseMapper<Machine> {
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/PlcTypeMapper.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/PlcTypeMapper.java
new file mode 100644
index 0000000..e3bfc1c
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/PlcTypeMapper.java
@@ -0,0 +1,16 @@
+package com.mes.model.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.mes.model.entity.PlcType;
+
+/**
+ * <p>
+ * 璐︽埛琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author wu
+ * @since 2024-08-28
+ */
+public interface PlcTypeMapper extends MPJBaseMapper<PlcType> {
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/ProtocolTypeMapper.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/ProtocolTypeMapper.java
new file mode 100644
index 0000000..6deb57f
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/ProtocolTypeMapper.java
@@ -0,0 +1,16 @@
+package com.mes.model.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.mes.model.entity.ProtocolType;
+
+/**
+ * <p>
+ * 璐︽埛琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author wu
+ * @since 2024-08-28
+ */
+public interface ProtocolTypeMapper extends MPJBaseMapper<ProtocolType> {
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/xml/AccountMapper.xml b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/xml/AccountMapper.xml
new file mode 100644
index 0000000..d4b9833
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/xml/AccountMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.mes.model.mapper.AccountMapper">
+
+</mapper>
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/xml/MachineMapper.xml b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/xml/MachineMapper.xml
new file mode 100644
index 0000000..fe133d2
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/xml/MachineMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.mes.model.mapper.MachineMapper">
+
+</mapper>
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/xml/PlcTypeMapper.xml b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/xml/PlcTypeMapper.xml
new file mode 100644
index 0000000..f0dd528
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/xml/PlcTypeMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.mes.model.mapper.PlcTypeMapper">
+
+</mapper>
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/xml/ProtocolTypeMapper.xml b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/xml/ProtocolTypeMapper.xml
new file mode 100644
index 0000000..29019a6
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/mapper/xml/ProtocolTypeMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.mes.model.mapper.ProtocolTypeMapper">
+
+</mapper>
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/AccountService.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/AccountService.java
new file mode 100644
index 0000000..5b9b806
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/AccountService.java
@@ -0,0 +1,16 @@
+package com.mes.model.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.mes.model.entity.Account;
+
+/**
+ * <p>
+ * 璐︽埛琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author wu
+ * @since 2024-08-28
+ */
+public interface AccountService extends MPJBaseService<Account> {
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/MachineService.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/MachineService.java
new file mode 100644
index 0000000..388a312
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/MachineService.java
@@ -0,0 +1,19 @@
+package com.mes.model.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.mes.model.entity.Account;
+import com.mes.model.entity.Machine;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璐︽埛琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author wu
+ * @since 2024-08-28
+ */
+public interface MachineService extends MPJBaseService<Machine> {
+    List<Machine> getMachineConfig();
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/PlcTypeService.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/PlcTypeService.java
new file mode 100644
index 0000000..176cfde
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/PlcTypeService.java
@@ -0,0 +1,16 @@
+package com.mes.model.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.mes.model.entity.PlcType;
+
+/**
+ * <p>
+ * 璐︽埛琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author wu
+ * @since 2024-08-28
+ */
+public interface PlcTypeService extends MPJBaseService<PlcType> {
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/ProtocolTypeService.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/ProtocolTypeService.java
new file mode 100644
index 0000000..c845d06
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/ProtocolTypeService.java
@@ -0,0 +1,17 @@
+package com.mes.model.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.mes.model.entity.Account;
+import com.mes.model.entity.ProtocolType;
+
+/**
+ * <p>
+ * 璐︽埛琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author wu
+ * @since 2024-08-28
+ */
+public interface ProtocolTypeService extends MPJBaseService<ProtocolType> {
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/impl/AccountServiceImpl.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/impl/AccountServiceImpl.java
new file mode 100644
index 0000000..5b5db80
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/impl/AccountServiceImpl.java
@@ -0,0 +1,23 @@
+package com.mes.model.service.impl;
+
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.mes.model.entity.Account;
+import com.mes.model.mapper.AccountMapper;
+import com.mes.model.service.AccountService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璐︽埛琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author yanzhixin
+ * @since 2024-09-03
+ */
+@Slf4j
+@Service
+public class AccountServiceImpl extends MPJBaseServiceImpl<AccountMapper, Account> implements AccountService {
+
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/impl/MachineServiceImpl.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/impl/MachineServiceImpl.java
new file mode 100644
index 0000000..bb05359
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/impl/MachineServiceImpl.java
@@ -0,0 +1,50 @@
+package com.mes.model.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.mes.model.entity.Account;
+import com.mes.model.entity.Machine;
+import com.mes.model.entity.PlcType;
+import com.mes.model.entity.ProtocolType;
+import com.mes.model.mapper.AccountMapper;
+import com.mes.model.mapper.MachineMapper;
+import com.mes.model.mapper.PlcTypeMapper;
+import com.mes.model.mapper.ProtocolTypeMapper;
+import com.mes.model.service.AccountService;
+import com.mes.model.service.MachineService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * 璐︽埛琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author yanzhixin
+ * @since 2024-09-03
+ */
+@Slf4j
+@Service
+public class MachineServiceImpl extends MPJBaseServiceImpl<MachineMapper, Machine> implements MachineService {
+    @Autowired
+    private PlcTypeMapper plcTypeMapper;
+    @Autowired
+    private ProtocolTypeMapper protocolTypeMapper;
+    public List<Machine> getMachineConfig() {
+        List<Machine> machineConfig = baseMapper.selectList(null);
+        for (int i=0;i<machineConfig.size();i++) {
+            PlcType plcType=plcTypeMapper.selectOne(new QueryWrapper<PlcType>().lambda()
+                    .eq(PlcType::getId,machineConfig.get(i).getPlcTypeId()));
+            ProtocolType protocolType=protocolTypeMapper.selectOne(new QueryWrapper<ProtocolType>().lambda()
+                    .eq(ProtocolType::getId,machineConfig.get(i).getProtocolTypeId()));
+            machineConfig.get(i).setPlcType(plcType);
+            machineConfig.get(i).setProtocolType(protocolType);
+        }
+        return machineConfig;
+    }
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/impl/PlcTypeServiceImpl.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/impl/PlcTypeServiceImpl.java
new file mode 100644
index 0000000..964ad74
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/impl/PlcTypeServiceImpl.java
@@ -0,0 +1,26 @@
+package com.mes.model.service.impl;
+
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.mes.model.entity.Machine;
+import com.mes.model.entity.PlcType;
+import com.mes.model.mapper.MachineMapper;
+import com.mes.model.mapper.PlcTypeMapper;
+import com.mes.model.service.MachineService;
+import com.mes.model.service.PlcTypeService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璐︽埛琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author yanzhixin
+ * @since 2024-09-03
+ */
+@Slf4j
+@Service
+public class PlcTypeServiceImpl extends MPJBaseServiceImpl<PlcTypeMapper, PlcType> implements PlcTypeService {
+
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/impl/ProtocolTypeServiceImpl.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/impl/ProtocolTypeServiceImpl.java
new file mode 100644
index 0000000..db78c0a
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/model/service/impl/ProtocolTypeServiceImpl.java
@@ -0,0 +1,23 @@
+package com.mes.model.service.impl;
+
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.mes.model.entity.ProtocolType;
+import com.mes.model.mapper.ProtocolTypeMapper;
+import com.mes.model.service.ProtocolTypeService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璐︽埛琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author yanzhixin
+ * @since 2024-09-03
+ */
+@Slf4j
+@Service
+public class ProtocolTypeServiceImpl extends MPJBaseServiceImpl<ProtocolTypeMapper, ProtocolType> implements ProtocolTypeService {
+
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/plcConnectModuleApplication.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/plcConnectModuleApplication.java
new file mode 100644
index 0000000..7c42101
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/java/com/mes/plcConnectModuleApplication.java
@@ -0,0 +1,33 @@
+package com.mes;
+
+import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/3/25 10:49
+ * @Description:
+ */
+@Slf4j
+@SpringBootApplication
+
+@MapperScan("com.mes.*.mapper")
+@EnableDiscoveryClient
+@EnableSwagger2
+@EnableScheduling
+@EnableAsync
+public class plcConnectModuleApplication {
+    public static void main(String[] args) {
+        try {
+            SpringApplication.run(plcConnectModuleApplication.class, args);
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
+    }
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/main.iml b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/main.iml
new file mode 100644
index 0000000..da5bdb1
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/main.iml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/java" isTestSource="false" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="servicebase-1.0-SNAPSHOT" level="project" />
+    <orderEntry type="module" module-name="UnLoadGlassModule" />
+    <orderEntry type="module" module-name="servicebase1" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/loadLogic.json b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/loadLogic.json
new file mode 100644
index 0000000..bba83fa
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/loadLogic.json
@@ -0,0 +1,165 @@
+{
+  "logics": [
+    {
+      "name":"璇锋眰閫昏緫",
+      "sequence":"1",
+      "connectType":"View",
+      "connectAddress": "viewname",
+      "logic":[
+        {
+          "codeId": "plcRequest",
+          "address": "MB.4x0001",
+          "value": [1],
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "mesSend",
+          "address": "MB.4x0010",
+          "value": [0],
+          "plcDataType": "int",
+          "length": 2
+        }
+      ],
+      "returnValue": [
+        {
+          "codeId": "mesSend",
+          "address": "MB.4x0010",
+          "fixed": true,
+          "value": 1,
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "width",
+          "address": "MB.4x0011",
+          "fixed": false,
+          "value": 1,
+          "plcDataType": "int",
+          "length": 2
+        }
+      ,
+        {
+          "codeId": "height",
+          "address": "MB.4x0012",
+          "fixed": false,
+          "value": 2,
+          "plcDataType": "int",
+          "length": 2
+        }
+      ]
+    },
+    {
+      "name":"璇锋眰娓呯┖",
+      "sequence":"2",
+      "connectType":"View",
+      "connectAddress": "viewname",
+      "logic":[
+        {
+          "codeId": "plcRequest",
+          "address": "MB.4x0001",
+          "value": [0],
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "mesSend",
+          "address": "MB.4x0010",
+          "value": [1],
+          "plcDataType": "int",
+          "length": 2
+        }
+      ],
+      "returnValue": [
+        {
+          "codeId": "mesSend",
+          "address": "MB.4x0010",
+          "fixed": true,
+          "value": 0,
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "width",
+          "address": "MB.4x0011",
+          "fixed": true,
+          "value": 0,
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "height",
+          "address": "MB.4x0012",
+          "fixed": true,
+          "value": 0,
+          "plcDataType": "int",
+          "length": 2
+        }
+      ]
+    },
+    {
+      "name":"瀹屾垚閫昏緫",
+      "sequence":"3",
+      "connectType":"View",
+      "connectAddress": "viewname",
+      "logic":[
+        {
+          "codeId": "plcComplete",
+          "address": "MB.4x0005",
+          "value": [1],
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "mesComplete",
+          "address": "MB.4x0020",
+          "value": [0],
+          "plcDataType": "int",
+          "length": 2
+        }
+      ],
+      "returnValue": [
+        {
+          "codeId": "mesComplete",
+          "address": "MB.4x0020",
+          "fixed": true,
+          "value": 1,
+          "plcDataType": "int",
+          "length": 2
+        }
+      ]
+    },
+    {
+      "name":"瀹屾垚娓呯┖",
+      "sequence":"4",
+      "connectType":"View",
+      "connectAddress": "viewname",
+      "logic":[
+        {
+          "codeId": "plcComplete",
+          "address": "MB.4x0005",
+          "value": [0],
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "mesComplete",
+          "address": "MB.4x0020",
+          "value": [1,2,3],
+          "plcDataType": "int",
+          "length": 2
+        }
+      ],
+      "returnValue": [
+        {
+          "codeId": "mesComplete",
+          "address": "MB.4x0020",
+          "fixed": true,
+          "value": 0,
+          "plcDataType": "int",
+          "length": 2
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/loadLogic2.json b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/loadLogic2.json
new file mode 100644
index 0000000..0e5903d
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/loadLogic2.json
@@ -0,0 +1,165 @@
+{
+  "logics": [
+    {
+      "name":"璇锋眰閫昏緫",
+      "sequence":"1",
+      "connectType":"Http",
+      "connectAddress": "http://localhost:8082/account/testApi",
+      "logic":[
+        {
+          "codeId": "plcRequest",
+          "address": "MB.4x0001",
+          "value": [1],
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "mesSend",
+          "address": "MB.4x0010",
+          "value": [0],
+          "plcDataType": "int",
+          "length": 2
+        }
+      ],
+      "returnValue": [
+        {
+          "codeId": "mesSend",
+          "address": "MB.4x0010",
+          "fixed": true,
+          "value": 1,
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "width",
+          "address": "MB.4x0011",
+          "fixed": false,
+          "value": 1,
+          "plcDataType": "int",
+          "length": 2
+        }
+      ,
+        {
+          "codeId": "height",
+          "address": "MB.4x0012",
+          "fixed": false,
+          "value": 2,
+          "plcDataType": "int",
+          "length": 2
+        }
+      ]
+    },
+    {
+      "name":"璇锋眰娓呯┖",
+      "sequence":"2",
+      "connectType":"View",
+      "connectAddress": "viewname",
+      "logic":[
+        {
+          "codeId": "plcRequest",
+          "address": "MB.4x0001",
+          "value": [0],
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "mesSend",
+          "address": "MB.4x0010",
+          "value": [1],
+          "plcDataType": "int",
+          "length": 2
+        }
+      ],
+      "returnValue": [
+        {
+          "codeId": "mesSend",
+          "address": "MB.4x0010",
+          "fixed": true,
+          "value": 0,
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "width",
+          "address": "MB.4x0011",
+          "fixed": true,
+          "value": 0,
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "height",
+          "address": "MB.4x0012",
+          "fixed": true,
+          "value": 0,
+          "plcDataType": "int",
+          "length": 2
+        }
+      ]
+    },
+    {
+      "name":"瀹屾垚閫昏緫",
+      "sequence":"3",
+      "connectType":"View",
+      "connectAddress": "viewname",
+      "logic":[
+        {
+          "codeId": "plcComplete",
+          "address": "MB.4x0005",
+          "value": [1],
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "mesComplete",
+          "address": "MB.4x0020",
+          "value": [0],
+          "plcDataType": "int",
+          "length": 2
+        }
+      ],
+      "returnValue": [
+        {
+          "codeId": "mesComplete",
+          "address": "MB.4x0020",
+          "fixed": true,
+          "value": 1,
+          "plcDataType": "int",
+          "length": 2
+        }
+      ]
+    },
+    {
+      "name":"瀹屾垚娓呯┖",
+      "sequence":"4",
+      "connectType":"View",
+      "connectAddress": "viewname",
+      "logic":[
+        {
+          "codeId": "plcComplete",
+          "address": "MB.4x0005",
+          "value": [0],
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "mesComplete",
+          "address": "MB.4x0020",
+          "value": [1,2,3],
+          "plcDataType": "int",
+          "length": 2
+        }
+      ],
+      "returnValue": [
+        {
+          "codeId": "mesComplete",
+          "address": "MB.4x0020",
+          "fixed": true,
+          "value": 0,
+          "plcDataType": "int",
+          "length": 2
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/loadLogicS7.json b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/loadLogicS7.json
new file mode 100644
index 0000000..9c9699b
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/loadLogicS7.json
@@ -0,0 +1,165 @@
+{
+  "logics": [
+    {
+      "name":"璇锋眰閫昏緫",
+      "sequence":"1",
+      "connectType":"View",
+      "connectAddress": "viewname",
+      "logic":[
+        {
+          "codeId": "plcRequest",
+          "address": "S7.DB8.DBW0",
+          "value": [1],
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "mesSend",
+          "address": "S7.DB8.DBW20",
+          "value": [0],
+          "plcDataType": "int",
+          "length": 2
+        }
+      ],
+      "returnValue": [
+        {
+          "codeId": "mesSend",
+          "address": "S7.DB8.DBW20",
+          "fixed": true,
+          "value": 1,
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "width",
+          "address": "S7.DB8.DBW22",
+          "fixed": false,
+          "value": 1,
+          "plcDataType": "int",
+          "length": 2
+        }
+      ,
+        {
+          "codeId": "height",
+          "address": "S7.DB8.DBW24",
+          "fixed": false,
+          "value": 2,
+          "plcDataType": "int",
+          "length": 2
+        }
+      ]
+    },
+    {
+      "name":"璇锋眰娓呯┖",
+      "sequence":"2",
+      "connectType":"View",
+      "connectAddress": "viewname",
+      "logic":[
+        {
+          "codeId": "plcRequest",
+          "address": "S7.DB8.DBW0",
+          "value": [0],
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "mesSend",
+          "address": "S7.DB8.DBW20",
+          "value": [1],
+          "plcDataType": "int",
+          "length": 2
+        }
+      ],
+      "returnValue": [
+        {
+          "codeId": "mesSend",
+          "address": "S7.DB8.DBW20",
+          "fixed": true,
+          "value": 0,
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "width",
+          "address": "S7.DB8.DBW22",
+          "fixed": true,
+          "value": 0,
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "height",
+          "address": "S7.DB8.DBW24",
+          "fixed": true,
+          "value": 0,
+          "plcDataType": "int",
+          "length": 2
+        }
+      ]
+    },
+    {
+      "name":"瀹屾垚閫昏緫",
+      "sequence":"3",
+      "connectType":"View",
+      "connectAddress": "viewname",
+      "logic":[
+        {
+          "codeId": "plcComplete",
+          "address": "S7.DB8.DBW10",
+          "value": [1],
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "mesComplete",
+          "address": "S7.DB8.DBW40",
+          "value": [0],
+          "plcDataType": "int",
+          "length": 2
+        }
+      ],
+      "returnValue": [
+        {
+          "codeId": "mesComplete",
+          "address": "S7.DB8.DBW40",
+          "fixed": true,
+          "value": 1,
+          "plcDataType": "int",
+          "length": 2
+        }
+      ]
+    },
+    {
+      "name":"瀹屾垚娓呯┖",
+      "sequence":"4",
+      "connectType":"View",
+      "connectAddress": "viewname",
+      "logic":[
+        {
+          "codeId": "plcComplete",
+          "address": "S7.DB8.DBW10",
+          "value": [0],
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "mesComplete",
+          "address": "S7.DB8.DBW40",
+          "value": [1,2,3],
+          "plcDataType": "int",
+          "length": 2
+        }
+      ],
+      "returnValue": [
+        {
+          "codeId": "mesComplete",
+          "address": "S7.DB8.DBW40",
+          "fixed": true,
+          "value": 0,
+          "plcDataType": "int",
+          "length": 2
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/logicalRelationship.json b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/logicalRelationship.json
new file mode 100644
index 0000000..c60bf22
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/logicalRelationship.json
@@ -0,0 +1,17 @@
+{
+  "璇锋眰閫昏緫":{
+    "name":"璇锋眰閫昏緫",
+    "connectType":"HTTP",
+    "connectAddress": "http://39.105.110.179:5000/Request"
+  },
+  "璇锋眰娓呯┖":{
+    "name":"璇锋眰娓呯┖",
+    "connectType":"Procedure",
+    "connectAddress": "瀛樺偍杩囩▼鍚嶇О"
+  },
+  "瀹屾垚閫昏緫":{
+    "name":"瀹屾垚閫昏緫",
+    "connectType":"View",
+    "connectAddress": "瑙嗗浘鍚嶇О"
+  }
+}
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/shelf.json b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/shelf.json
new file mode 100644
index 0000000..4387aff
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/shelf.json
@@ -0,0 +1,244 @@
+{
+  "parameters": [
+    {
+      "serialNumber": 0,
+      "content": "PLC璇锋眰",
+      "codeId": "plcRequest",
+      "plcDataType": "Word",
+      "fontLocation": 0,
+      "length": 2,
+      "ratio": 1,
+      "scale": 1,
+      "address": "MB.4x0001",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 1,
+      "content": "PLC璇锋眰ID",
+      "codeId": "plcRequestId",
+      "plcDataType": "Word",
+      "fontLocation": 2,
+      "length": 2,
+      "ratio": 2,
+      "scale": 2,
+      "address":"MB.4x0002",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 2,
+      "content": "澶囩敤_1",
+      "codeId": "remarks_1",
+      "plcDataType": "Word",
+      "fontLocation": 4,
+      "length": 2,
+      "ratio": 3,
+      "scale": 3,
+      "address": "MB.4x0003",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 3,
+      "content": "澶囩敤_2",
+      "codeId": "remarks_2",
+      "plcDataType": "Word",
+      "fontLocation": 6,
+      "length": 2,
+      "ratio": 4,
+      "scale": 4,
+      "address": "MB.4x0004",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 4,
+      "content": "PLC瀹屾垚瀛�",
+      "codeId": "plcComplete",
+      "plcDataType": "Word",
+      "fontLocation": 8,
+      "length": 2,
+      "ratio": 5,
+      "scale": 5,
+      "address": "MB.4x0005",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 5,
+      "content": "澶囩敤_4",
+      "codeId": "remarks_4",
+      "plcDataType": "Word",
+      "fontLocation": 10,
+      "length": 2,
+      "ratio": 6,
+      "scale": 6,
+      "address": "MB.4x0006",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 6,
+      "content": "澶囩敤_5",
+      "codeId": "remarks_5",
+      "plcDataType": "Word",
+      "fontLocation": 12,
+      "length": 2,
+      "ratio": 7,
+      "scale": 7,
+      "address": "MB.4x0007",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 7,
+      "content": "澶囩敤_6",
+      "codeId": "remarks_6",
+      "plcDataType": "Word",
+      "fontLocation": 14,
+      "length": 2,
+      "ratio": 8,
+      "scale": 8,
+      "address": "MB.4x0008",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 8,
+      "content": "澶囩敤_7",
+      "codeId": "remarks_7",
+      "plcDataType": "Word",
+      "fontLocation": 16,
+      "length": 2,
+      "ratio": 9,
+      "scale": 9,
+      "address": "MB.4x0009",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 9,
+      "content": "Mes鍙戦�佸瓧",
+      "codeId": "mesSend",
+      "plcDataType": "Word",
+      "fontLocation": 18,
+      "length": 2,
+      "ratio": 10,
+      "scale": 10,
+      "address": "MB.4x0010",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 10,
+      "content": "MES鍙戦�侀暱",
+      "codeId": "width",
+      "plcDataType": "Word",
+      "fontLocation": 20,
+      "length": 2,
+      "ratio": 11,
+      "scale": 11,
+      "address": "MB.4x0011",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 11,
+      "content": "MES鍙戦�佸",
+      "codeId": "height",
+      "plcDataType": "Word",
+      "fontLocation": 22,
+      "length": 2,
+      "ratio": 12,
+      "scale": 12,
+      "address":"MB.4x0012",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 12,
+      "content": "G3M7璁惧鐘舵��",
+      "codeId": "13",
+      "plcDataType": "Word",
+      "fontLocation": 24,
+      "length": 2,
+      "ratio": 13,
+      "scale": 13,
+      "address": "MB.4x0013",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 13,
+      "content": "Z12璁惧鐘舵��",
+      "codeId": "14",
+      "plcDataType": "Word",
+      "fontLocation": 26,
+      "length": 2,
+      "ratio": 14,
+      "scale": 14,
+      "address": "MB.4x0014",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 14,
+      "content": "S8璁惧鐘舵��",
+      "codeId": "15",
+      "plcDataType": "Word",
+      "fontLocation": 28,
+      "length": 2,
+      "ratio": 15,
+      "scale": 15,
+      "address": "MB.4x0015",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 15,
+      "content": "W11瀹氫綅鍙拌澶囩姸鎬�",
+      "codeId": "16",
+      "plcDataType": "Word",
+      "fontLocation": 30,
+      "length": 2,
+      "ratio": 16,
+      "scale": 16,
+      "address": "MB.4x0016",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 16,
+      "content": "S9璁惧鐘舵��",
+      "codeId": "17",
+      "plcDataType": "Word",
+      "fontLocation": 32,
+      "length": 2,
+      "ratio": 17,
+      "scale": 17,
+      "address": "MB.4x0017",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 17,
+      "content": "S10璁惧鐘舵��",
+      "codeId": "18",
+      "plcDataType": "Word",
+      "fontLocation": 34,
+      "length": 2,
+      "ratio": 18,
+      "scale": 18,
+      "address": "MB.4x0018",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 19,
+      "content": "S10璁惧鐘舵��",
+      "codeId": "19",
+      "plcDataType": "Word",
+      "fontLocation": 34,
+      "length": 2,
+      "ratio": 18,
+      "scale": 18,
+      "address": "MB.4x0018",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 20,
+      "content": "mes纭瀹屾垚",
+      "codeId": "mesComplete",
+      "plcDataType": "Word",
+      "fontLocation": 40,
+      "length": 2,
+      "ratio": 10,
+      "scale": 10,
+      "address": "MB.4x0020",
+      "remarks": ""
+    }
+  ]
+}
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/shelfLogic.json b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/shelfLogic.json
new file mode 100644
index 0000000..8daa381
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/shelfLogic.json
@@ -0,0 +1,85 @@
+{
+  "logics": [
+    {
+      "name":"璇锋眰閫昏緫",
+      "sequence":"1",
+      "connectType":"Http",
+      "connectAddress": "http://localhost:8082/account/testApi",
+      "logic":[
+        {
+          "codeId": "plcRequest",
+          "address": "MB.4x0001",
+          "value": [1],
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "mesSend",
+          "address": "MB.4x0010",
+          "value": [0],
+          "plcDataType": "int",
+          "length": 2
+        }
+      ],
+      "returnValue": [
+        {
+          "codeId": "mesSend",
+          "address": "MB.4x0010",
+          "fixed": true,
+          "value": 1,
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "width",
+          "address": "MB.4x0011",
+          "fixed": false,
+          "value": 1,
+          "plcDataType": "int",
+          "length": 2
+        }
+      ,
+        {
+          "codeId": "height",
+          "address": "MB.4x0012",
+          "fixed": false,
+          "value": 2,
+          "plcDataType": "int",
+          "length": 2
+        }
+      ]
+    },
+    {
+      "name":"瀹屾垚閫昏緫",
+      "sequence":"2",
+      "connectType":"Procedure",
+      "connectAddress": "瀛樺偍杩囩▼鍚嶇О",
+      "logic":[
+        {
+          "codeId": "plcComplete",
+          "address": "MB.0x0000",
+          "value": [1],
+          "plcDataType": "int",
+          "length": 2
+        },
+        {
+          "codeId": "mesComplete",
+          "address": "MB.0x0010",
+          "value": [0],
+          "plcDataType": "int",
+          "length": 2
+        }
+      ],
+      "returnValue": [
+        {
+          "codeId": "mesComplete",
+          "address": "MB.0x0010",
+          "fixed": true,
+          "value": 1,
+          "plcDataType": "int",
+          "length": 2
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/shelfS7.json b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/shelfS7.json
new file mode 100644
index 0000000..d63455b
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/JsonFile/shelfS7.json
@@ -0,0 +1,244 @@
+{
+  "parameters": [
+    {
+      "serialNumber": 0,
+      "content": "PLC璇锋眰",
+      "codeId": "plcRequest",
+      "plcDataType": "Word",
+      "fontLocation": 0,
+      "length": 2,
+      "ratio": 1,
+      "scale": 1,
+      "address": "S7.DB8.DBW0",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 1,
+      "content": "PLC璇锋眰ID",
+      "codeId": "plcRequestId",
+      "plcDataType": "Word",
+      "fontLocation": 2,
+      "length": 2,
+      "ratio": 2,
+      "scale": 2,
+      "address":"S7.DB8.DBW2",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 2,
+      "content": "澶囩敤_1",
+      "codeId": "remarks_1",
+      "plcDataType": "Word",
+      "fontLocation": 4,
+      "length": 2,
+      "ratio": 3,
+      "scale": 3,
+      "address": "S7.DB8.DBW4",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 3,
+      "content": "澶囩敤_2",
+      "codeId": "remarks_2",
+      "plcDataType": "Word",
+      "fontLocation": 6,
+      "length": 2,
+      "ratio": 4,
+      "scale": 4,
+      "address": "S7.DB8.DBW6",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 4,
+      "content": "PLC瀹屾垚瀛�",
+      "codeId": "plcComplete",
+      "plcDataType": "Word",
+      "fontLocation": 10,
+      "length": 2,
+      "ratio": 5,
+      "scale": 5,
+      "address": "S7.DB8.DBW10",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 5,
+      "content": "澶囩敤_4",
+      "codeId": "remarks_4",
+      "plcDataType": "Word",
+      "fontLocation": 10,
+      "length": 2,
+      "ratio": 6,
+      "scale": 6,
+      "address": "S7.DB8.DBW12",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 6,
+      "content": "澶囩敤_5",
+      "codeId": "remarks_5",
+      "plcDataType": "Word",
+      "fontLocation": 12,
+      "length": 2,
+      "ratio": 7,
+      "scale": 7,
+      "address": "S7.DB8.DBW14",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 7,
+      "content": "澶囩敤_6",
+      "codeId": "remarks_6",
+      "plcDataType": "Word",
+      "fontLocation": 14,
+      "length": 2,
+      "ratio": 8,
+      "scale": 8,
+      "address": "S7.DB8.DBW16",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 8,
+      "content": "澶囩敤_7",
+      "codeId": "remarks_7",
+      "plcDataType": "Word",
+      "fontLocation": 16,
+      "length": 2,
+      "ratio": 9,
+      "scale": 9,
+      "address": "S7.DB8.DBW18",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 9,
+      "content": "Mes鍙戦�佸瓧",
+      "codeId": "mesSend",
+      "plcDataType": "Word",
+      "fontLocation": 18,
+      "length": 2,
+      "ratio": 10,
+      "scale": 10,
+      "address": "S7.DB8.DBW20",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 10,
+      "content": "MES鍙戦�侀暱",
+      "codeId": "width",
+      "plcDataType": "Word",
+      "fontLocation": 20,
+      "length": 2,
+      "ratio": 11,
+      "scale": 11,
+      "address": "S7.DB8.DBW22",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 11,
+      "content": "MES鍙戦�佸",
+      "codeId": "height",
+      "plcDataType": "Word",
+      "fontLocation": 22,
+      "length": 2,
+      "ratio": 12,
+      "scale": 12,
+      "address":"S7.DB8.DBW24",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 12,
+      "content": "G3M7璁惧鐘舵��",
+      "codeId": "13",
+      "plcDataType": "Word",
+      "fontLocation": 24,
+      "length": 2,
+      "ratio": 13,
+      "scale": 13,
+      "address": "S7.DB8.DBW26",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 13,
+      "content": "Z12璁惧鐘舵��",
+      "codeId": "14",
+      "plcDataType": "Word",
+      "fontLocation": 26,
+      "length": 2,
+      "ratio": 14,
+      "scale": 14,
+      "address": "S7.DB8.DBW28",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 14,
+      "content": "S8璁惧鐘舵��",
+      "codeId": "15",
+      "plcDataType": "Word",
+      "fontLocation": 28,
+      "length": 2,
+      "ratio": 15,
+      "scale": 15,
+      "address": "S7.DB8.DBW30",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 15,
+      "content": "W11瀹氫綅鍙拌澶囩姸鎬�",
+      "codeId": "16",
+      "plcDataType": "Word",
+      "fontLocation": 30,
+      "length": 2,
+      "ratio": 16,
+      "scale": 16,
+      "address": "S7.DB8.DBW32",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 16,
+      "content": "S9璁惧鐘舵��",
+      "codeId": "17",
+      "plcDataType": "Word",
+      "fontLocation": 32,
+      "length": 2,
+      "ratio": 17,
+      "scale": 17,
+      "address": "S7.DB8.DBW34",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 17,
+      "content": "S10璁惧鐘舵��",
+      "codeId": "18",
+      "plcDataType": "Word",
+      "fontLocation": 34,
+      "length": 2,
+      "ratio": 18,
+      "scale": 18,
+      "address": "S7.DB8.DBW36",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 19,
+      "content": "S10璁惧鐘舵��",
+      "codeId": "19",
+      "plcDataType": "Word",
+      "fontLocation": 34,
+      "length": 2,
+      "ratio": 18,
+      "scale": 18,
+      "address": "S7.DB8.DBW38",
+      "remarks": ""
+    },
+    {
+      "serialNumber": 20,
+      "content": "mes纭瀹屾垚",
+      "codeId": "mesComplete",
+      "plcDataType": "Word",
+      "fontLocation": 40,
+      "length": 2,
+      "ratio": 10,
+      "scale": 10,
+      "address": "S7.DB8.DBW40",
+      "remarks": ""
+    }
+  ]
+}
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/application-cz.yml b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/application-cz.yml
new file mode 100644
index 0000000..49ee448
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/application-cz.yml
@@ -0,0 +1,32 @@
+spring:
+  datasource:
+    dynamic:
+      primary: hangzhoumes #璁剧疆榛樿鐨勬暟鎹簮鎴栬�呮暟鎹簮缁�,榛樿鍊煎嵆涓簃aster
+      strict: false #璁剧疆涓ユ牸妯″紡,榛樿false涓嶅惎鍔�. 鍚姩鍚庡湪鏈尮閰嶅埌鎸囧畾鏁版嵁婧愭椂鍊欏洖鎶涘嚭寮傚父,涓嶅惎鍔ㄤ細浣跨敤榛樿鏁版嵁婧�.
+      datasource:
+        hangzhoumes:
+          url: jdbc:mysql://192.168.1.199:3306/hangzhoumes?serverTimezone=GMT%2b8
+          username: root
+          password: beibo.123/
+          driver-class-name: com.mysql.cj.jdbc.Driver
+        pp:
+          url: jdbc:mysql://192.168.1.199:3306/pp?serverTimezone=GMT%2b8
+          username: root
+          password: beibo.123/
+          driver-class-name: com.mysql.cj.jdbc.Driver
+        salve_hangzhoumes:
+          url: jdbc:sqlserver://192.168.10.2:1433;databasename=hangzhoumes
+          username: sa
+          password: beibo.123/
+          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 127.0.0.1:8848
+  application:
+    name: deviceInteraction
+  redis:
+    database: 0
+    host: 127.0.0.1
+    port: 6379
+    password: 123456
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/application-dev.yml b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/application-dev.yml
new file mode 100644
index 0000000..618f60d
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/application-dev.yml
@@ -0,0 +1,32 @@
+spring:
+  datasource:
+    dynamic:
+      primary: hangzhoumes #璁剧疆榛樿鐨勬暟鎹簮鎴栬�呮暟鎹簮缁�,榛樿鍊煎嵆涓簃aster
+      strict: false #璁剧疆涓ユ牸妯″紡,榛樿false涓嶅惎鍔�. 鍚姩鍚庡湪鏈尮閰嶅埌鎸囧畾鏁版嵁婧愭椂鍊欏洖鎶涘嚭寮傚父,涓嶅惎鍔ㄤ細浣跨敤榛樿鏁版嵁婧�.
+      datasource:
+        hangzhoumes:
+          url: jdbc:mysql://127.0.0.1:3306/hangzhoumes?serverTimezone=GMT%2b8
+          username: root
+          password: beibo.123/
+          driver-class-name: com.mysql.cj.jdbc.Driver
+        pp:
+          url: jdbc:mysql://127.0.0.1:3306/pp?serverTimezone=GMT%2b8
+          username: root
+          password: beibo.123/
+          driver-class-name: com.mysql.cj.jdbc.Driver
+        salve_hangzhoumes:
+          url: jdbc:sqlserver://127.0.0.1:1433;databasename=hangzhoumes
+          username: sa
+          password: beibo.123/
+          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 127.0.0.1:8848
+  application:
+    name: deviceInteraction
+  redis:
+    database: 0
+    host: 127.0.0.1
+    port: 6379
+    password: 123456
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/application-prod.yml b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/application-prod.yml
new file mode 100644
index 0000000..358eaaf
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/application-prod.yml
@@ -0,0 +1,32 @@
+spring:
+  datasource:
+    dynamic:
+      primary: mes_machine #璁剧疆榛樿鐨勬暟鎹簮鎴栬�呮暟鎹簮缁�,榛樿鍊煎嵆涓簃aster
+      strict: false #璁剧疆涓ユ牸妯″紡,榛樿false涓嶅惎鍔�. 鍚姩鍚庡湪鏈尮閰嶅埌鎸囧畾鏁版嵁婧愭椂鍊欏洖鎶涘嚭寮傚父,涓嶅惎鍔ㄤ細浣跨敤榛樿鏁版嵁婧�.
+      datasource:
+        mes_machine:
+          url: jdbc:mysql://localhost:3306/mes_machine?serverTimezone=GMT%2b8&rewriteBatchedStatements=true
+          username: root
+          password: beibo.123/
+          driver-class-name: com.mysql.cj.jdbc.Driver
+        salve_JomooKBB:
+          url: jdbc:sqlserver://localhost:1433;databasename=JomooKBB
+          username: sa
+          password: beibo.123/
+          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
+#        salve_JomooKBB:
+#          url: jdbc:sqlserver://172.18.19.85:1433;databasename=JomooKBB
+#          username: thok
+#          password: jomoo@123
+#          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
+  cloud:
+    nacos:
+      discovery:
+        server-addr: localhost:8848
+  application:
+    name: deviceInteraction
+  redis:
+    database: 0
+    host: localhost
+    port: 6379
+    password: 123456
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/application.yml b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/application.yml
new file mode 100644
index 0000000..91d3f80
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/application.yml
@@ -0,0 +1,33 @@
+server:
+  port: 8081
+  tomcat:
+    uri-encoding: UTF-8
+    max-threads: 800 #鏈�澶у伐浣滅嚎绋嬫暟閲�
+    min-spare-threads: 20 #鏈�灏忓伐浣滅嚎绋嬫暟閲�
+    #max-connections: 10000 #涓�鐬棿鏈�澶ф敮鎸佺殑骞跺彂鐨勮繛鎺ユ暟
+    accept-count: 200 #绛夊緟闃熷垪闀垮害
+spring:
+  profiles:
+    active: prod
+  application:
+    name: deviceInteraction
+mybatis-plus:
+  mapper-locations: classpath*:mapper/*.xml
+#  configuration:
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+mes:
+  threshold: 3
+  ratio: 10
+  max: # 绗簩鏉$嚎鐨勬渶澶у昂瀵镐俊鎭�
+    firstLength: 3500
+    secondLength: 2500
+  min:
+    one: #绗竴鏉$(杈圭嚎鐨勬渶灏忓昂瀵镐俊鎭�
+      firstLength: 600
+      secondLength: 350
+    two: #绗簩鏉$(杈圭嚎鐨勬渶灏忓昂瀵镐俊鎭�
+      firstLength: 400
+      secondLength: 300
+  sequence:
+    order: false
+
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/logback-spring.xml b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..d5e7fdf
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/main/resources/logback-spring.xml
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="10 seconds">
+    <!-- logger涓婁笅鏂囧悕绉帮紙鏍规嵁涓氬姟淇敼锛� -->
+    <contextName>deviceInteraction</contextName>
+
+    <!-- 瀹氫箟浜嗕竴涓悕涓簊erverName鐨勫睘鎬э紝瀹冪殑鍊兼潵鑷簬logging.file.name锛屽鏋滄病鏈夋壘鍒拌灞炴�ч粯璁や负MyServerName锛堟牴鎹笟鍔′慨鏀癸級 -->
+    <springProperty name="serverName" source="logging.file.name" defaultValue="deviceInteraction"/>
+    <springProperty name="logging.path" source="logging.file.path" defaultValue="././logs/"/>
+
+    <!-- 褰╄壊鏃ュ織渚濊禆鐨勬覆鏌撶被 -->
+    <!-- 瀹氫箟浜嗕竴涓悕涓篶lr鐨勮浆鎹㈣鍒欙紝瀹冧娇鐢╫rg.springframework.boot.logging.logback.ColorConverter绫昏繘琛岃浆鎹紝杩欎釜鍏冪礌閫氬父鐢ㄤ簬灏嗘棩蹇楄緭鍑轰腑鐨勬枃鏈潃鑹诧紝浠ヤ究鏇村鏄撳湴鍖哄垎涓嶅悓鐨勬棩蹇楃骇鍒垨鍏朵粬淇℃伅 -->
+    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <!-- WhitespaceThrowableProxyConverter鍜孍xtendedWhitespaceThrowableProxyConverter閮芥槸鐢ㄤ簬灏嗗紓甯镐俊鎭浆鎹负瀛楃涓诧紝骞跺皢鍏朵腑鐨勬崲琛岀鏇挎崲涓虹┖鏍硷紝浠ヤ究鏇村鏄撳湴鍦ㄦ棩蹇楄緭鍑轰腑鏄剧ず鐨勭被銆傚畠浠箣闂寸殑鍖哄埆鍦ㄤ簬锛孍xtendedWhitespaceThrowableProxyConverter鍦ㄨ緭鍑哄紓甯镐俊鎭椂浼氬寘鍚洿澶氱殑璇︾粏淇℃伅锛屼緥濡傚紓甯哥殑绫诲悕銆佹柟娉曞悕鍜岃鍙风瓑 -->
+    <!-- 瀹氫箟浜嗕竴涓悕涓簑ex鐨勮浆鎹㈣鍒欙紝瀹冧娇鐢╫rg.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter绫昏繘琛岃浆鎹紝杩欎釜鍏冪礌閫氬父鐢ㄤ簬灏嗗紓甯镐俊鎭浆鎹负瀛楃涓诧紝骞跺皢鍏朵腑鐨勬崲琛岀鏇挎崲涓虹┖鏍硷紝浠ヤ究鏇村鏄撳湴鍦ㄦ棩蹇楄緭鍑轰腑鏄剧ず -->
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <!-- 瀹氫箟浜嗕竴涓悕涓簑Ex鐨勮浆鎹㈣鍒欙紝瀹冧娇鐢╫rg.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter绫昏繘琛岃浆鎹紝杩欎釜鍏冪礌閫氬父鐢ㄤ簬灏嗗紓甯镐俊鎭浆鎹负瀛楃涓诧紝骞跺皢鍏朵腑鐨勬崲琛岀鏇挎崲涓虹┖鏍硷紝浠ヤ究鏇村鏄撳湴鍦ㄦ棩蹇楄緭鍑轰腑鏄剧ず -->
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+
+    <!-- 褰╄壊鏃ュ織鏍煎紡 -->
+    <!-- value鍊兼槸鏃ュ織杈撳嚭妯℃澘锛� :-鏄睘鎬у悕鍜屽叾榛樿鍊间箣闂寸殑鍒嗛殧绗︼紝浣滅敤涓�:鐩稿悓 -->
+    <!-- 瀹氫箟鏃ュ織杈撳嚭鏍煎紡鐨勮浆鎹㈣鍒欙紝%d{yyyy-MM-dd HH:mm:ss.SSS}琛ㄧず鏃ユ湡鍜屾椂闂达紝%clr琛ㄧず灏嗚緭鍑烘枃鏈潃鑹诧紝{faint}琛ㄧず浣跨敤娣¤壊 -->
+    <!-- %5p琛ㄧず鏃ュ織绾у埆杈撳嚭鍙冲榻愶紝宸﹁竟浠ョ┖鏍煎~鍏� -->
+    <!-- ${PID:- }琛ㄧず杩涚▼ID锛�%clr琛ㄧず灏嗚緭鍑烘枃鏈潃鑹诧紝{magenta}琛ㄧず浣跨敤娲嬬孩鑹� -->
+    <!-- -琛ㄧず涓�涓垎闅旂 -->
+    <!-- %t锛氭樉绀轰骇鐢熻鏃ュ織鐨勭嚎绋嬪悕锛�%15锛氳嫢瀛楃闀垮害灏忎簬15锛屽垯宸﹁竟鐢ㄧ┖鏍煎~鍏咃紱%.15锛氳嫢瀛楃闀垮害瓒呰繃15锛屾埅鍘诲浣欏瓧绗� -->
+    <!-- %-40锛氳嫢瀛楃闀垮害灏忎簬40锛屽垯鍙宠竟鐢ㄧ┖鏍煎~鍏咃紱%.40锛氳嫢瀛楃闀垮害瓒呰繃40锛屾埅鍘诲浣欏瓧绗︼紱logger{39}瀵瑰簲鐨勬槸鈥渓ogging.WARNING鈥濈骇鍒�傚叿浣撴潵璇达紝Python鐨刲ogging妯″潡瀹氫箟浜嗕互涓嬪嚑涓骇鍒紙浠庝綆鍒伴珮锛夛細NOTSET銆丏EBUG銆両NFO銆乄ARNING銆丒RROR銆丆RITICAL銆傚洜姝わ紝logger{39}琛ㄧず鐨勬槸WARNING绾у埆锛屽嵆鏃ュ織璁板綍鍣ㄤ細璁板綍鎵�鏈塛ARNING绾у埆鍙婁互涓婄殑鏃ュ織淇℃伅 -->
+    <!-- %m琛ㄧず鏃ュ織娑堟伅锛�%n琛ㄧず鎹㈣绗︼紱${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}琛ㄧず寮傚父淇℃伅銆傚鏋滄棩蹇楄緭鍑轰腑鍖呭惈寮傚父淇℃伅锛岃繖涓鍒欏皢浼氬皢鍏惰浆鎹负瀛楃涓诧紝骞跺皢鍏朵腑鐨勬崲琛岀鏇挎崲涓虹┖鏍硷紝浠ヤ究鏇村鏄撳湴鍦ㄦ棩蹇楄緭鍑轰腑鏄剧ず -->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+
+    <!--1. 杈撳嚭鍒版帶鍒跺彴-->
+    <!-- 瀹氫箟鎺у埗鍙版棩蹇楄緭鍑虹殑appender锛宑lass="ch.qos.logback.core.ConsoleAppender"琛ㄧず浣跨敤Logback妗嗘灦鎻愪緵鐨凜onsoleAppender绫绘潵杈撳嚭鏃ュ織鍒版帶鍒跺彴 -->
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <!--姝ゆ棩蹇梐ppender鏄负寮�鍙戜娇鐢紝鍙厤缃渶搴曠骇鍒紝鎺у埗鍙拌緭鍑虹殑鏃ュ織绾у埆鏄ぇ浜庢垨绛変簬姝ょ骇鍒殑鏃ュ織淇℃伅-->
+        <!-- 瀹氫箟鏃ュ織杈撳嚭绾у埆鐨勮繃婊ゅ櫒锛宑lass="ch.qos.logback.classic.filter.ThresholdFilter"琛ㄧず浣跨敤Logback妗嗘灦鎻愪緵鐨凾hresholdFilter绫绘潵杩囨护鏃ュ織杈撳嚭锛�<level>debug</level>琛ㄧず鍙緭鍑篸ebug绾у埆鍙婁互涓婄殑鏃ュ織 -->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>debug</level>
+        </filter>
+        <encoder>
+            <!-- ${CONSOLE_LOG_PATTERN}琛ㄧず鎺у埗鍙版棩蹇楄緭鍑烘牸寮忥紝UTF-8琛ㄧず缂栫爜鏍煎紡 -->
+            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
+            <!-- 璁剧疆瀛楃闆� -->
+            <charset>UTF-8</charset>
+        </encoder>
+    </appender>
+    <!--2. 杈撳嚭鍒版枃妗�-->
+    <!-- 2.1 level涓� DEBUG 鏃ュ織锛屾椂闂存粴鍔ㄨ緭鍑�  -->
+    <!-- 瀹氫箟鏂囦欢鏃ュ織杈撳嚭鐨刟ppender锛宑lass="ch.qos.logback.core.rolling.RollingFileAppender"琛ㄧず浣跨敤Logback妗嗘灦鎻愪緵鐨凴ollingFileAppender绫绘潵杈撳嚭鏃ュ織鍒版枃浠� -->
+    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 姝e湪璁板綍鐨勬棩蹇楁枃妗g殑璺緞鍙婃枃妗e悕 -->
+        <file>${logging.path}/${serverName}/web_debug.log</file>
+        <!--鏃ュ織鏂囨。杈撳嚭鏍煎紡-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset> <!-- 璁剧疆瀛楃闆� -->
+        </encoder>
+        <!-- 鏃ュ織璁板綍鍣ㄧ殑婊氬姩绛栫暐锛屾寜鏃ユ湡锛屾寜澶у皬璁板綍 -->
+        <!-- 瀹氫箟鏃ュ織鏂囦欢婊氬姩绛栫暐鐨勬爣绛撅紝class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"琛ㄧず浣跨敤Logback妗嗘灦鎻愪緵鐨凾imeBasedRollingPolicy绫绘潵瀹氫箟鏃ュ織鏂囦欢鐨勬粴鍔ㄧ瓥鐣� -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 鏃ュ織褰掓。 -->
+            <!-- 瀹氫箟鏃ュ織鏂囦欢鍚嶇殑妯″紡銆傚湪杩欎釜妯″紡涓紝${logging.path}琛ㄧず鏃ュ織鏂囦欢鐨勮矾寰勶紝%d{yyyy-MM-dd}琛ㄧず鏃ユ湡鏍煎紡锛�%i琛ㄧず鏂囦欢绱㈠紩 -->
+            <fileNamePattern>${logging.path}/${serverName}/web-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!-- 瀹氫箟鏃ュ織鏂囦欢婊氬姩绛栫暐鐨勬爣绛撅紝class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"琛ㄧず浣跨敤Logback妗嗘灦鎻愪緵鐨凷izeAndTimeBasedFNATP绫绘潵瀹氫箟鏃ュ織鏂囦欢鐨勬粴鍔ㄧ瓥鐣ワ紝<maxFileSize>100MB</maxFileSize>琛ㄧず鏃ュ織鏂囦欢鐨勬渶澶уぇ灏忎负100MB銆傝繖涓粴鍔ㄧ瓥鐣ラ�氬父鐢ㄤ簬鎸夌収鏃堕棿鍜屾枃浠跺ぇ灏忔粴鍔ㄦ棩蹇楁枃浠讹紝浠ヤ究鏇村ソ鍦扮鐞嗘棩蹇楁枃浠剁殑澶у皬鍜屾暟閲� -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--鏃ュ織鏂囨。淇濈暀澶╂暟-->
+            <maxHistory>15</maxHistory>
+        </rollingPolicy>
+        <!-- 姝ゆ棩蹇楁枃妗e彧璁板綍debug绾у埆鐨� -->
+        <!-- 瀹氫箟鏃ュ織杈撳嚭绾у埆鐨勮繃婊ゅ櫒銆傚湪杩欎釜杩囨护鍣ㄤ腑锛宑lass="ch.qos.logback.classic.filter.LevelFilter"琛ㄧず浣跨敤Logback妗嗘灦鎻愪緵鐨凩evelFilter绫绘潵杩囨护鏃ュ織杈撳嚭锛�<level>debug</level>琛ㄧず鍙緭鍑篸ebug绾у埆鍙婁互涓婄殑鏃ュ織 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>debug</level>
+            <!-- <onMatch>ACCEPT</onMatch>琛ㄧず濡傛灉鏃ュ織浜嬩欢涓庤繃婊ゅ櫒鍖归厤锛屽垯鎺ュ彈璇ヤ簨浠讹紝<onMismatch>DENY</onMismatch>琛ㄧず濡傛灉鏃ュ織浜嬩欢涓庤繃婊ゅ櫒涓嶅尮閰嶏紝鍒欐嫆缁濊浜嬩欢 -->
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+    <!-- 2.2 level涓� INFO 鏃ュ織锛屾椂闂存粴鍔ㄨ緭鍑�  -->
+    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 姝e湪璁板綍鐨勬棩蹇楁枃妗g殑璺緞鍙婃枃妗e悕 -->
+        <file>${logging.path}/${serverName}/web_info.log</file>
+        <!--鏃ュ織鏂囨。杈撳嚭鏍煎紡-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <!-- 鏃ュ織璁板綍鍣ㄧ殑婊氬姩绛栫暐锛屾寜鏃ユ湡锛屾寜澶у皬璁板綍 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 澶╁ぉ鏃ュ織褰掓。璺緞浠ュ強鏍煎紡 -->
+            <fileNamePattern>${logging.path}/${serverName}/web-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--鏃ュ織鏂囨。淇濈暀澶╂暟-->
+            <maxHistory>15</maxHistory>
+        </rollingPolicy>
+        <!-- 姝ゆ棩蹇楁枃妗e彧璁板綍info绾у埆鐨� -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>info</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+    <!-- 2.3 level涓� WARN 鏃ュ織锛屾椂闂存粴鍔ㄨ緭鍑�  -->
+    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 姝e湪璁板綍鐨勬棩蹇楁枃妗g殑璺緞鍙婃枃妗e悕 -->
+        <file>${logging.path}/${serverName}/web_warn.log</file>
+        <!--鏃ュ織鏂囨。杈撳嚭鏍煎紡-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset> <!-- 姝ゅ璁剧疆瀛楃闆� -->
+        </encoder>
+        <!-- 鏃ュ織璁板綍鍣ㄧ殑婊氬姩绛栫暐锛屾寜鏃ユ湡锛屾寜澶у皬璁板綍 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${logging.path}/${serverName}/web-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--鏃ュ織鏂囨。淇濈暀澶╂暟-->
+            <maxHistory>15</maxHistory>
+        </rollingPolicy>
+        <!-- 姝ゆ棩蹇楁枃妗e彧璁板綍warn绾у埆鐨� -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>warn</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+    <!-- 2.4 level涓� ERROR 鏃ュ織锛屾椂闂存粴鍔ㄨ緭鍑�  -->
+    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 姝e湪璁板綍鐨勬棩蹇楁枃妗g殑璺緞鍙婃枃妗e悕 -->
+        <file>${logging.path}/${serverName}/web_error.log</file>
+        <!--鏃ュ織鏂囨。杈撳嚭鏍煎紡-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset> <!-- 姝ゅ璁剧疆瀛楃闆� -->
+        </encoder>
+        <!-- 鏃ュ織璁板綍鍣ㄧ殑婊氬姩绛栫暐锛屾寜鏃ユ湡锛屾寜澶у皬璁板綍 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${logging.path}/${serverName}/web-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--鏃ュ織鏂囨。淇濈暀澶╂暟-->
+            <maxHistory>15</maxHistory>
+        </rollingPolicy>
+        <!-- 姝ゆ棩蹇楁枃妗e彧璁板綍ERROR绾у埆鐨� -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+    <!--     4.1 寮�鍙戠幆澧�:鎵撳嵃鎺у埗鍙�-->
+    <!-- 鐢ㄤ簬鍦⊿pring Boot搴旂敤绋嬪簭涓厤缃棩蹇楄褰曠殑鏍囩銆傚湪杩欎釜鏍囩涓紝name="dev"琛ㄧず杩欎釜閰嶇疆鏂囦欢鍙湪dev鐜涓敓鏁堬紝<logger name="com.myClass.controller" level="debug"/>琛ㄧず涓篶om.myClass.controller锛堟牴鎹笟鍔′慨鏀癸級杩欎釜鍖呬笅鐨勭被閰嶇疆鏃ュ織杈撳嚭绾у埆涓篸ebug -->
+    <!--    <springProfile name="dev">-->
+    <!--        <logger name="com.myClass.controller" level="debug"/>-->
+    <!--    </springProfile>-->
+    <!-- 鐢ㄤ簬閰嶇疆鏃ュ織杈撳嚭鐨勬爣绛俱�傚湪杩欎釜鏍囩涓紝level="info"琛ㄧず鏃ュ織杈撳嚭绾у埆涓篿nfo锛�<appender-ref ref="CONSOLE"/>銆�<appender-ref ref="DEBUG_FILE"/>銆�<appender-ref ref="INFO_FILE"/>銆�<appender-ref ref="WARN_FILE"/>銆�<appender-ref ref="ERROR_FILE"/>琛ㄧず灏嗘棩蹇楄緭鍑哄埌涓嶅悓鐨刟ppender涓紝鍒嗗埆涓烘帶鍒跺彴銆乨ebug鏂囦欢銆乮nfo鏂囦欢銆亀arn鏂囦欢鍜宔rror鏂囦欢 -->
+    <root level="info">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="DEBUG_FILE"/>
+        <appender-ref ref="INFO_FILE"/>
+        <appender-ref ref="WARN_FILE"/>
+        <appender-ref ref="ERROR_FILE"/>
+    </root>
+</configuration>
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/test/java/com/mes/plcConnectModuleApplicationTest.java b/ShangHaiMesParent/moduleService/plcConnectModule/src/test/java/com/mes/plcConnectModuleApplicationTest.java
new file mode 100644
index 0000000..2819180
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/test/java/com/mes/plcConnectModuleApplicationTest.java
@@ -0,0 +1,161 @@
+package com.mes;
+
+import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType;
+import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
+import com.mes.common.JsonConversion;
+import com.mes.common.ReadFile;
+import com.mes.connect.IndustrialInterface.Api;
+import com.mes.connect.IndustrialInterface.IndustrialClient;
+import com.mes.connect.Thread.MachineThread;
+import com.mes.connect.entity.LogicConfig;
+import com.mes.connect.entity.PlcParameters;
+import com.mes.connect.s7.S7Client;
+import com.mes.connect.s7.S7ClientOld;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.sql.Types;
+import java.util.*;
+
+/**
+ * @Author : yanzhixin
+ * @Date: 2024/3/27 16:37
+ * @Description:
+ */
+@Slf4j
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = plcConnectModuleApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class plcConnectModuleApplicationTest {
+
+    @Autowired
+    Api api;
+
+    @Test
+    public void testb() {
+        //byte[] resultValues=new byte[]{99, 23, 67, 76, 45, 49, 48, 45, 56, 48, 47, 55, 48, 67, 76, 45, 51, 45, 55, 51};
+        String s="鐧界幓";
+        log.info(s);
+    }
+    @Test
+    public void testReadJson() {
+        try {
+            LogicConfig logicConfig=JsonConversion.jsonToObjectByJackson(ReadFile.readJson("shelfLogic.json").toString(), LogicConfig.class);
+            PlcParameters plcParameters=JsonConversion.jsonToObjectByJackson(ReadFile.readJson("shelf.json").toString(), PlcParameters.class);
+            log.info("{},{}",logicConfig,plcParameters);
+        }catch (Exception e) {
+
+        }
+    }
+    @Test
+    public void testReadS7Old() throws IOException {
+        S7PLC s7PLC = new S7PLC(EPlcType.S1500, "10.153.19.191", 102, 0, 0);
+        s7PLC.connect();
+        int value= s7PLC.readUInt16("DB8.6");
+        log.info("{},{}",value,s7PLC.checkConnected());
+        s7PLC.close();
+    }
+    @Test
+    public void testReadS7OldClient() throws IOException {
+        IndustrialClient client = new S7ClientOld("S1500","10.153.19.191", 102, 0, 1);
+        client.connect();
+        int value=client.readRegister("S7.DB8.DBW6");
+        log.info("{}",value);
+        client.disconnect();
+    }
+    @Test
+    public void testReadS7() throws IOException {
+        IndustrialClient client=new S7Client("10.153.19.42", 102, 0, 1);;
+        client.connect();
+        // 杩炴帴鍒� PLC
+        System.out.println("鎴愬姛杩炴帴鍒� PLC");
+
+//        // 璇诲彇鍗曚釜浣�
+//        boolean bitValue = client.readBit("S7.DB1.0");
+//        System.out.println("DB1.DBX0.0 鐨勫��: " + bitValue);
+//
+//        // 鍐欏叆鍗曚釜浣�
+//        client.writeBit("DB1.DBX0.1", true);
+//        System.out.println("宸插皢 DB1.DBX0.1 璁剧疆涓� true");
+
+        // 璇诲彇鍗曚釜瀵勫瓨鍣� (Word)
+        int registerValue = client.readRegister("DB1.DBW2");
+        System.out.println("DB1.DBW2 鐨勫��: " + registerValue);
+//
+//        // 鍐欏叆鍗曚釜瀵勫瓨鍣�
+//        client.writeRegister("DB1.DBW4", 12345);
+//        System.out.println("宸插皢 DB1.DBW4 璁剧疆涓� 12345");
+//
+//        // 璇诲彇澶氫釜瀵勫瓨鍣�
+//        int[] registers = client.readRegisters("DB1.DBW6", 3);
+//        System.out.println("DB1.DBW6-DB1.DBW11 鐨勫��: " +
+//                registers[0] + ", " +
+//                registers[1] + ", " +
+//                registers[2]);
+//
+//        // 鍐欏叆澶氫釜瀵勫瓨鍣�
+//        int[] values = {6789, 101112, 131415};
+//        client.writeRegisters("DB1.DBW12", values);
+//        System.out.println("宸插啓鍏ュ涓瘎瀛樺櫒鍊�");
+//
+//        // 璇诲彇娴偣鏁�
+//        float floatValue = client.readFloat("DB1.DBD18");
+//        System.out.println("DB1.DBD18 鐨勬诞鐐瑰��: " + floatValue);
+//
+//        // 鍐欏叆娴偣鏁�
+//        client.writeFloat("DB1.DBD22", 3.14159f);
+//        System.out.println("宸插皢 DB1.DBD22 璁剧疆涓� 3.14159");
+//
+//        // 璇诲彇瀛楃涓�
+//        String stringValue = client.readString("DB1.DBW26", 10);
+//        System.out.println("DB1.DBW26 寮�濮嬬殑瀛楃涓�: " + stringValue);
+//
+//        // 鍐欏叆瀛楃涓�
+//        client.writeString("DB1.DBW36", "Hello PLC");
+//        System.out.println("宸插啓鍏ュ瓧绗︿覆 'Hello PLC'");
+    }
+    @Test
+    public void testApi() {
+        //Http鎺ュ彛娴嬭瘯
+//        Map<String, Object> data=new HashMap<>();
+//        data.put("method","POST");
+//        String resultHttp[]= api.httpApi("http://localhost:8082/account/testApi",data);
+//        log.info("{}",resultHttp);
+
+        // 鏌ヨ甯﹀崟涓弬鏁扮殑瑙嗗浘
+//        Map<String, Object> params = new HashMap<>();
+//        params.put("width", 699); // 鍙傛暟鍚嶄笌SQL涓殑鍒楀悕涓�鑷�
+//        String resultView[]= api.viewApi("procedurename",null);
+//        log.info("{}",resultView);
+
+        // 绀轰緥 璋冪敤testProcedure瀛樺偍杩囩▼
+//        Map<String, Object> params = new HashMap<>();
+//        params.put("dataParmars", "娴嬭瘯鏁版嵁"); // 杈撳叆鍙傛暟锛屽搴斿瓨鍌ㄨ繃绋嬩腑鐨処N鍙傛暟
+//        Map<String, Object> outParams = new HashMap<>();
+//        outParams.put("messagedate", Types.VARCHAR); // 杈撳嚭鍙傛暟锛屽搴斿瓨鍌ㄨ繃绋嬩腑鐨凮UT鍙傛暟
+//        String[] resultProcedure = api.procedureAPI("testProcedure", params, outParams);
+//        // 鎵撳嵃鎵ц缁撴灉
+//        log.info("{}瀛樺偍杩囩▼鎵ц缁撴灉:{}",params,resultProcedure);
+    }
+    @Test
+    public void testMainThread() {
+        Thread thread = new Thread(() -> {
+            while (true) {
+                log.info(new Date().toString());
+            }
+
+        });
+        thread.start();
+    }
+    @Test
+    public void testMain() {
+
+    }
+
+}
diff --git a/ShangHaiMesParent/moduleService/plcConnectModule/src/test/test.iml b/ShangHaiMesParent/moduleService/plcConnectModule/src/test/test.iml
new file mode 100644
index 0000000..a0e49a3
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/plcConnectModule/src/test/test.iml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/java" isTestSource="true" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/ShangHaiMesParent/moduleService/pom.xml b/ShangHaiMesParent/moduleService/pom.xml
new file mode 100644
index 0000000..0ed4eaf
--- /dev/null
+++ b/ShangHaiMesParent/moduleService/pom.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>ShangHaiMesParent</artifactId>
+        <groupId>com.mes</groupId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>moduleService</artifactId>
+    <packaging>pom</packaging>
+    <modules>
+        <module>plcConnectModule</module>
+<!--        <module>CacheVerticalGlassModule</module>-->
+<!--        <module>LoadGlassModule</module>-->
+<!--        <module>TemperingGlassModule</module>-->
+<!--        <module>UnLoadGlassModule</module>-->
+<!--        <module>GlassStorageModule</module>-->
+    </modules>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+    <dependencies>
+        <!--web 闇�瑕佸惎鍔ㄩ」鐩�-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+            <version>2.0</version>
+        </dependency>
+
+        <!--渚濊禆鏈嶅姟鐨勫伐鍏风被-->
+        <!--        <dependency>-->
+        <!--            <groupId>com.mes</groupId>-->
+        <!--            <artifactId>common</artifactId>-->
+        <!--            <version>1.0-SNAPSHOT</version>-->
+        <!--        </dependency>-->
+
+        <dependency>
+            <artifactId>servicebase</artifactId>
+            <groupId>com.mes</groupId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+<!--        <dependency>-->
+<!--            <artifactId>springsecurity</artifactId>-->
+<!--            <groupId>com.mes</groupId>-->
+<!--            <version>1.0-SNAPSHOT</version>-->
+<!--        </dependency>-->
+
+        <!--寮�鍙戣�呭伐鍏�-->
+        <!--        <dependency>-->
+        <!--            <groupId>org.springframework.boot</groupId>-->
+        <!--            <artifactId>spring-boot-devtools</artifactId>-->
+        <!--            <optional>true</optional>-->
+        <!--        </dependency>-->
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/ShangHaiMesParent/pom.xml b/ShangHaiMesParent/pom.xml
new file mode 100644
index 0000000..0526d03
--- /dev/null
+++ b/ShangHaiMesParent/pom.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.mes</groupId>
+    <artifactId>ShangHaiMesParent</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <modules>
+        <module>common</module>
+        <module>moduleService</module>
+        <module>gateway</module>
+    </modules>
+    <packaging>pom</packaging>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.1.8.RELEASE</version>
+        <relativePath/>
+    </parent>
+
+    <properties>
+        <!-- 璺宠繃娴嬭瘯 -->
+        <skipTests>true</skipTests>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>Greenwich.SR3</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba.cloud</groupId>
+                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
+                <version>2.1.0.RELEASE</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <repositories>
+        <repository>
+            <id>nexus-aliyun</id>
+            <name>Nexus aliyun</name>
+            <layout>default</layout>
+            <url>https://maven.aliyun.com/repository/public</url>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+        </repository>
+        <repository>
+            <id>spring</id>
+            <url>https://maven.aliyun.com/repository/spring</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+
+</project>
\ No newline at end of file
diff --git a/ShangHaiMesParent/readMe.md b/ShangHaiMesParent/readMe.md
new file mode 100644
index 0000000..d2ffe19
--- /dev/null
+++ b/ShangHaiMesParent/readMe.md
@@ -0,0 +1,18 @@
+1銆佹湰椤圭洰鏄熀浜嶴pringBoot+Mybatis-plus+Mysql+Vue+ElementUI+Maven+Nginx鐨勯」鐩�,鐩綍缁撴灉缁撴瀯濡備笅锛�
+
+    鈹溾攢src
+    鈹溾攢com   鎻掍欢鐢熸垚鐨勪唬鐮侊紝鐢ㄤ簬鍚勮嚜寮�鍙戜娇鐢�
+    鈹�  鈹斺攢mes
+    鈹溾攢common  鍏叡妯″潡
+    鈹�  鈹溾攢src
+    鈹斺攢moduleService
+        鈹溾攢-CacheGlassModule
+        鈹溾攢-CacheVerticalGlassModule
+        鈹溾攢-LoadGlassModule
+        鈹溾攢-TemperingGlassModule
+        鈹斺攢-UnLoadGlassModule
+
+2銆佽繍琛岄」鐩細 1銆佸惎鍔ㄩ」鐩細鍚姩鍚勮嚜妯″潡鍚姩绫� 渚嬪锛欳acheGlassModuleApplication.java#main()
+2銆佽闂」鐩細 3銆侀」鐩湴鍧�锛歨ttp://localhost:8081/mesModuleCache/doc.html#/home
+4銆侀」鐩鏄庯細 鏈晫闈负Api鏂囨。锛屽叕寮�浜哄憳鐢ㄤ簬璋冭瘯 3銆侀」鐩鏄庯細 1銆侀」鐩垎涓哄叕鍏辨ā鍧梒ommon锛屼笟鍔℃ā鍧梞oduleService銆� 2銆乧ommon妯″潡涓寘鍚叕鍏辩殑绫伙紝渚嬪锛氬叕鍏辩殑瀹炰綋绫汇�佹嫤鎴櫒銆佸伐鍏风被銆佸父閲忕被銆佸紓甯稿鐞嗙瓑銆�
+3銆乵oduleService涓寘鍚悇涓笟鍔℃ā鍧楋紝姣忎釜涓氬姟妯″潡涓寘鍚竴涓惎鍔ㄧ被,寮�鍙戜汉鍛橀渶瑕佸紑鍙戝悇鑷礋璐g殑涓氬姟妯″潡銆� 4銆乧om鐩綍涓嬬殑鏂囦欢涓烘彃浠剁敓鎴愮殑浠g爜锛岀敤浜庡悇鑷紑鍙戜娇鐢ㄣ�傜敤瀹屽垹闄ゅ嵆鍙紝閬垮厤褰卞搷寮�鍙戙��
\ No newline at end of file

--
Gitblit v1.8.0