浏览代码

添加banner,工程分享、工程导入

一只小菜杨 2 月之前
父节点
当前提交
4a9731b30e
共有 14 个文件被更改,包括 297 次插入567 次删除
  1. 1 1
      components.d.ts
  2. 2 0
      package.json
  3. 173 6
      pnpm-lock.yaml
  4. 二进制
      src/assets/images/banner1.png
  5. 二进制
      src/assets/images/banner2.png
  6. 二进制
      src/assets/images/banner3.png
  7. 二进制
      src/assets/images/banner4.png
  8. 二进制
      src/assets/images/banner5.png
  9. 2 2
      src/stores/global.ts
  10. 4 0
      src/utils/tools.ts
  11. 47 2
      src/views/Automate.vue
  12. 7 5
      src/views/Home.vue
  13. 61 1
      src/views/ProjectInfo.vue
  14. 0 550
      test.xml

+ 1 - 1
components.d.ts

@@ -19,7 +19,7 @@ declare module 'vue' {
     VanField: typeof import('vant/es')['Field']
     VanForm: typeof import('vant/es')['Form']
     VanIcon: typeof import('vant/es')['Icon']
-    VanLoading: typeof import('vant/es')['Loading']
+    VanImage: typeof import('vant/es')['Image']
     VanNumberKeyboard: typeof import('vant/es')['NumberKeyboard']
     VanPicker: typeof import('vant/es')['Picker']
     VanPopup: typeof import('vant/es')['Popup']

+ 2 - 0
package.json

@@ -13,8 +13,10 @@
     "format": "prettier --write src/"
   },
   "dependencies": {
+    "@types/qrcode": "^1.5.5",
     "pinia": "^2.3.0",
     "pinia-plugin-persistedstate": "^4.2.0",
+    "qrcode": "^1.5.4",
     "uuid": "^11.0.5",
     "vant": "^4.9.15",
     "vue": "^3.5.13",

+ 173 - 6
pnpm-lock.yaml

@@ -5,12 +5,18 @@ settings:
   excludeLinksFromLockfile: false
 
 dependencies:
+  '@types/qrcode':
+    specifier: ^1.5.5
+    version: 1.5.5
   pinia:
     specifier: ^2.3.0
     version: 2.3.1(typescript@5.6.3)(vue@3.5.13)
   pinia-plugin-persistedstate:
     specifier: ^4.2.0
     version: 4.2.0(pinia@2.3.1)
+  qrcode:
+    specifier: ^1.5.4
+    version: 1.5.4
   uuid:
     specifier: ^11.0.5
     version: 11.1.0
@@ -1825,7 +1831,12 @@ packages:
     resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==}
     dependencies:
       undici-types: 6.20.0
-    dev: true
+
+  /@types/qrcode@1.5.5:
+    resolution: {integrity: sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==}
+    dependencies:
+      '@types/node': 22.13.10
+    dev: false
 
   /@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1)(eslint@9.22.0)(typescript@5.6.3):
     resolution: {integrity: sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==}
@@ -2256,12 +2267,16 @@ packages:
     resolution: {integrity: sha512-DJqqQD3XcsaQcQ1s+iE2jDUZmmQpXwHiR6fCAim/w87luaW+vmLY8fMlrdkmRwzaFXhkxf3rqPCR59tKVv1MDw==}
     dev: true
 
+  /ansi-regex@5.0.1:
+    resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+    engines: {node: '>=8'}
+    dev: false
+
   /ansi-styles@4.3.0:
     resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
     engines: {node: '>=8'}
     dependencies:
       color-convert: 2.0.1
-    dev: true
 
   /ansi-styles@6.2.1:
     resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
@@ -2412,6 +2427,11 @@ packages:
     engines: {node: '>=6'}
     dev: true
 
+  /camelcase@5.3.1:
+    resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+    engines: {node: '>=6'}
+    dev: false
+
   /caniuse-lite@1.0.30001703:
     resolution: {integrity: sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==}
     dev: true
@@ -2452,16 +2472,22 @@ packages:
       consola: 3.4.0
     dev: false
 
+  /cliui@6.0.0:
+    resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==}
+    dependencies:
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      wrap-ansi: 6.2.0
+    dev: false
+
   /color-convert@2.0.1:
     resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
     engines: {node: '>=7.0.0'}
     dependencies:
       color-name: 1.1.4
