1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987 |
- <template>
- <div class="project-info">
- <div class="header">
- <div class="go-back" @click="router.replace({ name: 'Automate' })">
- <van-button size="small"><van-icon name="arrow-left" />返回</van-button>
- </div>
- <div class="project-name">
- <div class="name">
- {{ crtProject!.name }}
- </div>
- <van-tag type="primary" v-show="crtProject?.isCompiled" size="medium">已编译</van-tag>
- <van-tag type="warning" v-show="!crtProject?.isCompiled" size="medium">未编译</van-tag>
- </div>
- <div class="more"><van-button type="primary" size="small" @click="showMorePopup = true">更多</van-button></div>
- </div>
- <div class="command-container">
- <van-swipe-cell v-for="item in crtProject!.commandList" :key="item.id">
- <van-cell
- clickable
- :border="false"
- :title="item.name"
- :label="item.time"
- @click="router.push(`/command-info/${crtProject!.id}/${item.id}`)"
- >
- <template #right-icon>
- <i class="iconfont icon-copy" @click.stop="copyCommand(item)"></i>
- </template>
- </van-cell>
- <template #right>
- <van-button square type="danger" text="删除" class="del-button" @click="handleDelete(item.id)" />
- </template>
- </van-swipe-cell>
- </div>
- <div class="add-btn">
- <van-button type="primary" block @click="handleAddCommond">添加任务</van-button>
- </div>
- <van-popup v-model:show="showMorePopup" position="right" :style="{ width: '50%', height: '100%' }">
- <template v-if="showMorePopup">
- <van-cell-group :style="{ marginTop: '16px' }">
- <van-cell title="编辑工程名称" clickable @click="handleEditName" :title-style="{ color: '#07c160' }" />
- <van-cell title="编译文件" @click="get_c_code('wx')" clickable :title-style="{ color: '#1989fa' }" />
- <van-cell title="仿真模拟" @click="get_c_code('wxsimu')" clickable :title-style="{ color: '#1989fa' }" />
- <van-cell clickable v-show="crtProject?.isCompiled">
- <template #title>
- <div v-html="wxtag" class="wx-tag"></div>
- </template>
- </van-cell>
- <van-cell title="删除工程" @click="delProject" clickable :title-style="{ color: '#fd5632' }" />
- <van-cell clickable v-if="isInWx">
- <template #title>
- <div v-html="wxShareTag" class="wx-tag"></div>
- </template>
- </van-cell>
- <!-- <van-cell title="分享" @click="shareProject" clickable /> -->
- </van-cell-group>
- </template>
- </van-popup>
- <van-popup v-model:show="showEditPopup" round :style="{ width: '80%' }">
- <div class="label" style="margin: 16px">编辑工程名称</div>
- <van-form @submit="onSubmit">
- <van-cell-group inset>
- <van-field
- border
- v-model="newProjectName"
- name="newProjectName"
- placeholder="工程名称"
- maxlength="20"
- :rules="[{ required: true, message: '请填写工程名称' }]"
- />
- </van-cell-group>
- <div class="van-button-group">
- <van-button @click="handleCancel" size="small">取消</van-button>
- <van-button type="primary" native-type="submit" size="small">确定</van-button>
- </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>
- <script setup lang="ts">
- import { useGlobalStore } from '@/stores/global'
- import type { CommandType, ProjectType } from '@/types/global'
- 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()
- const { projectList } = storeToRefs(useGlobalStore())
- const crtProject = ref<ProjectType>()
- const wxtag = ref('')
- const wxShareTag = ref('')
- const isInWx = window.isInWx
- let wx = window.wx
- // fetch('https://plceditor.worldflying.cn/api/build/getjsconfig', {
- // method: 'POST',
- // body: JSON.stringify({ url: location.origin + location.pathname + location.search })
- // })
- // .then((res) => res.json())
- // .then((res) => {
- // wx.config(res.data)
- // wx.ready(function () {
- // console.log('微信初始化成功')
- // showWxAppBtn.value = true
- // })
- // wx.error(function (res: any) {
- // console.log('微信初始化失败', res)
- // })
- // })
- const initWxEnv = () => {
- if (!window.isInWx) return showFailToast('请在微信中打开')
- 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()
- watch(
- () => route,
- () => {
- crtProject.value = projectList.value.find((item) => item.id === route.params.id)
- // console.log(JSON.stringify(crtProject.value))
- wxShareTag.value = `<wx-open-launch-weapp appid="wx4c5a777c71f2981c" style="width: 100%;" path="pages/sharefile/index?content=${encodeURIComponent(JSON.stringify({ ...crtProject.value, qrcodeType: 'worldflying_plc_editor' }))}&filename=${crtProject.value?.name}.jmpec"><template><text style="color: #896ef4;">分享</text></template></wx-open-launch-weapp>`
- let imgobjStr = localStorage.getItem('imgobj' + crtProject.value!.id)
- if (imgobjStr) {
- try {
- let imgobj = JSON.parse(imgobjStr)
- let now = new Date().getTime() // 当前时间戳
- if (now < imgobj.deadline) {
- crtProject.value!.isCompiled = true
- wxtag.value = `<wx-open-launch-weapp appid="wx4c5a777c71f2981c" style="width: 100%;" 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)
- }
- }
- },
- {
- deep: true,
- immediate: true,
- once: true
- }
- )
- const showMorePopup = ref(false)
- const handleEditName = () => {
- showEditPopup.value = true
- showMorePopup.value = false
- newProjectName.value = crtProject.value!.name
- }
- const showEditPopup = ref(false)
- const newProjectName = ref('')
- const onSubmit = (values: Record<string, string>) => {
- console.log(values)
- const isExist = projectList.value.some(
- (item) => item.name === values.newProjectName && item.id !== crtProject.value?.id
- )
- if (isExist) {
- showFailToast('工程名称已存在')
- return
- } else {
- crtProject.value!.name = values.newProjectName
- wxShareTag.value = `<wx-open-launch-weapp appid="wx4c5a777c71f2981c" style="width: 100%;" path="pages/sharefile/index?content=${encodeURIComponent(JSON.stringify({ ...crtProject.value, qrcodeType: 'worldflying_plc_editor' }))}&filename=${crtProject.value?.name}.jmpec"><template><text style="color: #896ef4;">分享</text></template></wx-open-launch-weapp>`
- console.log(wxShareTag.value)
- handleCancel()
- }
- }
- const handleCancel = async () => {
- showEditPopup.value = false
- await nextTick()
- newProjectName.value = ''
- }
- const handleDelete = (val: string) => {
- if (val) {
- const project = projectList.value.find((item) => (item.id = crtProject.value!.id))
- if (project) {
- if (project.commandList.length === 1) return showFailToast('请至少保留一个任务!')
- project.commandList = project.commandList.filter((item) => item.id !== val)
- crtProject.value!.commandList = crtProject.value!.commandList.filter((item) => item.id !== val)
- if (crtProject.value?.isCompiled) {
- crtProject.value.isCompiled = false
- localStorage.removeItem('imgobj' + crtProject.value!.id)
- }
- }
- }
- }
- let flag = false
- let timer: any
- const handleAddCommond = () => {
- if (flag) return
- if (timer) clearTimeout(timer)
- flag = true
- // const lastCmdName = crtProject.value?.commandList[0].name || '任务'
- // const baseName = lastCmdName.replace(/\s*\-\d+/, '')
- let maxSuffix = 0
- // 遍历任务列表,找到与基础名称匹配的最大编号
- crtProject.value?.commandList.forEach((item) => {
- if (item.name.startsWith('任务')) {
- const match = item.name.match(/\-(\d+)/) // 匹配末尾的 "(数字)"
- if (match) {
- const suffix = parseInt(match[1], 10)
- if (suffix > maxSuffix) {
- maxSuffix = suffix
- }
- }
- }
- })
- // 生成新的任务名称
- const newSuffix = maxSuffix + 1
- const name = `任务-${newSuffix}`
- // let name = `任务${Math.floor(Date.now())}`
- crtProject.value!.commandList.unshift({
- id: '' + Date.now(),
- name,
- time: new Date().toLocaleString(),
- stepList: [],
- // x: 100,
- // y: 100 + crtProject.value!.commandList.length * 2000,
- parentId: crtProject.value!.id
- })
- if (crtProject.value?.isCompiled) {
- crtProject.value.isCompiled = false
- localStorage.removeItem('imgobj' + crtProject.value!.id)
- }
- timer = setTimeout(() => {
- flag = false
- }, 500)
- }
- // 文件编译
- // const getXMLFile = () => {
- // if (!crtProject.value) return
- // if (crtProject.value.commandList.length === 0) return showFailToast('请先添加任务!')
- // if (crtProject.value.commandList.length === 1 && crtProject.value.commandList[0].stepList.length === 0) {
- // return showFailToast('任务内容为空!')
- // }
- // if (crtProject.value.isCompiled) {
- // return showFailToast('工程已编译!')
- // }
- // const isExistExec = crtProject.value.commandList.some((item) =>
- // item.stepList.some((cItem) => cItem.type === 'exec' && cItem.list?.length !== 0)
- // )
- // if (!isExistExec) return showFailToast('请先添加执行任务!')
- // const loading = showLoadingToast({
- // message: '正在编译中...',
- // forbidClick: true,
- // duration: 0
- // })
- // let xml = ''
- // // 头部
- // xml += `<?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="${formatDateTime(new Date(), 'T')}" />
- // <contentHeader name="${crtProject.value.name}" modificationDateTime="${formatDateTime(new Date(), 'T')}">
- // <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="proogram0" pouType="program">
- // // <interface>
- // // <localVars>
- // const commandVarMap: Record<string, string> = {}
- // const weekMap: Record<string, number> = {
- // 周一: 4,
- // 周二: 5,
- // 周三: 6,
- // 周四: 0,
- // 周五: 1,
- // 周六: 2,
- // 周日: 3
- // }
- // const globalVarList = [
- // 'DI0',
- // 'DI1',
- // 'DI2',
- // 'DI3',
- // 'DI4',
- // 'DI5',
- // 'DI6',
- // 'DI7',
- // 'DI8',
- // 'DI9',
- // 'AI0',
- // 'AI1',
- // 'AI2',
- // 'AI3',
- // 'DO0',
- // 'DO1',
- // 'DO2',
- // 'DO3',
- // 'DO4',
- // 'DO5',
- // 'DO6',
- // 'DO7',
- // 'DO8',
- // 'DO9',
- // 'AO0',
- // 'AO1'
- // ]
- // let instanceXml = ''
- // let globalVarsXml = ''
- // globalVarList.forEach((item) => {
- // globalVarsXml += `<variable name="${item}">
- // <type><${item.includes('A') ? 'UINT' : 'BOOL'} /></type>
- // </variable>`
- // })
- // crtProject.value.commandList.forEach((item, index) => {
- // if (!item.stepList.some((cItem) => cItem.type === 'exec' && cItem.list?.length !== 0)) return
- // instanceXml += `<pouInstance name="instance${index}" typeName="program${index}"/>`
- // xml += `<pou name="program${index}" pouType="program">
- // <interface>
- // <externalVars>
- // ${globalVarsXml}
- // <variable name="CRT_DATA">
- // <type><DT /></type>
- // </variable>
- // </externalVars>
- // <localVars>
- // <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="MINUTE">
- // <type><ULINT /></type>
- // <initialValue>
- // <simpleValue value="60" />
- // </initialValue>
- // </variable>
- // <variable name="MUL_NUM">
- // <type><INT /></type>
- // <initialValue>
- // <simpleValue value="1" />
- // </initialValue>
- // </variable>
- // `
- // // 临时变量
- // // const tempVarNum = item.stepList.filter((cItem) => cItem.type === 'condition').length
- // const tempVarNum = item.stepList.length
- // for (let i = 1; i <= tempVarNum; i++) {
- // xml += `<variable name="temp${i - 1}">
- // <type><BOOL /></type>
- // </variable>`
- // }
- // // 定义所需变量
- // item.stepList.forEach((item, index) => {
- // if (item.type === 'delay') {
- // // RTC 数量
- // xml += `<variable name="TON${index}">
- // <type>
- // <derived name="TON" />
- // </type>
- // </variable>
- // <variable name="PT${index}">
- // <type>
- // <TIME />
- // </type>
- // <initialValue>
- // <simpleValue value="T#${item.value}s" />
- // </initialValue>
- // </variable>`
- // } else {
- // item.list?.forEach((cItem, cIndex) => {
- // // PT 数量
- // if (cItem.type === 'time') {
- // xml += `<variable name="RTC${index}_${cIndex}">
- // <type>
- // <derived name="RTC" />
- // </type>
- // </variable>`
- // const timeArr = cItem.value.split(':')
- // xml += `<variable name="HOUR${index}_${cIndex}">
- // <type><ULINT /></type>
- // <initialValue>
- // <simpleValue value="${+timeArr[0]}" />
- // </initialValue>
- // </variable>`
- // xml += `<variable name="MIN${index}_${cIndex}">
- // <type><ULINT /></type>
- // <initialValue>
- // <simpleValue value="${+timeArr[1]}" />
- // </initialValue>
- // </variable>`
- // if (Object.keys(weekMap).includes(cItem.label)) {
- // xml += `<variable name="RTC${index}_${cIndex}_WEEK">
- // <type><ULINT /></type>
- // <initialValue>
- // <simpleValue value="${weekMap[cItem.label]}" />
- // </initialValue>
- // </variable>`
- // } else if (cItem.label !== '每天') {
- // const timeArr = cItem.value.split('-')
- // xml += `<variable name="RTC${index}_${cIndex}_START">
- // <type><ULINT /></type>
- // <initialValue>
- // <simpleValue value="${new Date(timeArr[0] + '').getTime() / 1000}" />
- // </initialValue>
- // </variable>`
- // xml += `<variable name="RTC${index}_${cIndex}_END">
- // <type><ULINT /></type>
- // <initialValue>
- // <simpleValue value="${new Date(timeArr[2] + '').getTime() / 1000}" />
- // </initialValue>
- // </variable>`
- // }
- // } else if (cItem.type === 'input' && cItem.label.includes('AI')) {
- // // 判断AI变量
- // xml += `<variable name="COMPARE_AI${index}_${cIndex}">
- // <type><UINT /></type>
- // <initialValue>
- // <simpleValue value="${+cItem.value * 100}" />
- // </initialValue>
- // </variable>`
- // } else if (cItem.type === 'output' && cItem.label.includes('AO')) {
- // // 赋值AO变量
- // xml += `<variable name="SET_AI${index}_${cIndex}">
- // <type><UINT /></type>
- // <initialValue>
- // <simpleValue value="${+cItem.value * 100}" />
- // </initialValue>
- // </variable>`
- // }
- // })
- // }
- // })
- // xml += `</localVars></interface>`
- // xml += `<body><LD>`
- // // 左侧电源导轨
- // const firstStep = item.stepList[0]
- // // const powerRailH = firstStep.type === 'delay' ? 40 : 40 + 20 * firstStep.list!.length
- // xml += `<leftPowerRail localId="${item.id}" width="20" height="40">
- // <position x="${item.x}" y="${item.y}"/>`
- // // if (firstStep.type === 'delay') {
- // xml += `<connectionPointOut formalParameter="">`
- // xml += `<relPosition x="40" y="20"/>`
- // xml += `</connectionPointOut>`
- // // } else {
- // // for (let i = 1; i <= firstStep.list!.length; i++) {
- // // xml += `<connectionPointOut formalParameter="">`
- // // xml += `<relPosition x="20" y="${20 * i}"/>`
- // // xml += `</connectionPointOut>`
- // // }
- // // }
- // xml += `</leftPowerRail>`
- // let tempVarId = `99${index}`
- // item.stepList.forEach((sItem, sIndex) => {
- // let tempXML = ''
- // let tempConnectXML = ''
- // if (sItem.type === 'condition' || sItem.type === 'exec') {
- // for (let i = 0; i < sItem.list!.length; i++) {
- // const cItem = sItem.list![i]
- // if (cItem.label.includes('DI') || cItem.label.includes('DO')) {
- // xml += `<${cItem.label.includes('DI') ? 'contact' : 'coil'} localId="${cItem.id}" negated="${cItem.value === '打开'}" width="40" height="40">`
- // xml += `<position x="${cItem.x}" y="${cItem.y}" />
- // <connectionPointIn>
- // <relPosition x="-20" y="20" />
- // <connection refLocalId="${sIndex === 0 ? item.id : tempVarId}">
- // <position x="${sIndex === 0 ? item.x + 40 : sItem.x - 40}" y="${sItem.y + 20}" />
- // <position x="${cItem.x - 20}" y="${cItem.y + 20}" />
- // </connection>
- // </connectionPointIn>
- // <connectionPointOut>
- // <relPosition x="60" y="20"/>
- // </connectionPointOut>
- // <variable>${cItem.label}</variable>
- // `
- // xml += `</${cItem.label.includes('DI') ? 'contact' : 'coil'}>`
- // tempConnectXML += `
- // <connection refLocalId="${cItem.id}" >
- // <position x="${cItem.x + 60}" y="${cItem.y + 20}" />
- // <position x="${sItem.x - 120}" y="${sItem.y + 20}" />
- // </connection>`
- // } else if (cItem.type === 'time') {
- // let setTimeVarID = `${index + 1}${sIndex}${i}11`
- // // 赋值当前时间
- // xml += `
- // <inVariable localId="${setTimeVarID}" width="40" height="40" negated="false">
- // <position x="${cItem.x - 100}" y="${cItem.y + 200}" />
- // <connectionPointOut>
- // <relPosition x="60" y="20" />
- // </connectionPointOut>
- // <expression>CRT_DATA</expression>
- // </inVariable>`
- // let RTCID1 = `${index + 1}${sIndex}${i}12`
- // // 定义RTC变量
- // xml += `
- // <block
- // localId="${RTCID1}"
- // typeName="RTC"
- // instanceName="RTC${sIndex}_${i}"
- // width="80"
- // height="80"
- // >
- // <position x="${cItem.x}" y="${cItem.y}" />
- // <inputVariables>
- // <variable formalParameter="IN">
- // <connectionPointIn>
- // <relPosition x="-20" y="20" />
- // <connection refLocalId="${sIndex === 0 ? item.id : tempVarId}">
- // <position x="${sIndex === 0 ? item.x + 40 : sItem.x - 40}" y="${sItem.y + 20}" />
- // <position x="${cItem.x - 20}" y="${cItem.y + 20}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // <variable formalParameter="PDT">
- // <connectionPointIn>
- // <relPosition x="-20" y="60" />
- // <connection refLocalId="${setTimeVarID}">
- // <position x="${cItem.x - 40}" y="${cItem.y + 220}" />
- // <position x="${cItem.x - 20}" y="${cItem.y + 60}" />
- // </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>
- // `
- // // DT TO ULINGT
- // let dtToULIntId1 = `${index + 1}${sIndex}${i}13`
- // xml += `
- // <block localId="${dtToULIntId1}" typeName="DT_TO_ULINT" width="100" height="40">
- // <position x="${cItem.x + 200}" y="${cItem.y}" />
- // <inputVariables>
- // <variable formalParameter="IN">
- // <connectionPointIn>
- // <relPosition x="-20" y="20" />
- // <connection refLocalId="${RTCID1}" formalParameter="CDT">
- // <position x="${cItem.x + 100}" y="${cItem.y + 60}" />
- // <position x="${cItem.x + 180}" y="${cItem.y + 20}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // </inputVariables>
- // <inOutVariables />
- // <outputVariables>
- // <variable formalParameter="OUT">
- // <connectionPointOut>
- // <relPosition x="120" y="20" />
- // </connectionPointOut>
- // </variable>
- // </outputVariables>
- // </block>`
- // let joinXML = ''
- // let isJoin = false
- // if (Object.keys(weekMap).includes(cItem.label)) {
- // isJoin = true
- // let varId6 = `${index + 1}${sIndex}${i}14`
- // // 天被除数变量
- // xml += `
- // <inVariable localId="${varId6}" width="40" height="40" negated="false">
- // <position x="${cItem.x + 300}" y="${cItem.y + 200}" />
- // <connectionPointOut>
- // <relPosition x="60" y="20" />
- // </connectionPointOut>
- // <expression>DAYS</expression>
- // </inVariable>`
- // let DIVID3 = `${index + 1}${sIndex}${i}15`
- // // 计算天数
- // xml += `
- // <block localId="${DIVID3}" typeName="DIV" width="70" height="60">
- // <position x="${cItem.x + 400}" y="${cItem.y}" />
- // <inputVariables>
- // <variable formalParameter="IN1">
- // <connectionPointIn>
- // <relPosition x="-20" y="20" />
- // <connection refLocalId="${dtToULIntId1}" formalParameter="OUT">
- // <position x="${cItem.x + 320}" y="${cItem.y + 20}" />
- // <position x="${cItem.x + 380}" y="${cItem.y + 20}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // <variable formalParameter="IN2">
- // <connectionPointIn>
- // <relPosition x="-20" y="40" />
- // <connection refLocalId="${varId6}">
- // <position x="${cItem.x + 360}" y="${cItem.y + 220}" />
- // <position x="${cItem.x + 380}" y="${cItem.y + 40}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // </inputVariables>
- // <inOutVariables />
- // <outputVariables>
- // <variable formalParameter="OUT">
- // <connectionPointOut>
- // <relPosition x="90" y="20" />
- // </connectionPointOut>
- // </variable>
- // </outputVariables>
- // </block>
- // `
- // let varId7 = `${index + 1}${sIndex}${i}16`
- // // 取模变量
- // xml += `
- // <inVariable localId="${varId7}" width="40" height="40" negated="false">
- // <position x="${cItem.x + 500}" y="${cItem.y + 200}" />
- // <connectionPointOut>
- // <relPosition x="60" y="20" />
- // </connectionPointOut>
- // <expression>MOD_WEEK</expression>
- // </inVariable>`
- // let MODID4 = `${index + 1}${sIndex}${i}17`
- // // 计算当前为周几 0为周四
- // xml += `
- // <block localId="${MODID4}" typeName="MOD" width="70" height="60">
- // <position x="${cItem.x + 600}" y="${cItem.y}" />
- // <inputVariables>
- // <variable formalParameter="IN1">
- // <connectionPointIn>
- // <relPosition x="-20" y="20" />
- // <connection refLocalId="${DIVID3}" formalParameter="OUT">
- // <position x="${cItem.x + 490}" y="${cItem.y + 20}" />
- // <position x="${cItem.x + 580}" y="${cItem.y + 20}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // <variable formalParameter="IN2">
- // <connectionPointIn>
- // <relPosition x="-20" y="40" />
- // <connection refLocalId="${varId7}">
- // <position x="${cItem.x + 560}" y="${cItem.y + 220}" />
- // <position x="${cItem.x + 580}" y="${cItem.y + 40}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // </inputVariables>
- // <inOutVariables />
- // <outputVariables>
- // <variable formalParameter="OUT">
- // <connectionPointOut>
- // <relPosition x="90" y="20" />
- // </connectionPointOut>
- // </variable>
- // </outputVariables>
- // </block>
- // `
- // // 设置的周几变量
- // let weekVarId = `${index + 1}${sIndex}${i}18`
- // xml += `
- // <inVariable localId="${weekVarId}" width="40" height="40" negated="false">
- // <position x="${cItem.x + 700}" y="${cItem.y + 200}" />
- // <connectionPointOut>
- // <relPosition x="60" y="20" />
- // </connectionPointOut>
- // <expression>RTC${sIndex}_${i}_WEEK</expression>
- // </inVariable>`
- // let GTID3 = `${index + 1}${sIndex}${i}19`
- // // 判断是否为指定的周几(等于)
- // xml += `
- // <block localId="${GTID3}" typeName="EQ" width="70" height="60">
- // <position x="${cItem.x + 800}" y="${cItem.y}" />
- // <inputVariables>
- // <variable formalParameter="IN1">
- // <connectionPointIn>
- // <relPosition x="-20" y="20" />
- // <connection refLocalId="${MODID4}" formalParameter="OUT">
- // <position x="${cItem.x + 690}" y="${cItem.y + 20}" />
- // <position x="${cItem.x + 780}" y="${cItem.y + 20}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // <variable formalParameter="IN2">
- // <connectionPointIn>
- // <relPosition x="-20" y="40" />
- // <connection refLocalId="${weekVarId}">
- // <position x="${cItem.x + 760}" y="${cItem.y + 20}" />
- // <position x="${cItem.x + 780}" y="${cItem.y + 20}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // </inputVariables>
- // <inOutVariables />
- // <outputVariables>
- // <variable formalParameter="OUT">
- // <connectionPointOut>
- // <relPosition x="90" y="20" />
- // </connectionPointOut>
- // </variable>
- // </outputVariables>
- // </block>
- // `
- // joinXML += `
- // <variable formalParameter="EN">
- // <connectionPointIn>
- // <relPosition x="-20" y="20" />
- // <connection refLocalId="${GTID3}" formalParameter="OUT">
- // <position x="${cItem.x + 890}" y="${cItem.y + 20}" />
- // <position x="${cItem.x + 980}" y="${cItem.y + 20}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // `
- // } else if (cItem.label !== '每天') {
- // isJoin = true
- // // 判断是否再日期范围内
- // let startTimeID = `${index + 1}${sIndex}37`
- // let endTimeID = `${index + 1}${sIndex}36`
- // // 开始时间变量
- // xml += `
- // <inVariable localId="${startTimeID}" width="40" height="40" negated="false">
- // <position x="${cItem.x + 300}" y="${cItem.y + 200}" />
- // <connectionPointOut>
- // <relPosition x="60" y="20" />
- // </connectionPointOut>
- // <expression>RTC${sIndex}_${i}_START</expression>
- // </inVariable>`
- // // 大于等于最小值
- // let GEID1 = `${index + 1}${sIndex}35`
- // xml += `
- // <block localId="${GEID1}" typeName="GE" width="70" height="60">
- // <position x="${cItem.x + 400}" y="${cItem.y}" />
- // <inputVariables>
- // <variable formalParameter="IN1">
- // <connectionPointIn>
- // <relPosition x="-20" y="20" />
- // <connection refLocalId="${dtToULIntId1}" formalParameter="OUT">
- // <position x="${cItem.x + 320}" y="${cItem.y + 20}" />
- // <position x="${cItem.x + 380}" y="${cItem.y + 20}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // <variable formalParameter="IN2">
- // <connectionPointIn>
- // <relPosition x="-20" y="40" />
- // <connection refLocalId="${startTimeID}">
- // <position x="${cItem.x + 360}" y="${cItem.y + 220}" />
- // <position x="${cItem.x + 380}" y="${cItem.y + 40}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // </inputVariables>
- // <inOutVariables />
- // <outputVariables>
- // <variable formalParameter="OUT">
- // <connectionPointOut>
- // <relPosition x="90" y="30" />
- // </connectionPointOut>
- // </variable>
- // </outputVariables>
- // </block>
- // `
- // // 结束时间变量
- // xml += `
- // <inVariable localId="${endTimeID}" width="40" height="40" negated="false">
- // <position x="${cItem.x + 500}" y="${cItem.y + 200}" />
- // <connectionPointOut>
- // <relPosition x="60" y="20" />
- // </connectionPointOut>
- // <expression>RTC${sIndex}_${i}_END</expression>
- // </inVariable>`
- // // 小于等于最大值
- // let LEID1 = `${index + 1}${sIndex}34`
- // xml += `
- // <block localId="${LEID1}" typeName="LE" width="70" height="60">
- // <position x="${cItem.x + 600}" y="${cItem.y}" />
- // <inputVariables>
- // <variable formalParameter="EN">
- // <connectionPointIn>
- // <relPosition x="-20" y="20" />
- // <connection refLocalId="${GEID1}" formalParameter="OUT">
- // <position x="${cItem.x + 490}" y="${cItem.y + 30}" />
- // <position x="${cItem.x + 580}" y="${cItem.y + 20}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // <variable formalParameter="IN1">
- // <connectionPointIn>
- // <relPosition x="-20" y="40" />
- // <connection refLocalId="${dtToULIntId1}" formalParameter="OUT">
- // <position x="${cItem.x + 320}" y="${cItem.y + 20}" />
- // <position x="${cItem.x + 580}" y="${cItem.y + 40}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // <variable formalParameter="IN2">
- // <connectionPointIn>
- // <relPosition x="-20" y="60" />
- // <connection refLocalId="${endTimeID}" formalParameter="OUT">
- // <position x="${cItem.x + 560}" y="${cItem.y + 220}" />
- // <position x="${cItem.x + 580}" y="${cItem.y + 60}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // </inputVariables>
- // <inOutVariables />
- // <outputVariables>
- // <variable formalParameter="ENO">
- // <connectionPointOut>
- // <relPosition x="90" y="20" />
- // </connectionPointOut>
- // </variable>
- // <variable formalParameter="OUT">
- // <connectionPointOut>
- // <relPosition x="90" y="40" />
- // </connectionPointOut>
- // </variable>
- // </outputVariables>
- // </block>
- // `
- // joinXML += `
- // <variable formalParameter="EN">
- // <connectionPointIn>
- // <relPosition x="-20" y="20" />
- // <connection refLocalId="${LEID1}" formalParameter="OUT">
- // <position x="${cItem.x + 690}" y="${cItem.y + 40}" />
- // <position x="${cItem.x + 980}" y="${cItem.y + 20}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // `
- // }
- // let varId2 = `${index + 1}${sIndex}${i}20`
- // // 小时被除数
- // xml += `
- // <inVariable localId="${varId2}" width="40" height="40" negated="false">
- // <position x="${cItem.x + 900}" y="${cItem.y + 200}" />
- // <connectionPointOut>
- // <relPosition x="60" y="20" />
- // </connectionPointOut>
- // <expression>HOURS</expression>
- // </inVariable>`
- // let DIVID1 = `${index + 1}${sIndex}${i}21`
- // // 计算小时
- // xml += `
- // <block localId="${DIVID1}" typeName="DIV" width="70" height="60">
- // <position x="${cItem.x + 1000}" y="${cItem.y}" />
- // <inputVariables>
- // ${joinXML}
- // <variable formalParameter="IN1">
- // <connectionPointIn>
- // <relPosition x="-20" y="${isJoin ? 40 : 20}" />
- // <connection refLocalId="${dtToULIntId1}" formalParameter="OUT">
- // <position x="${cItem.x + 320}" y="${cItem.y + 20}" />
- // <position x="${cItem.x + 980}" y="${cItem.y + (isJoin ? 40 : 20)}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // <variable formalParameter="IN2">
- // <connectionPointIn>
- // <relPosition x="-20" y="${isJoin ? 60 : 40}" />
- // <connection refLocalId="${varId2}">
- // <position x="${cItem.x + 960}" y="${cItem.y + 220}" />
- // <position x="${cItem.x + 980}" y="${cItem.y + (isJoin ? 60 : 40)}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // </inputVariables>
- // <inOutVariables />
- // <outputVariables>
- // ${
- // isJoin
- // ? `<variable formalParameter="ENO">
- // <connectionPointOut>
- // <relPosition x="90" y="20" />
- // </connectionPointOut>
- // </variable>`
- // : ''
- // }
- // <variable formalParameter="OUT">
- // <connectionPointOut>
- // <relPosition x="90" y="40" />
- // </connectionPointOut>
- // </variable>
- // </outputVariables>
- // </block>
- // `
- // let varId3 = `${index + 1}${sIndex}${i}22`
- // // 小时取模变量
- // xml += `
- // <inVariable localId="${varId3}" width="40" height="40" negated="false">
- // <position x="${cItem.x + 1100}" y="${cItem.y + 200}" />
- // <connectionPointOut>
- // <relPosition x="60" y="20" />
- // </connectionPointOut>
- // <expression>MOD_HOUR</expression>
- // </inVariable>`
- // let MODID1 = `${index + 1}${sIndex}${i}23`
- // // 计算当前时间为几点
- // xml += `
- // <block localId="${MODID1}" typeName="MOD" width="70" height="60">
- // <position x="${cItem.x + 1200}" y="${cItem.y}" />
- // <inputVariables>
- // <variable formalParameter="IN1">
- // <connectionPointIn>
- // <relPosition x="-20" y="20" />
- // <connection refLocalId="${DIVID1}" formalParameter="OUT">
- // <position x="${cItem.x + 1090}" y="${cItem.y + 40}" />
- // <position x="${cItem.x + 1180}" y="${cItem.y + 20}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // <variable formalParameter="IN2">
- // <connectionPointIn>
- // <relPosition x="-20" y="40" />
- // <connection refLocalId="${varId3}">
- // <position x="${cItem.x + 1160}" y="${cItem.y + 220}" />
- // <position x="${cItem.x + 1180}" y="${cItem.y + 40}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // </inputVariables>
- // <inOutVariables />
- // <outputVariables>
- // <variable formalParameter="OUT">
- // <connectionPointOut>
- // <relPosition x="90" y="20" />
- // </connectionPointOut>
- // </variable>
- // </outputVariables>
- // </block>
- // `
- // // 设置的小时数变量
- // let hourVarId = `${index + 1}${sIndex}${i}24`
- // xml += `
- // <inVariable localId="${hourVarId}" width="40" height="40" negated="false">
- // <position x="${cItem.x + 1300}" y="${cItem.y + 200}" />
- // <connectionPointOut>
- // <relPosition x="60" y="20" />
- // </connectionPointOut>
- // <expression>HOUR${sIndex}_${i}</expression>
- // </inVariable>`
- // let GTID1 = `${index + 1}${sIndex}${i}25`
- // // 判断小时数是否相等
- // xml += `
- // <block localId="${GTID1}" typeName="EQ" width="70" height="60">
- // <position x="${cItem.x + 1400}" y="${cItem.y}" />
- // <inputVariables>
- // <variable formalParameter="IN1">
- // <connectionPointIn>
- // <relPosition x="-20" y="20" />
- // <connection refLocalId="${MODID1}" formalParameter="OUT">
- // <position x="${cItem.x + 1290}" y="${cItem.y + 20}" />
- // <position x="${cItem.x + 1380}" y="${cItem.y + 20}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // <variable formalParameter="IN2">
- // <connectionPointIn>
- // <relPosition x="-20" y="40" />
- // <connection refLocalId="${hourVarId}" formalParameter="OUT">
- // <position x="${cItem.x + 1360}" y="${cItem.y + 220}" />
- // <position x="${cItem.x + 1380}" y="${cItem.y + 40}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // </inputVariables>
- // <inOutVariables />
- // <outputVariables>
- // <variable formalParameter="OUT">
- // <connectionPointOut>
- // <relPosition x="90" y="20" />
- // </connectionPointOut>
- // </variable>
- // </outputVariables>
- // </block>
- // `
- // let varId4 = `${index + 1}${sIndex}${i}26`
- // // 分钟被除数
- // xml += `
- // <inVariable localId="${varId4}" width="40" height="40" negated="false">
- // <position x="${cItem.x + 1500}" y="${cItem.y + 200}" />
- // <connectionPointOut>
- // <relPosition x="60" y="20" />
- // </connectionPointOut>
- // <expression>MINUTE</expression>
- // </inVariable>`
- // let DIVID2 = `${index + 1}${sIndex}${i}27`
- // // 计算分钟
- // xml += `
- // <block localId="${DIVID2}" typeName="DIV" width="70" height="60">
- // <position x="${cItem.x + 1600}" y="${cItem.y}" />
- // <inputVariables>
- // <variable formalParameter="EN">
- // <connectionPointIn>
- // <relPosition x="-20" y="20"/>
- // <connection refLocalId="${GTID1}" formalParameter="OUT">
- // <position x="${cItem.x + 1490}" y="${cItem.y + 20}"/>
- // <position x="${cItem.x + 1580}" y="${cItem.y + 20}"/>
- // </connection>
- // </connectionPointIn>
- // </variable>
- // <variable formalParameter="IN1">
- // <connectionPointIn>
- // <relPosition x="-20" y="40" />
- // <connection refLocalId="${dtToULIntId1}" formalParameter="OUT">
- // <position x="${cItem.x + 320}" y="${cItem.y + 20}" />
- // <position x="${cItem.x + 1580}" y="${cItem.y + 40}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // <variable formalParameter="IN2">
- // <connectionPointIn>
- // <relPosition x="-20" y="60" />
- // <connection refLocalId="${varId4}">
- // <position x="${cItem.x + 1560}" y="${cItem.y + 220}" />
- // <position x="${cItem.x + 1580}" y="${cItem.y + 60}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // </inputVariables>
- // <inOutVariables />
- // <outputVariables>
- // <variable formalParameter="ENO">
- // <connectionPointOut>
- // <relPosition x="90" y="20"/>
- // </connectionPointOut>
- // </variable>
- // <variable formalParameter="OUT">
- // <connectionPointOut>
- // <relPosition x="90" y="40" />
- // </connectionPointOut>
- // </variable>
- // </outputVariables>
- // </block>
- // `
- // let varId5 = `${index + 1}${sIndex}${i}28`
- // // 取模变量
- // xml += `
- // <inVariable localId="${varId5}" width="40" height="40" negated="false">
- // <position x="${cItem.x + 1700}" y="${cItem.y + 200}" />
- // <connectionPointOut>
- // <relPosition x="60" y="20" />
- // </connectionPointOut>
- // <expression>MINUTE</expression>
- // </inVariable>`
- // let MODID2 = `${index + 1}${sIndex}${i}29`
- // // 计算当前时间为几分
- // xml += `
- // <block localId="${MODID2}" typeName="MOD" width="70" height="60">
- // <position x="${cItem.x + 1800}" y="${cItem.y}" />
- // <inputVariables>
- // <variable formalParameter="IN1">
- // <connectionPointIn>
- // <relPosition x="-20" y="20" />
- // <connection refLocalId="${DIVID2}" formalParameter="OUT">
- // <position x="${cItem.x + 1690}" y="${cItem.y + 40}" />
- // <position x="${cItem.x + 1780}" y="${cItem.y + 20}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // <variable formalParameter="IN2">
- // <connectionPointIn>
- // <relPosition x="-20" y="40" />
- // <connection refLocalId="${varId5}">
- // <position x="${cItem.x + 1760}" y="${cItem.y + 220}" />
- // <position x="${cItem.x + 1780}" y="${cItem.y + 40}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // </inputVariables>
- // <inOutVariables />
- // <outputVariables>
- // <variable formalParameter="OUT">
- // <connectionPointOut>
- // <relPosition x="90" y="20" />
- // </connectionPointOut>
- // </variable>
- // </outputVariables>
- // </block>
- // `
- // // 设置的分钟数变量
- // let minVarId = `${index + 1}${sIndex}${i}30`
- // xml += `
- // <inVariable localId="${minVarId}" width="40" height="40" negated="false">
- // <position x="${cItem.x + 1900}" y="${cItem.y + 200}" />
- // <connectionPointOut>
- // <relPosition x="60" y="20" />
- // </connectionPointOut>
- // <expression>MIN${sIndex}_${i}</expression>
- // </inVariable>`
- // let GTID2 = `${index + 1}${sIndex}${i}31`
- // // 判断分钟数是否相等
- // xml += `
- // <block localId="${GTID2}" typeName="EQ" width="70" height="60">
- // <position x="${cItem.x + 2000}" y="${cItem.y}" />
- // <inputVariables>
- // <variable formalParameter="IN1">
- // <connectionPointIn>
- // <relPosition x="-20" y="20" />
- // <connection refLocalId="${MODID2}" formalParameter="OUT">
- // <position x="${cItem.x + 1990}" y="${cItem.y + 20}" />
- // <position x="${cItem.x + 1980}" y="${cItem.y + 20}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // <variable formalParameter="IN2">
- // <connectionPointIn>
- // <relPosition x="-20" y="40" />
- // <connection refLocalId="${minVarId}">
- // <position x="${cItem.x + 1960}" y="${cItem.y + 220}" />
- // <position x="${cItem.x + 1980}" y="${cItem.y + 40}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // </inputVariables>
- // <inOutVariables />
- // <outputVariables>
- // <variable formalParameter="OUT">
- // <connectionPointOut>
- // <relPosition x="90" y="20" />
- // </connectionPointOut>
- // </variable>
- // </outputVariables>
- // </block>
- // `
- // tempConnectXML += `
- // <connection refLocalId="${GTID2}" formalParameter="OUT">
- // <position x="${cItem.x + 2090}" y="${cItem.y + 20}" />
- // <position x="${sItem.x - 120}" y="${sItem.y + 20}" />
- // </connection>`
- // } else if (cItem.label.includes('AI')) {
- // let compareVarID = `${index + 1}${sIndex}${i}33`
- // // 对AI进行比较的变量
- // xml += `
- // <inVariable localId="${compareVarID}" width="40" height="40" negated="false">
- // <position x="${cItem.x - 100}" y="${cItem.y + 200}" />
- // <connectionPointOut>
- // <relPosition x="60" y="20" />
- // </connectionPointOut>
- // <expression>COMPARE_AI${sIndex}_${i}</expression>
- // </inVariable>`
- // // AI变量
- // let AIID = `${index + 1}${sIndex}${i}34`
- // xml += `
- // <inVariable localId="${AIID}" width="40" height="40" negated="false">
- // <position x="${cItem.x - 100}" y="${cItem.y + 200}" />
- // <connectionPointOut>
- // <relPosition x="60" y="20" />
- // </connectionPointOut>
- // <expression>${cItem.label}</expression>
- // </inVariable>`
- // let compareBlockID = `${index + 1}${sIndex}${i}35`
- // let operationMap: Record<string, string> = {
- // '≥': 'GE',
- // '≤': 'LE',
- // '>': 'GT',
- // '<': 'LT',
- // '=': 'EQ',
- // '≠': 'NE'
- // }
- // xml += `<block localId="${compareBlockID}" typeName="${operationMap[cItem.operation!]}" width="70" height="60">
- // <position x="${cItem.x}" y="${cItem.y + 200}" />
- // <inputVariables>
- // <variable formalParameter="IN1">
- // <connectionPointIn>
- // <relPosition x="-20" y="40" />
- // <connection refLocalId="${compareVarID}" formalParameter="OUT">
- // <position x="${cItem.x - 40}" y="${cItem.y + 220}" />
- // <position x="${cItem.x - 20}" y="${cItem.y + 240}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // <variable formalParameter="IN2">
- // <connectionPointIn>
- // <relPosition x="-20" y="60" />
- // <connection refLocalId="${AIID}" formalParameter="OUT">
- // <position x="${cItem.x - 40}" y="${cItem.y + 220}" />
- // <position x="${cItem.x - 20}" y="${cItem.y + 260}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // </inputVariables>
- // <inOutVariables />
- // <outputVariables>
- // <variable formalParameter="OUT">
- // <connectionPointOut>
- // <relPosition x="90" y="20" />
- // </connectionPointOut>
- // </variable>
- // </outputVariables>
- // </block>`
- // tempConnectXML += `
- // <connection refLocalId="${compareBlockID}" formalParameter="OUT">
- // <position x="${cItem.x + 690}" y="${cItem.y + 20}" />
- // <position x="${sItem.x - 120}" y="${sItem.y + 20}" />
- // </connection>`
- // } else if (cItem.label.includes('AO')) {
- // // 乘数id
- // let mulID = `${index + 1}${sIndex}${i}36`
- // xml += `
- // <inVariable localId="${mulID}" width="40" height="40" negated="false">
- // <position x="${cItem.x - 100}" y="${cItem.y + 200}" />
- // <connectionPointOut>
- // <relPosition x="60" y="20" />
- // </connectionPointOut>
- // <expression>MUL_NUM</expression>
- // </inVariable>`
- // // 赋值id
- // let setID = `${index + 1}${sIndex}${i}37`
- // xml += `
- // <inVariable localId="${setID}" width="40" height="40" negated="false">
- // <position x="${cItem.x - 100}" y="${cItem.y + 200}" />
- // <connectionPointOut>
- // <relPosition x="60" y="20" />
- // </connectionPointOut>
- // <expression>SET_AI${sIndex}_${i}</expression>
- // </inVariable>`
- // let mulBlockId = `${index + 1}${sIndex}${i}38`
- // xml += `
- // <block localId="${mulBlockId}" typeName="DIV" width="70" height="60">
- // <position x="${cItem.x}" y="${cItem.y}" />
- // <inputVariables>
- // <variable formalParameter="EN">
- // <connectionPointIn>
- // <relPosition x="-20" y="20"/>
- // <connection refLocalId="${sIndex === 0 ? item.id : tempVarId}" formalParameter="OUT">
- // <position x="${sIndex === 0 ? item.x + 40 : sItem.x - 40}" y="${sItem.y + 20}"/>
- // <position x="${cItem.x - 20}" y="${cItem.y + 20}"/>
- // </connection>
- // </connectionPointIn>
- // </variable>
- // <variable formalParameter="IN1">
- // <connectionPointIn>
- // <relPosition x="-20" y="40" />
- // <connection refLocalId="${mulID}" formalParameter="OUT">
- // <position x="${cItem.x - 40}" y="${cItem.y + 220}" />
- // <position x="${cItem.x - 20}" y="${cItem.y + 40}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // <variable formalParameter="IN2">
- // <connectionPointIn>
- // <relPosition x="-20" y="60" />
- // <connection refLocalId="${setID}">
- // <position x="${cItem.x - 40}" y="${cItem.y + 220}" />
- // <position x="${cItem.x - 20}" y="${cItem.y + 60}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // </inputVariables>
- // <inOutVariables />
- // <outputVariables>
- // <variable formalParameter="ENO">
- // <connectionPointOut>
- // <relPosition x="90" y="20"/>
- // </connectionPointOut>
- // </variable>
- // <variable formalParameter="OUT">
- // <connectionPointOut>
- // <relPosition x="90" y="40" />
- // </connectionPointOut>
- // </variable>
- // </outputVariables>
- // </block>
- // `
- // // 赋值AO变量
- // let AOID = `${index + 1}${sIndex}${i}38`
- // xml += `
- // <outVariable localId="${AOID}" width="40" height="40" negated="false">
- // <position x="${cItem.x - 400}" y="${cItem.y + 200}" />
- // <connectionPointIn>
- // <relPosition x="60" y="20" />
- // <connection refLocalId="${mulBlockId}" formalParameter="OUT">
- // <position x="${cItem.x + 90}" y="${cItem.y + 4}" />
- // <position x="${cItem.x - 340}" y="${cItem.y + 20}" />
- // </connection>
- // </connectionPointIn>
- // <expression>${cItem.label}</expression>
- // </outVariable>`
- // }
- // }
- // } else if (sItem.type === 'delay') {
- // // 延时时间变量
- // let delayVarId = `${index + 1}${sIndex}32`
- // xml += `
- // <inVariable localId="${delayVarId}" width="40" height="40" negated="false">
- // <position x="${sItem.x - 100}" y="${sItem.y + 200}" />
- // <connectionPointOut>
- // <relPosition x="60" y="20" />
- // </connectionPointOut>
- // <expression>PT${sIndex}</expression>
- // </inVariable>
- // `
- // xml += `
- // <block
- // localId="${sItem.id}"
- // typeName="TON"
- // instanceName="TON${sIndex}"
- // width="50"
- // height="60"
- // >
- // <position x="${sItem.x}" y="${sItem.y}" />
- // <inputVariables>
- // <variable formalParameter="IN">
- // <connectionPointIn>
- // <relPosition x="-20" y="20" />
- // <connection refLocalId="${sIndex === 0 ? item.id : tempVarId}">
- // <position x="${sIndex === 0 ? item.x + 40 : sItem.x - 40}" y="${sItem.y + 20}" />
- // <position x="${sItem.x - 20}" y="${sItem.y + 20}" />
- // </connection>
- // </connectionPointIn>
- // </variable>
- // <variable formalParameter="PT">
- // <connectionPointIn>
- // <relPosition x="-20" y="40" />
- // <connection refLocalId="${delayVarId}">
- // <position x="${sItem.x - 40}" y="${sItem.y + 220}" />
- // <position x="${sItem.x - 20}" y="${sItem.y + 40}" />
- // </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>
- // `
- // tempConnectXML += `
- // <connection refLocalId="${sItem.id}" formalParameter="Q">
- // <position x="${sItem.x + 70}" y="${sItem.y + 20}" />
- // <position x="${sItem.x - 120}" y="${sItem.y + 20}" />
- // </connection>`
- // }
- // if (sIndex !== 0) {
- // tempVarId = `${index + 1}${sIndex}33`
- // }
- // tempXML += `<inOutVariable localId="${tempVarId}" width="40" height="40" negatedOut="false" negatedIn="false">
- // <position x="${sItem.x - 100}" y="${sItem.y}" />
- // <connectionPointIn>
- // <relPosition x="-20" y="20" />
- // `
- // tempXML += tempConnectXML
- // tempXML += `
- // </connectionPointIn>
- // <connectionPointOut>
- // <relPosition x="60" y="20"/>
- // </connectionPointOut>
- // <expression>temp${sIndex}</expression></inOutVariable>`
- // if (sIndex !== item.stepList.length - 1) {
- // xml += tempXML
- // }
- // })
- // xml += `
- // </LD>
- // </body>
- // </pou>
- // `
- // })
- // // 尾部
- // xml += `
- // </pous>
- // </types>
- // <instances>
- // <configurations>
- // <configuration name="Config0">
- // <resource name="Res0">
- // <task name="task0" priority="0" interval="T#20ms">
- // ${instanceXml}
- // </task>
- // </resource>
- // <globalVars>
- // ${globalVarsXml}
- // <variable name="CRT_DATA">
- // <type><DT /></type>
- // <initialValue>
- // <simpleValue value="DT#${formatDateTime(new Date(), '-')}" />
- // </initialValue>
- // </variable>
- // </globalVars>
- // </configuration>
- // </configurations>
- // </instances>
- // </project>`
- // // console.log(xml)
- // // 生成文件下载
- // // const blob = new Blob([xml], { type: 'text/plain;charset=utf-8' })
- // // const formdata = new FormData()
- // // formdata.append('file', blob, 'project.xml')
- // const params = {
- // devicetype: 'PLC101',
- // xml
- // }
- // fetch('https://plceditor.worldflying.cn/api/build/buildcode', {
- // method: 'POST',
- // body: JSON.stringify(params),
- // headers: {
- // 'Content-Type': 'application/x-www-form-urlencoded',
- // 'Content-Length': xml.length + ''
- // }
- // })
- // .then((res) => res.json())
- // .then((res) => {
- // console.log(res)
- // // 关闭loading
- // loading.close()
- // if (res.errcode === 3000) {
- // showFailToast('编译失败!')
- // } else if (res.errcode === 0) {
- // localStorage.setItem(
- // 'imgobj' + crtProject.value!.id,
- // JSON.stringify({
- // url: res.url,
- // deadline: new Date().getTime() + 30 * 60 * 1000
- // })
- // )
- // crtProject.value!.isCompiled = true
- // crtProject.value!.CompileTime = formatDateTime(new Date())!
- // wxtag.value = `<wx-open-launch-weapp appid="wx4c5a777c71f2981c" path="pages/index/rj45cfgbybt/plc/index?imgurl=${res.url}"><template><text style="color: #7232dd">烧录设备</text></template></wx-open-launch-weapp>`
- // console.log('本地存储成功')
- // showSuccessToast('编译成功!')
- // }
- // })
- // // const link = document.createElement('a')
- // // link.href = URL.createObjectURL(blob)
- // // link.download = 'project.xml'
- // // link.click()
- // // URL.revokeObjectURL(link.href)
- // // link.remove()
- // }
- const get_c_code = (codetype: string) => {
- if (!crtProject.value) return
- if (crtProject.value.commandList.length === 0) return showFailToast('请先添加任务!')
- if (crtProject.value.commandList.length === 1 && crtProject.value.commandList[0].stepList.length === 0) {
- return showFailToast('任务内容为空!')
- }
- if (crtProject.value.isCompiled && codetype === 'wx') {
- return showFailToast('工程已编译!')
- }
- const isExistExec = crtProject.value.commandList.some((item) =>
- item.stepList.some((cItem) => cItem.type === 'exec' && cItem.list?.length !== 0)
- )
- if (!isExistExec) return showFailToast('请先添加执行任务!')
- const loading = showLoadingToast({
- message: '正在编译中...',
- forbidClick: true,
- duration: 0
- })
- const valMap: Record<string, number> = {
- 闭合: 1,
- 断开: 0,
- 打开: 0,
- }
- const weekMap: Record<string, number> = {
- 每天: 0,
- 周一: 1,
- 周二: 2,
- 周三: 3,
- 周四: 4,
- 周五: 5,
- 周六: 6,
- 周日: 7,
- 仅一次: 8
- }
- const operationMap: Record<string, string> = {
- '=': '==',
- '<': '<',
- '>': '>',
- '≤': '<=',
- '≥': '>=',
- '≠': '!='
- }
- const timeOperationMap: Record<string, number> = {
- 等于: 0,
- 早于: 1,
- 晚于: 2
- }
- let c_code = ''
- if (crtProject.value) {
- c_code = `#include "iec_def.h"
- extern uint8_t coil[20];
- extern uint16_t ai[4];
- extern uint16_t ao[2];`
- let call_code = ''
- crtProject.value.commandList.forEach((item, index) => {
- if (!item.stepList.some((cItem) => cItem.type === 'exec' && cItem.list?.length !== 0)) return
- call_code += `
- PROGRAM${index}_body(&p${index}, &p${index}_delay);`
- let body_code = `
- static struct pt p${index};
- static TIME p${index}_delay;
- static PT_THREAD(PROGRAM${index}_body(struct pt *pt, TIME *pt_delay))
- {
- PT_BEGIN(pt);`
- item.stepList.forEach((sItem, sIndex) => {
- if (sItem.type === 'delay') {
- body_code += `
- delay_set(pt_delay, ${+sItem.value! * 1000});
- PT_WAIT_UNTIL(pt, delay_expired(pt_delay));`
- } else {
- let condition_code = ''
- sItem.list!.forEach((cItem, cIndex) => {
- const linkStr = cIndex === sItem.list!.length - 1 ? '' : ' || '
- if (sItem.type === 'condition') {
- if (cItem.label.includes('DI')) {
- const idx = cItem.label.slice(2)
- condition_code += `GET_DI(${idx}) == ${valMap[cItem.value]}${linkStr}`
- }
- if (cItem.label.includes('AI')) {
- const idx = cItem.label.slice(2)
- condition_code += `GET_AI(${idx}) ${operationMap[cItem.operation!]} ${+cItem.value * 100}${linkStr}`
- }
- if (cItem.type === 'time') {
- const timeArr = cItem.value.split(':')
- const sec = Math.floor(
- (new Date(new Date().setHours(+timeArr[0], +timeArr[1], 0, 0)).getTime() -
- new Date(new Date().setHours(0, 0, 0, 0)).getTime()) /
- 1000
- )
- const operation = weekMap[cItem.label!]
- const timeOperation = timeOperationMap[cItem.operation!]
- if ((operation || operation === 0) && operation !== 8) {
- condition_code += `time_compare(${sec},${timeOperation}, 0, 0, ${operation})${linkStr}`
- } else if (cItem.label.includes('-')) {
- // 自定义时间
- const dateArr = cItem.label!.split('-')
- const start = Math.floor(new Date(dateArr[0]).getTime() / 1000)
- const end = Math.floor(new Date(dateArr[1]).getTime() / 1000)
- condition_code += `time_compare(${sec},${timeOperation}, ${start}, ${end}, 8)${linkStr}`
- console.log(condition_code)
- } else {
- // 特定某一天
- const start = Math.floor(new Date(cItem.label).getTime() / 1000)
- condition_code += `time_compare(${sec},${timeOperation}, ${start}, ${start + 24 * 60 * 60}, 8)${linkStr}`
- }
- }
- } else if (sItem.type === 'exec') {
- if (cItem.label.includes('DO')) {
- const idx = cItem.label.slice(2)
- body_code += `
- SET_DO(${idx}, ${valMap[cItem.value]});`
- }
- if (cItem.label.includes('AO')) {
- const idx = cItem.label.slice(2)
- body_code += `
- SET_AO(${idx}, ${+cItem.value * 100});`
- }
- }
- })
- if (condition_code !== '') {
- body_code += `
- PT_WAIT_UNTIL(pt, ${condition_code});`
- }
- }
- })
- body_code += `
- PT_END(pt);
- }`
- c_code += body_code
- })
- c_code += `
- void IEC_run(void)
- {${call_code}
- }`
- }
- console.log(c_code)
- const params = {
- devicetype: 'PLC101',
- xml: c_code,
- codetype,
- getlog: true
- }
- fetch('https://plceditor.worldflying.cn/api/build/buildcode', {
- method: 'POST',
- body: JSON.stringify(params),
- headers: {
- 'Content-Type': 'application/x-www-form-urlencoded'
- }
- })
- .then((res) => res.json())
- .then((res) => {
- console.log(res)
- // 关闭loading
- loading.close()
- if (res.errcode === 3000) {
- showFailToast('操作失败!')
- } else if (res.errcode === 0) {
- if (codetype === 'wx') {
- localStorage.setItem(
- 'imgobj' + crtProject.value!.id,
- JSON.stringify({
- url: res.url,
- deadline: new Date().getTime() + 30 * 60 * 1000
- })
- )
- crtProject.value!.isCompiled = true
- crtProject.value!.CompileTime = formatDateTime(new Date())!
- wxtag.value = `<wx-open-launch-weapp appid="wx4c5a777c71f2981c" style="width: 100%;" path="pages/index/rj45cfgbybt/plc/index?imgurl=${res.url}"><template><text style="color: #7232dd;">烧录设备</text></template></wx-open-launch-weapp>`
- console.log('本地存储成功')
- showSuccessToast('编译成功!')
- } else {
- router.push({
- name: 'runtime',
- query: {
- id: crtProject.value!.id,
- url: res.url
- }
- })
- }
- }
- })
- }
- // 删除工程
- const delProject = () => {
- if (crtProject.value) {
- showConfirmDialog({
- title: '提示',
- message: '确定要删除这个工程吗'
- })
- .then(() => {
- // on confirm
- console.log(projectList.value)
- localStorage.removeItem('imgobj' + crtProject.value!.id)
- projectList.value = projectList.value.filter((item) => crtProject.value?.id !== item.id)
- router.replace({ name: 'Automate' })
- })
- .catch(() => {
- // on cancel
- })
- }
- }
- const showSharePopup = ref(false)
- const shareImg = ref('')
- const qrcodeCanvas = ref<HTMLCanvasElement>()
- const shareProject = async () => {
- if (!window.isInWx) return
- showSharePopup.value = true
- await nextTick()
- // const canvasEl = document.createElement('canvas')
- // const ratio = window.devicePixelRatio
- // 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}px`
- // canvasEl!.width = minWindowSize * ratio
- // canvasEl!.height = minWindowSize * ratio
- // qrcode.toCanvas(canvasEl!, JSON.stringify({ ...crtProject.value, qrcodeType: 'worldflying_plc_editor' }), {
- // width: minWindowSize * 2
- // })
- // const canvasEl1 = document.createElement('canvas')
- // canvasEl1.style.width = `${minWindowSize}px`
- // canvasEl1.style.height = `${minWindowSize + 50}px`
- // canvasEl1.width = minWindowSize * ratio
- // canvasEl1.height = (minWindowSize + 50) * ratio
- // const ctx = canvasEl1?.getContext('2d')
- // if (ctx) {
- // ctx.imageSmoothingEnabled = false
- // const fontSize = 16 * ratio
- // ctx.font = `${fontSize}px Arial`
- // ctx.fillText(`工程名称:${crtProject.value?.name}`, 20 * ratio, 35 * ratio)
- // ctx.drawImage(canvasEl, 0, 50 * ratio, minWindowSize * ratio, minWindowSize * ratio)
- // // shareImg.value = canvasEl1.toDataURL('image/png', 1)
- // canvasEl1.toBlob((blob) => {
- // if (!blob) return
- // shareImg.value = URL.createObjectURL(blob)
- // }, 'image/png', 1)
- // }
- qrcode.toDataURL(
- JSON.stringify({ ...crtProject.value, qrcodeType: 'worldflying_plc_editor' }),
- function (error, url) {
- if (error) console.error(error)
- // console.log(url)
- const ratio = 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 + 120}px`
- canvasEl.width = minWindowSize * ratio
- canvasEl.height = (minWindowSize + 120) * ratio
- const ctx = canvasEl?.getContext('2d')
- if (ctx) {
- const fontSize = 12 * ratio
- ctx.font = `${fontSize}px Arial`
- ctx.fillText(`工程名称:${crtProject.value?.name}`, 5 * ratio, 35 * ratio)
- const img = new Image()
- img.src = url
- img.onload = function () {
- ctx.imageSmoothingEnabled = false
- ctx.drawImage(img, 0, 40 * ratio, minWindowSize * ratio, minWindowSize * ratio)
- const tipText = '请打开沃航PLC手机编辑器,通过编辑页面导入该图片'
- const arr = []
- for (let i = 1; i <= tipText.length; i++) {
- const tipMsg = ctx.measureText(tipText.slice(0, i))
- if (Math.ceil(tipMsg.width / ratio) > minWindowSize) {
- arr.push(tipText.slice(0, i - 1))
- arr.push(tipText.slice(i - 1))
- break
- }
- if (i === tipText.length) {
- arr.push(tipText)
- }
- }
- arr.forEach((item, index) => {
- ctx.fillText(item, 5 * ratio, (minWindowSize + 55 + index * 15) * ratio)
- })
- const companyText = '沃航科技有限公司'
- const companyMsg = ctx.measureText(companyText)
- ctx.fillText(companyText, (minWindowSize - 10) * ratio - companyMsg.width, (minWindowSize + 100) * ratio)
- shareImg.value = canvasEl.toDataURL('image/png', 1)
- // canvasEl.toBlob(
- // (blob) => {
- // if (!blob) return
- // shareImg.value = URL.createObjectURL(blob)
- // },
- // 'image/png',
- // )
- }
- }
- canvasEl.remove()
- }
- )
- }
- const getSTFile = () => {
- if (!crtProject.value) return
- let st = ''
- crtProject.value.commandList.forEach((item, index) => {
- st += `
- PROGRAM program${index}
- VAR
- DI0: BOOL
- DI1: BOOL
- AI0: INT
- AI1: INT
- DO0: BOOL
- DO1: BOOL
- AO0: INT
- AO1: INT
- `
- const tempVarNum = item.stepList.length
- for (let i = 1; i <= tempVarNum; i++) {
- st += `TEMP${i}: BOOL`
- }
- })
- }
- let copyStatus = false
- let copyTimer: any
- // 复制任务
- const copyCommand = (cmd: CommandType) => {
- console.log(copyStatus)
- if (copyStatus) return
- if (copyTimer) clearTimeout(copyTimer)
- copyStatus = true
- // 提取基础名称和编号
- const baseName = cmd.name.replace(/\s*\(\d+\)/, '') // 去掉末尾的 "(数字)"
- let maxSuffix = 0
- // 遍历任务列表,找到与基础名称匹配的最大编号
- crtProject.value?.commandList.forEach((item) => {
- if (item.name.startsWith(baseName)) {
- const match = item.name.match(/\((\d+)\)/) // 匹配末尾的 "(数字)"
- if (match) {
- const suffix = parseInt(match[1], 10)
- if (suffix > maxSuffix) {
- maxSuffix = suffix
- }
- }
- }
- })
- // 生成新的任务名称
- const newSuffix = maxSuffix + 1
- const name = `${baseName}(${newSuffix})`
- const id = '' + Date.now()
- const time = new Date().toLocaleString()
- crtProject.value?.commandList.unshift({
- ...deepClone(cmd),
- name,
- id,
- time
- })
- copyTimer = setTimeout(() => {
- copyStatus = false
- }, 500)
- }
- </script>
- <style scoped>
- .project-info {
- padding: 16px 0 0;
- height: 100%;
- overflow: hidden;
- }
- .van-button {
- padding: 2px 8px;
- }
- .more .van-button {
- padding: 2px 16px;
- }
- .header {
- padding: 0 16px 16px;
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
- .header .project-name {
- height: 100%;
- max-width: 70%;
- display: flex;
- gap: 4px;
- align-items: center;
- justify-content: center;
- }
- .header .project-name .name {
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
- max-width: 70%;
- }
- .command-container {
- height: calc(100% - 65px);
- padding-bottom: 16px;
- overflow: auto;
- }
- .command-container :deep(.van-cell__value) {
- width: 32px;
- flex: none;
- }
- .command-container :deep(.van-cell__title) {
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
- }
- .command-container :deep(.van-swipe-cell__right) {
- }
- .del-button {
- width: 64px;
- height: 100%;
- }
- .van-cell {
- justify-content: space-between;
- align-items: center;
- margin-bottom: 2px;
- gap: 16px;
- }
- .add-btn {
- position: fixed;
- bottom: 64px;
- left: 50%;
- transform: translateX(-50%);
- width: 70%;
- }
- .van-button-group {
- margin: 16px;
- display: flex;
- 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;
- }
- .iconfont {
- font-size: 24px;
- }
- .wx-tag {
- display: flex;
- width: 100%;
- }
- </style>
|