-    dev: true
 
   /color-name@1.1.4:
     resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
-    dev: true
 
   /commander@2.20.3:
     resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
@@ -2538,6 +2564,11 @@ packages:
       ms: 2.1.3
     dev: true
 
+  /decamelize@1.2.0:
+    resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
+    engines: {node: '>=0.10.0'}
+    dev: false
+
   /deep-is@0.1.4:
     resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
     dev: true
@@ -2572,6 +2603,10 @@ packages:
     resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==}
     dev: false
 
+  /dijkstrajs@1.0.3:
+    resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==}
+    dev: false
+
   /dotenv@16.4.7:
     resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==}
     engines: {node: '>=12'}
@@ -2581,6 +2616,10 @@ packages:
     resolution: {integrity: sha512-MN1nahVHAQMOz6dz6bNZ7apgqc9InZy7Ja4DBEVCTdeiUcegbyOYE9bi/f2Z/z6ZxLi0RxLpyJ3EGe+4h3w73A==}
     dev: true
 
+  /emoji-regex@8.0.0:
+    resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+    dev: false
+
   /entities@4.5.0:
     resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
     engines: {node: '>=0.12'}
@@ -2896,6 +2935,14 @@ packages:
     dependencies:
       to-regex-range: 5.0.1
 
+  /find-up@4.1.0:
+    resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+    engines: {node: '>=8'}
+    dependencies:
+      locate-path: 5.0.0
+      path-exists: 4.0.0
+    dev: false
+
   /find-up@5.0.0:
     resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
     engines: {node: '>=10'}
@@ -2942,6 +2989,11 @@ packages:
     engines: {node: '>=6.9.0'}
     dev: true
 
+  /get-caller-file@2.0.5:
+    resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+    engines: {node: 6.* || 8.* || >= 10.*}
+    dev: false
+
   /get-stream@9.0.1:
     resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==}
     engines: {node: '>=18'}
@@ -3085,6 +3137,11 @@ packages:
     resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
     engines: {node: '>=0.10.0'}
 
+  /is-fullwidth-code-point@3.0.0:
+    resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+    engines: {node: '>=8'}
+    dev: false
+
   /is-glob@4.0.3:
     resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
     engines: {node: '>=0.10.0'}
@@ -3236,6 +3293,13 @@ packages:
       pkg-types: 2.1.0
       quansync: 0.2.8
 
+  /locate-path@5.0.0:
+    resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+    engines: {node: '>=8'}
+    dependencies:
+      p-locate: 4.1.0
+    dev: false
+
   /locate-path@6.0.0:
     resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
     engines: {node: '>=10'}
@@ -3425,6 +3489,13 @@ packages:
       word-wrap: 1.2.5
     dev: true
 
+  /p-limit@2.3.0:
+    resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+    engines: {node: '>=6'}
+    dependencies:
+      p-try: 2.2.0
+    dev: false
+
   /p-limit@3.1.0:
     resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
     engines: {node: '>=10'}
@@ -3432,6 +3503,13 @@ packages:
       yocto-queue: 0.1.0
     dev: true
 
+  /p-locate@4.1.0:
+    resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+    engines: {node: '>=8'}
+    dependencies:
+      p-limit: 2.3.0
+    dev: false
+
   /p-locate@5.0.0:
     resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
     engines: {node: '>=10'}
@@ -3439,6 +3517,11 @@ packages:
       p-limit: 3.1.0
     dev: true
 
+  /p-try@2.2.0:
+    resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+    engines: {node: '>=6'}
+    dev: false
+
   /parent-module@1.0.1:
     resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
     engines: {node: '>=6'}
@@ -3458,7 +3541,6 @@ packages:
   /path-exists@4.0.0:
     resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
     engines: {node: '>=8'}
-    dev: true
 
   /path-key@3.1.1:
     resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
@@ -3553,6 +3635,11 @@ packages:
       exsolve: 1.0.4
       pathe: 2.0.3
 
+  /pngjs@5.0.0:
+    resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==}
+    engines: {node: '>=10.13.0'}
+    dev: false
+
   /postcss-pxtorem@6.1.0(postcss@8.5.3):
     resolution: {integrity: sha512-ROODSNci9ADal3zUcPHOF/K83TiCgNSPXQFSbwyPHNV8ioHIE4SaC+FPOufd8jsr5jV2uIz29v1Uqy1c4ov42g==}
     peerDependencies:
@@ -3607,6 +3694,16 @@ packages:
     engines: {node: '>=6'}
     dev: true
 
+  /qrcode@1.5.4:
+    resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
+    dependencies:
+      dijkstrajs: 1.0.3
+      pngjs: 5.0.0
+      yargs: 15.4.1
+    dev: false
+
   /quansync@0.2.8:
     resolution: {integrity: sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA==}
 
@@ -3684,6 +3781,15 @@ packages:
       jsesc: 3.0.2
     dev: true
 
+  /require-directory@2.1.1:
+    resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+    engines: {node: '>=0.10.0'}
+    dev: false
+
+  /require-main-filename@2.0.0:
+    resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
+    dev: false
+
   /resolve-from@4.0.0:
     resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
     engines: {node: '>=4'}
@@ -3759,6 +3865,10 @@ packages:
     engines: {node: '>=10'}
     hasBin: true
 
+  /set-blocking@2.0.0:
+    resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
+    dev: false
+
   /shebang-command@2.0.0:
     resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
     engines: {node: '>=8'}
@@ -3820,6 +3930,22 @@ packages:
     resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==}
     dev: false
 
+  /string-width@4.2.3:
+    resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+    engines: {node: '>=8'}
+    dependencies:
+      emoji-regex: 8.0.0
+      is-fullwidth-code-point: 3.0.0
+      strip-ansi: 6.0.1
+    dev: false
+
+  /strip-ansi@6.0.1:
+    resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+    engines: {node: '>=8'}
+    dependencies:
+      ansi-regex: 5.0.1
+    dev: false
+
   /strip-final-newline@4.0.0:
     resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==}
     engines: {node: '>=18'}
@@ -3959,7 +4085,6 @@ packages:
 
   /undici-types@6.20.0:
     resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
-    dev: true
 
   /unicode-canonical-property-names-ecmascript@2.0.1:
     resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==}
@@ -4335,6 +4460,10 @@ packages:
   /webpack-virtual-modules@0.6.2:
     resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
 
+  /which-module@2.0.1:
+    resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
+    dev: false
+
   /which@2.0.2:
     resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
     engines: {node: '>= 8'}
@@ -4356,15 +4485,53 @@ packages:
     engines: {node: '>=0.10.0'}
     dev: true
 
+  /wrap-ansi@6.2.0:
+    resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+    engines: {node: '>=8'}
+    dependencies:
+      ansi-styles: 4.3.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+    dev: false
+
   /xml-name-validator@4.0.0:
     resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
     engines: {node: '>=12'}
     dev: true
 
+  /y18n@4.0.3:
+    resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
+    dev: false
+
   /yallist@3.1.1:
     resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
     dev: true
 
+  /yargs-parser@18.1.3:
+    resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}
+    engines: {node: '>=6'}
+    dependencies:
+      camelcase: 5.3.1
+      decamelize: 1.2.0
+    dev: false
+
+  /yargs@15.4.1:
+    resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==}
+    engines: {node: '>=8'}
+    dependencies:
+      cliui: 6.0.0
+      decamelize: 1.2.0
+      find-up: 4.1.0
+      get-caller-file: 2.0.5
+      require-directory: 2.1.1
+      require-main-filename: 2.0.0
+      set-blocking: 2.0.0
+      string-width: 4.2.3
+      which-module: 2.0.1
+      y18n: 4.0.3
+      yargs-parser: 18.1.3
+    dev: false
+
   /yocto-queue@0.1.0:
     resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
     engines: {node: '>=10'}

二进制
src/assets/images/banner1.png


二进制
src/assets/images/banner2.png


二进制
src/assets/images/banner3.png


二进制
src/assets/images/banner4.png


二进制
src/assets/images/banner5.png


+ 2 - 2
src/stores/global.ts

@@ -7,8 +7,8 @@ export const useGlobalStore = defineStore(
     const projectList = ref<ProjectType[]>([
       {
         name: '工程1',
-        id: '1',
-        time: '2025-01-09 16:00:00',
+        id: Date.now() + '',
+        time: new Date().toLocaleString(),
         commandList: [
           {
             name: '任务1',

+ 4 - 0
src/utils/tools.ts

@@ -57,3 +57,7 @@ export const formatDateTime = (date: string | Date | number, joinStr = ' ') => {
 
   return `${year}-${month}-${day}${joinStr}${hours}:${minutes}:${seconds}`
 }
+
+export const requireImgUrl = (src: string) => {
+  return new URL(`../assets/images/${src}`, import.meta.url).href
+}

+ 47 - 2
src/views/Automate.vue

@@ -7,7 +7,12 @@
           <div class="back" @click="touchStatus = false"><van-icon name="arrow-left" />返回工程</div></template
         >
       </div>
-      <van-button v-show="!touchStatus" size="small" type="primary" @click="popupShow = true">新建工程</van-button>
+      <div class="btn-group">
+        <van-button v-show="!touchStatus" size="small" type="warning" @click="importProject" style="margin-right: 8px"
+          >工程导入</van-button
+        >
+        <van-button v-show="!touchStatus" size="small" type="primary" @click="popupShow = true">新建工程</van-button>
+      </div>
     </div>
 
     <div class="project-container">
@@ -73,7 +78,7 @@ const handleCheckedChange = (names: string[]) => {
   console.log(names)
 }
 
-let touchTimer: number
+let touchTimer: any
 const touchStatus = ref(false)
 const handleTouchStart = () => {
   touchTimer = setTimeout(() => {
@@ -128,6 +133,46 @@ const handleCancel = async () => {
   await nextTick()
   newProjectName.value = ''
 }
+
+const wx = window.wx
+const initWxEnv = () => {
+  const url = location.origin + location.pathname + location.search
+  const wxConfigStr = localStorage.getItem(url)
+  if (!wxConfigStr) showFailToast('初始化失败')
+  else {
+    const wxConfig = JSON.parse(wxConfigStr)
+    wx.config(wxConfig)
+    wx.ready(function () {
+      console.log('微信初始化成功')
+    })
+    wx.error(function (res: any) {
+      console.log('微信初始化失败', res)
+    })
+  }
+}
+initWxEnv()
+const importProject = () => {
+  wx.scanQRCode({
+    needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
+    scanType: ['qrCode', 'barCode'], // 可以指定扫二维码还是一维码,默认二者都有
+    success: function (res: any) {
+      if (res.errMsg !== 'scanQRCode:ok') return showFailToast('扫描失败')
+      const projectStr = res.resultStr
+      try {
+        const newProject = JSON.parse(projectStr)
+        if (newProject.qrcodeType !== 'worldflying_plc_editor') return showFailToast('扫描失败')
+        newProject.id = Date.now() + ''
+        newProject.time = new Date().toLocaleString()
+        newProject.isCompiled = false
+        newProject.CompileTime = ''
+        projectList.value.unshift(newProject)
+        showSuccessToast('导入成功')
+      } catch (error) {
+        showFailToast('扫描失败')
+      }
+    }
+  })
+}
 </script>
 
 <style scoped>

+ 7 - 5
src/views/Home.vue

@@ -2,10 +2,9 @@
   <div class="home-container">
     <div class="banner">
       <van-swipe :autoplay="3000" indicator-color="white">
-        <van-swipe-item>1</van-swipe-item>
-        <van-swipe-item>2</van-swipe-item>
-        <van-swipe-item>3</van-swipe-item>
-        <van-swipe-item>4</van-swipe-item>
+        <van-swipe-item v-for="item in 5">
+          <van-image :src="requireImgUrl(`banner${item}.png`)"/>
+        </van-swipe-item>
       </van-swipe>
     </div>
 
@@ -28,6 +27,7 @@
 <script setup lang="ts">
 import { useGlobalStore } from '@/stores/global'
 import { storeToRefs } from 'pinia'
+import { requireImgUrl } from '@/utils/tools'
 
 const { projectList } = storeToRefs(useGlobalStore())
 const router = useRouter()
@@ -46,10 +46,12 @@ const router = useRouter()
 .van-swipe .van-swipe-item {
   color: #fff;
   font-size: 20px;
-  line-height: 150px;
   text-align: center;
   background-color: #4fb5f9;
 }
+.van-image {
+  display: block;
+}
 .recent-file .label {
   position: relative;
   margin-bottom: 16px;

+ 61 - 1
src/views/ProjectInfo.vue

@@ -46,6 +46,7 @@
           </template>
         </van-cell>
         <van-cell title="删除工程" @click="delProject" clickable :title-style="{ color: '#fd5632' }" />
+        <van-cell title="分享" @click="shareProject" clickable />
       </van-cell-group>
     </van-popup>
 
@@ -68,6 +69,14 @@
         </div>
       </van-form>
     </van-popup>
+
+    <van-popup v-model:show="showSharePopup" round :style="{ width: '80%' }">
+      <div class="share-container">
+        <!-- <canvas ref="qrcodeCanvas"></canvas> -->
+        <img :src="shareImg" alt="" width="100%" />
+        <div class="tip">长按图片进行分享</div>
+      </div>
+    </van-popup>
   </div>
 </template>
 
@@ -78,6 +87,7 @@ import { formatDateTime, deepEqual, deepClone } from '@/utils/tools'
 import { storeToRefs } from 'pinia'
 import { v4 as uuid4 } from 'uuid'
 import { showConfirmDialog, showLoadingToast, showFailToast } from 'vant'
+import qrcode from 'qrcode'
 
 const route = useRoute()
 const router = useRouter()
@@ -134,6 +144,7 @@ watch(
           wxtag.value = `<wx-open-launch-weapp appid="wx4c5a777c71f2981c" path="pages/index/rj45cfgbybt/plc/index?imgurl=${imgobj.url}"><template><text style="color: #7232dd">烧录设备</text></template></wx-open-launch-weapp>`
         } else {
           crtProject.value!.isCompiled = false
+          localStorage.removeItem('imgobj' + crtProject.value!.id)
         }
       } catch (e) {
         console.log(e)
@@ -147,7 +158,7 @@ watch(
   }
 )
 
-let touchTimer: number
+let touchTimer: any
 const touchStatus = ref(false)
 const handleTouchStart = () => {
   touchTimer = setTimeout(() => {
@@ -1504,6 +1515,44 @@ const delProject = () => {
       })
   }
 }
+
+const showSharePopup = ref(false)
+const shareImg = ref('')
+// const qrcodeCanvas = ref<HTMLCanvasElement>()
+const shareProject = async () => {
+  showSharePopup.value = true
+  await nextTick()
+  qrcode.toDataURL(
+    JSON.stringify({ ...crtProject.value, qrcodeType: 'worldflying_plc_editor' }),
+    function (error, url) {
+      if (error) console.error(error)
+      // console.log(url)
+      const ratio = window.devicePixelRatio
+      const canvasEl = document.createElement('canvas')
+      const windowWidth = window.innerWidth
+      const windowHeight = window.innerHeight
+      const minWindowSize = Math.floor(Math.min(windowWidth, windowHeight) * 0.7)
+      canvasEl.style.width = `${minWindowSize}px`
+      canvasEl.style.height = `${minWindowSize + 50}px`
+      canvasEl.width = minWindowSize * ratio
+      canvasEl.height = (minWindowSize + 50) * ratio
+      const ctx = canvasEl?.getContext('2d')
+      if (ctx) {
+        const fontSize = 16 * ratio
+        ctx.font = `${fontSize}px Arial`
+        ctx.fillText(`工程名称:${crtProject.value?.name}`, 20 * ratio, 35 * ratio)
+        const img = new Image()
+        img.src = url
+        img.onload = function () {
+          ctx.drawImage(img, 0, 50 * ratio, minWindowSize * ratio, minWindowSize * ratio)
+          shareImg.value = canvasEl.toDataURL('image/png')
+        }
+      }
+      canvasEl.remove()
+    }
+  )
+}
+
 const getSTFile = () => {
   if (!crtProject.value) return
   let st = ''
@@ -1599,4 +1648,15 @@ const getSTFile = () => {
   justify-content: flex-end;
   gap: 8px;
 }
+.share-container {
+  padding: 16px;
+  display: flex;
+  justify-content: center;
+  flex-direction: column;
+  align-items: center;
+}
+.share-container .tip {
+  margin: 16px 0;
+  font-size: 18px;
+}
 </style>

+ 0 - 550
test.xml

@@ -1,550 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-    <project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:ns1="http://www.plcopen.org/xml/tc6.xsd">
-      <fileHeader companyName="未知" productName="未命名" productVersion="1.0" creationDateTime="2025-01-24T18:58:06" />
-      <contentHeader name="项目1" modificationDateTime="2025-01-24T18:58:06">
-        <coordinateInfo>
-          <fbd>
-            <scaling x="10" y="10"/>
-          </fbd>
-          <ld>
-            <scaling x="10" y="10"/>
-          </ld>
-          <sfc>
-            <scaling x="10" y="10"/>
-          </sfc>
-        </coordinateInfo>
-      </contentHeader>
-      <types>
-        <dataTypes/>
-        <pous>
-        <pou name="program0" pouType="program">
-              <interface>
-                <localVars>
-                  <variable name="DI1">
-                    <type><BOOL /></type>
-                  </variable>
-                  <variable name="DI2">
-                    <type><BOOL /></type>
-                  </variable>
-                  <variable name="AI1">
-                    <type><INT /></type>
-                  </variable>
-                  <variable name="AI2">
-                    <type><INT /></type>
-                  </variable>
-                  <variable name="DO1">
-                    <type><BOOL /></type>
-                  </variable>
-                  <variable name="DO2">
-                    <type><BOOL /></type>
-                  </variable>
-                  <variable name="AO1">
-                    <type><INT /></type>
-                  </variable>
-                  <variable name="AO2">
-                    <type><INT /></type>
-                  </variable>
-                  <variable name="MOD_HOUR">
-                    <type><ULINT /></type>
-                    <initialValue>
-                      <simpleValue value="24" />
-                    </initialValue>
-                  </variable>
-                  <variable name="HOURS">
-                    <type><ULINT /></type>
-                    <initialValue>
-                      <simpleValue value="3600" />
-                    </initialValue>
-                  </variable>
-                  <variable name="DAYS">
-                    <type><ULINT /></type>
-                    <initialValue>
-                      <simpleValue value="86400" />
-                    </initialValue>
-                  </variable>
-                  <variable name="MOD_WEEK">
-                    <type><ULINT /></type>
-                    <initialValue>
-                      <simpleValue value="7" />
-                    </initialValue>
-                  </variable>
-                  <variable name="MIN">
-                    <type><ULINT /></type>
-                    <initialValue>
-                      <simpleValue value="60" />
-                    </initialValue>
-                  </variable>
-                  <variable name="DATE">
-                    <type><DT /></type>
-                    <initialValue>
-                      <simpleValue value="DT#2025-01-24T18:58:06" />
-                    </initialValue>
-                  </variable>
-                <variable name="temp1">
-                <type><BOOL /></type>
-              </variable><variable name="RTC0_2">
-                      <type>
-                        <derived name="RTC" />
-                      </type>
-                    </variable><variable name="HOUR0_2">
-                      <type><ULINT /></type>
-                        <initialValue>
-                          <simpleValue value="8" />
-                        </initialValue>
-                    </variable><variable name="MIN0_2">
-                      <type><ULINT /></type>
-                        <initialValue>
-                          <simpleValue value="0" />
-                        </initialValue>
-                    </variable><variable name="TON1">
-                  <type>
-                    <derived name="TON" />
-                  </type>
-                </variable>
-                <variable name="PT1">
-                  <type>
-                    <TIME />
-                  </type>
-                  <initialValue>
-                    <simpleValue value="T#1000s" />
-                  </initialValue>
-                </variable></localVars></interface><body><LD><leftPowerRail localId="11"  width="20" height="40">
-        <position x="100" y="100"/><connectionPointOut formalParameter=""><relPosition x="40" y="20"/></connectionPointOut></leftPowerRail><contact localId="111" negated="false" width="40" height="40"><position x="300" y="100" />
-            <connectionPointIn>
-              <relPosition x="-20" y="20" />
-              <connection refLocalId="11">
-                <position x="140" y="120" />
-                <position x="280" y="120" />
-              </connection>
-            </connectionPointIn>
-            <connectionPointOut>
-              <relPosition x="60" y="20"/>
-            </connectionPointOut>
-            <variable>DI1</variable>
-            </contact>
-            <inVariable localId="10211" width="40" height="40" negated="false">
-              <position x="200" y="900" />
-              <connectionPointOut>
-                <relPosition x="60" y="20" />
-              </connectionPointOut>
-              <expression>DATE</expression>
-            </inVariable>
-            <block
-              localId="10212"
-              typeName="RTC"
-              instanceName="RTC0_2"
-              width="80"
-              height="80"
-            >
-              <position x="300" y="700" />
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="-20" y="20" />
-                    <connection refLocalId="11">
-                      <position x="140" y="120" />
-                      <position x="280" y="720" />
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="PDT">
-                  <connectionPointIn>
-                    <relPosition x="-20" y="60" />
-                    <connection refLocalId="10211">
-                      <position x="260" y="920" />
-                      <position x="280" y="760" />
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables />
-              <outputVariables>
-                <variable formalParameter="Q">
-                  <connectionPointOut>
-                    <relPosition x="100" y="20" />
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="CDT">
-                  <connectionPointOut>
-                    <relPosition x="100" y="60" />
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            
-            <block localId="10213" typeName="DT_TO_ULINT" width="100" height="40">
-              <position x="500" y="700" />
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="-20" y="20" />
-                    <connection refLocalId="10212">
-                      <position x="400" y="760" />
-                      <position x="480" y="720" />
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables />
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="120" y="20" />
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="10220" width="40" height="40" negated="false">
-              <position x="1200" y="900" />
-              <connectionPointOut>
-                <relPosition x="60" y="20" />
-              </connectionPointOut>
-              <expression>HOURS</expression>
-            </inVariable>
-            <block localId="10221" typeName="DIV" width="70" height="60">
-              <position x="1300" y="700" />
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="-20" y="20" />
-                    <connection refLocalId="10213" formalParameter="OUT">
-                      <position x="1260" y="820" />
-                      <position x="1280" y="720" />
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="-20" y="40" />
-                    <connection refLocalId="10220">
-                      <position x="1260" y="920" />
-                      <position x="1280" y="720" />
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables />
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="90" y="20" />
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            
-            <inVariable localId="10222" width="40" height="40" negated="false">
-              <position x="1400" y="900" />
-              <connectionPointOut>
-                <relPosition x="60" y="20" />
-              </connectionPointOut>
-              <expression>MOD_HOUR</expression>
-            </inVariable>
-            <block localId="10223" typeName="MOD" width="70" height="60">
-              <position x="1500" y="700" />
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="-20" y="20" />
-                    <connection refLocalId="10221" formalParameter="OUT">
-                      <position x="1390" y="720" />
-                      <position x="1480" y="720" />
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="-20" y="40" />
-                    <connection refLocalId="10222">
-                      <position x="1460" y="920" />
-                      <position x="1480" y="740" />
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables />
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="90" y="20" />
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            
-            <inVariable localId="10224" width="40" height="40" negated="false">
-              <position x="1600" y="900" />
-              <connectionPointOut>
-                <relPosition x="60" y="20" />
-              </connectionPointOut>
-              <expression>HOUR0_2</expression>
-            </inVariable>
-            <block localId="10225" typeName="GT" width="70" height="60">
-              <position x="1700" y="700" />
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="-20" y="20" />
-                    <connection refLocalId="10223" formalParameter="OUT">
-                      <position x="1590" y="720" />
-                      <position x="1680" y="720" />
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="-20" y="40" />
-                    <connection refLocalId="10224" formalParameter="OUT">
-                      <position x="1660" y="920" />
-                      <position x="1680" y="740" />
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables />
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="90" y="20" />
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            
-            <inVariable localId="10222" width="40" height="40" negated="false">
-              <position x="1800" y="900" />
-              <connectionPointOut>
-                <relPosition x="60" y="20" />
-              </connectionPointOut>
-              <expression>MIN</expression>
-            </inVariable>
-            <block localId="10227" typeName="DIV" width="70" height="60">
-              <position x="1900" y="700" />
-              <inputVariables>
-              <variable formalParameter="EN">
-                  <connectionPointIn>
-                    <relPosition x="-20" y="20"/>
-                    <connection refLocalId="38" formalParameter="OUT">
-                      <position x="1790" y="720"/>
-                      <position x="1880" y="720"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="-20" y="20" />
-                    <connection refLocalId="10225" formalParameter="OUT">
-                      <position x="1790" y="720" />
-                      <position x="1880" y="720" />
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="-20" y="40" />
-                    <connection refLocalId="10226">
-                      <position x="1860" y="920" />
-                      <position x="1880" y="740" />
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables />
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="90" y="20" />
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            
-            <inVariable localId="10228" width="40" height="40" negated="false">
-              <position x="2000" y="900" />
-              <connectionPointOut>
-                <relPosition x="60" y="20" />
-              </connectionPointOut>
-              <expression>MIN</expression>
-            </inVariable>
-            <block localId="10229" typeName="MOD" width="70" height="60">
-              <position x="2100" y="700" />
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="-20" y="20" />
-                    <connection refLocalId="10227" formalParameter="OUT">
-                      <position x="1990" y="720" />
-                      <position x="2080" y="720" />
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="-20" y="40" />
-                    <connection refLocalId="10228">
-                      <position x="2060" y="920" />
-                      <position x="2080" y="740" />
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables />
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="90" y="20" />
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            
-            <inVariable localId="10230" width="40" height="40" negated="false">
-              <position x="2200" y="900" />
-              <connectionPointOut>
-                <relPosition x="60" y="20" />
-              </connectionPointOut>
-              <expression>MIN0_2</expression>
-            </inVariable>
-            <block localId="10231" typeName="GT" width="70" height="60">
-              <position x="2300" y="700" />
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="-20" y="20" />
-                    <connection refLocalId="10229" formalParameter="OUT">
-                      <position x="2290" y="720" />
-                      <position x="2280" y="720" />
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="-20" y="40" />
-                    <connection refLocalId="10230">
-                      <position x="2260" y="920" />
-                      <position x="2280" y="740" />
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables />
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="90" y="20" />
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <contact localId="990" negated="false" width="40" height="40">
-        <position x="200" y="100" />
-        <connectionPointIn>
-          <relPosition x="-20" y="20" />
-      
-              <connection refLocalId="111">
-                <position x="360" y="120" />
-                <position x="180" y="120" />
-              </connection>
-              <connection refLocalId="10231">
-                <position x="2390" y="720" />
-                <position x="180" y="120" />
-              </connection>
-            </connectionPointIn>
-            <connectionPointOut>
-              <relPosition x="60" y="20"/>
-            </connectionPointOut>
-            <variable>temp0</variable></contact>
-            <inVariable localId="1132" width="40" height="40" negated="false">
-              <position x="3200" y="300" />
-              <connectionPointOut>
-                <relPosition x="60" y="20" />
-              </connectionPointOut>
-              <expression>PT1</expression>
-            </inVariable>
-            
-            <block
-              localId="12"
-              typeName="TON"
-              instanceName="TON1"
-              width="50"
-              height="60"
-            >
-              <position x="3300" y="100" />
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="-20" y="20" />
-                    <connection refLocalId="990">
-                      <position x="3260" y="120" />
-                      <position x="3280" y="120" />
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="PT">
-                  <connectionPointIn>
-                    <relPosition x="-20" y="40" />
-                    <connection refLocalId="1132">
-                      <position x="3260" y="320" />
-                      <position x="3280" y="140" />
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables />
-              <outputVariables>
-                <variable formalParameter="Q">
-                  <connectionPointOut>
-                    <relPosition x="70" y="20" />
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="ET">
-                  <connectionPointOut>
-                    <relPosition x="70" y="40" />
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-        <contact localId="1133" negated="false" width="40" height="40">
-        <position x="3200" y="100" />
-        <connectionPointIn>
-          <relPosition x="-20" y="20" />
-      
-              <connection refLocalId="12">
-                <position x="3370" y="120" />
-                <position x="3180" y="120" />
-              </connection>
-            </connectionPointIn>
-            <connectionPointOut>
-              <relPosition x="60" y="20"/>
-            </connectionPointOut>
-            <variable>temp1</variable></contact><coil localId="131" negated="true" width="40" height="40"><position x="3700" y="20" />
-            <connectionPointIn>
-              <relPosition x="-20" y="20" />
-              <connection refLocalId="1133">
-                <position x="3660" y="120" />
-                <position x="3680" y="40" />
-              </connection>
-            </connectionPointIn>
-            <connectionPointOut>
-              <relPosition x="60" y="20"/>
-            </connectionPointOut>
-            <variable>DO1</variable>
-            </coil>
-    </LD>
-    </body>
-    </pou>
-    
-        </pous>
-      </types>
-      <instances>
-        <configurations>
-          <configuration name="Config0">
-            <resource name="Res0">
-              <task name="task0" priority="0" interval="T#20ms">
-                <pouInstance name="instance0" typeName="program0"/>
-              </task>
-            </resource>
-          </configuration>
-        </configurations>
-      </instances>
-    </project>