sige 1 year ago
parent
commit
f4e3d0aef4
  1. 1
      package-lock.json
  2. 1
      package.json
  3. 1
      src/App.vue
  4. 164
      src/components/TestFeeder.vue
  5. 162
      src/components/TestTubePreProcess.vue
  6. 4
      src/main.js

1
package-lock.json

@ -8,6 +8,7 @@
"name": "a8k_webui",
"version": "0.1.0",
"dependencies": {
"@ant-design/icons-vue": "^7.0.1",
"ant-design-vue": "^4.2.3",
"axios": "^1.7.2",
"core-js": "^3.8.3",

1
package.json

@ -8,6 +8,7 @@
"lint": "vue-cli-service lint"
},
"dependencies": {
"@ant-design/icons-vue": "^7.0.1",
"ant-design-vue": "^4.2.3",
"axios": "^1.7.2",
"core-js": "^3.8.3",

1
src/App.vue

@ -18,6 +18,7 @@ import { useRouter } from 'vue-router'
const router = useRouter();
const menuItems = [
{key: 'feeder', label: '进出料', path:'feeder'},
{key: 'tube-pre-process', label : '样本预处理', path:'tube-pre-process'},
];
function actionMenuItemClick( event ) {

164
src/components/TestFeeder.vue

@ -1,90 +1,98 @@
<template>
<div class="h-full flex flex-col">
<div class="border-b p-5 bg-white">进出料</div>
<div class="p-5 h-0 grow">
<div class="border rounded p-5 whitespace-pre-line h-full overflow-y-auto bg-white"
>{{ message }}</div>
<div class="border-b p-5 bg-white flex flex-row">
<div>进出料</div>
<div v-if="false" class="ml-1"><LoadingOutlined /></div>
</div>
<div class="p-5 border-t border-b">
<a-row>
<a-col class="p-1" :span="8"><a-input prefix="回零超时时间 : " v-model:value="serviceParams.moveToZeroOvertime" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="执行动作的超时时间 : " v-model:value="serviceParams.actionOvertime" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="试管扫码位置 : " v-model:value="serviceParams.tubeScanPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="高低试管判断位置 : " v-model:value="serviceParams.tubeHeighJudgmentPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="试管预处理位置 : " v-model:value="serviceParams.tubePreProcessPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="有无判断位置 : " v-model:value="serviceParams.tubeExistJudgmentPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="入料位置 : " v-model:value="serviceParams.tubeRackEnterPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="出料位置 : " v-model:value="serviceParams.tubeRackExitPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="试管架扫码位置 : " v-model:value="serviceParams.tubeRackScanCodePos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="水平移动电机位置偏移 : " v-model:value="serviceParams.horizontalMotorOffset" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="水平电机丢步判断 : " v-model:value="serviceParams.horizontalMotorLostStepThresholdVal" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="试管扫码夹紧位置 : " v-model:value="serviceParams.scanCodeClampPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="试管扫码释放位置 : " v-model:value="serviceParams.scanCodeReleasePos" /></a-col>
<a-col class="p-1" :span="8">
<a-button class="mr-1" @click="actionServiceParamsReload">刷新</a-button>
<a-button @click="actionServiceParamsSave">保存</a-button>
</a-col>
</a-row>
</div>
<div class="p-5">
<a-button class="m-1" @click="actionQuickExec('moveToZeroWhenDeviceSetup')">设备启动归零</a-button>
<a-button class="m-1" @click="actionQuickExec('moveToZero')">归零</a-button>
<a-button class="m-1" @click="actionQuickExec('moveTubeRackToEnterPos')">移动试管架到入口位置</a-button>
<a-button class="m-1" @click="actionQuickExec('moveTubeRackToExitPos')">移动试管架到出口位置</a-button>
<a-button class="m-1" @click="actionQuickExec('moveTubeRackToScanPos')">移动试管架到试管架扫码位置</a-button>
<a-button class="m-1" @click="actionQuickExec('moveTubeRackToScanPosAndScan')">移动试管架到试管架扫码并扫码</a-button>
<a-button class="m-1" @click="actionQuickExec('isTubeRackInEnterPos')">试管架是否在入料位置</a-button>
<a-button class="m-1" @click="actionQuickExec('isTubeRackInExitPos')">试管架是否在出料位置</a-button>
<a-button class="m-1" @click="actionQuickExec('getMoveChannelPhotoelectricState',0)">获取移动通道的光电状态()</a-button>
<a-button class="m-1" @click="actionQuickExec('getMoveChannelPhotoelectricState',1)">获取移动通道的光电状态()</a-button>
<a-button class="m-1" @click="actionQuickExec('scanClampModuleCompress')">扫描夹紧机构夹紧</a-button>
<a-button class="m-1" @click="actionQuickExec('scanClampModuleReset')">扫描夹紧机构复位</a-button>
<a-row class="h-0 grow">
<a-col class="border-r" :span="16">
<div class="p-5 border-t border-b">
<a-row>
<a-col class="p-1" :span="8"><a-input prefix="回零超时时间 : " v-model:value="serviceParams.moveToZeroOvertime" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="执行动作的超时时间 : " v-model:value="serviceParams.actionOvertime" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="试管扫码位置 : " v-model:value="serviceParams.tubeScanPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="高低试管判断位置 : " v-model:value="serviceParams.tubeHeighJudgmentPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="试管预处理位置 : " v-model:value="serviceParams.tubePreProcessPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="有无判断位置 : " v-model:value="serviceParams.tubeExistJudgmentPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="入料位置 : " v-model:value="serviceParams.tubeRackEnterPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="出料位置 : " v-model:value="serviceParams.tubeRackExitPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="试管架扫码位置 : " v-model:value="serviceParams.tubeRackScanCodePos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="水平移动电机位置偏移 : " v-model:value="serviceParams.horizontalMotorOffset" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="水平电机丢步判断 : " v-model:value="serviceParams.horizontalMotorLostStepThresholdVal" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="试管扫码夹紧位置 : " v-model:value="serviceParams.scanCodeClampPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="试管扫码释放位置 : " v-model:value="serviceParams.scanCodeReleasePos" /></a-col>
<a-col class="p-1" :span="8">
<a-button class="mr-1" @click="actionServiceParamsReload">刷新</a-button>
<a-button @click="actionServiceParamsSave">保存</a-button>
</a-col>
</a-row>
</div>
<div class="mt-1">
<a-input-group compact class="flex flex-row">
<a-input class="!w-64" prefix="TubeType : " v-model:value="moveTubeToScanPosParams[0]"/>
<a-input class="!w-32" prefix="TubeIndex : " v-model:value="moveTubeToScanPosParams[1]"/>
<a-button @click="actionMoveTubeToScanPos">移动试管到扫码位置</a-button>
</a-input-group>
</div>
<div class="mt-1">
<a-input-group compact class="flex flex-row">
<a-input class="!w-64" prefix="TubeType : " v-model:value="moveTubeToScanPosAndScanParams[0]"/>
<a-input class="!w-32" prefix="TubeIndex : " v-model:value="moveTubeToScanPosAndScanParams[1]"/>
<a-button @click="actionMoveTubeToScanPosAndScan">移动试管到扫码位置并扫码</a-button>
</a-input-group>
</div>
<div class="mt-1">
<a-input-group compact class="flex flex-row">
<a-input class="!w-64" prefix="TubeType : " v-model:value="moveTubeToHeighJudgmentPosParams[0]"/>
<a-input class="!w-32" prefix="TubeIndex : " v-model:value="moveTubeToHeighJudgmentPosParams[1]"/>
<a-button @click="actionMoveTubeToHeighJudgmentPos">移动试管到试管高低判断位置</a-button>
</a-input-group>
</div>
<div class="mt-1">
<a-input-group compact class="flex flex-row">
<a-input class="!w-64" prefix="TubeType : " v-model:value="moveTubeToPreProcessPosParams[0]"/>
<a-input class="!w-32" prefix="TubeIndex : " v-model:value="moveTubeToPreProcessPosParams[1]"/>
<a-button @click="actionMoveTubeToPreProcessPos">移动试管到试管预处理的位置</a-button>
</a-input-group>
</div>
<div class="mt-1">
<a-input-group compact class="flex flex-row">
<a-input class="!w-64" prefix="TubeType : " v-model:value="moveTubeToExistJudgmentPosParams[0]"/>
<a-input class="!w-32" prefix="TubeIndex : " v-model:value="moveTubeToExistJudgmentPosParams[1]"/>
<a-button @click="actionMoveTubeToExistJudgmentPos">移动试管到试管有无判断位置</a-button>
</a-input-group>
</div>
</div>
<div class="p-5">
<a-button class="m-1" @click="actionQuickExec('moveToZeroWhenDeviceSetup')">失能</a-button>
<a-button class="m-1" @click="actionQuickExec('moveToZero')">使能</a-button>
<a-button class="m-1" @click="actionQuickExec('moveTubeRackToEnterPos')">停止</a-button>
<a-button class="m-1" @click="actionQuickExec('moveToZeroWhenDeviceSetup')">设备启动归零</a-button>
<a-button class="m-1" @click="actionQuickExec('moveToZero')">归零</a-button>
<a-button class="m-1" @click="actionQuickExec('moveTubeRackToEnterPos')">移动试管架到入口位置</a-button>
<a-button class="m-1" @click="actionQuickExec('moveTubeRackToExitPos')">移动试管架到出口位置</a-button>
<a-button class="m-1" @click="actionQuickExec('moveTubeRackToScanPos')">移动试管架到试管架扫码位置</a-button>
<a-button class="m-1" @click="actionQuickExec('moveTubeRackToScanPosAndScan')">移动试管架到试管架扫码并扫码</a-button>
<a-button class="m-1" @click="actionQuickExec('isTubeRackInEnterPos')">试管架是否在入料位置</a-button>
<a-button class="m-1" @click="actionQuickExec('isTubeRackInExitPos')">试管架是否在出料位置</a-button>
<a-button class="m-1" @click="actionQuickExec('getMoveChannelPhotoelectricState',0)">获取移动通道的光电状态()</a-button>
<a-button class="m-1" @click="actionQuickExec('getMoveChannelPhotoelectricState',1)">获取移动通道的光电状态()</a-button>
<a-button class="m-1" @click="actionQuickExec('scanClampModuleCompress')">扫描夹紧机构夹紧</a-button>
<a-button class="m-1" @click="actionQuickExec('scanClampModuleReset')">扫描夹紧机构复位</a-button>
<div class="mt-1">
<a-input-group compact class="flex flex-row">
<a-button @click="actionMoveTubeToScanPos">移动试管到扫码位置</a-button>
<a-input class="!w-64" prefix="TubeType : " v-model:value="moveTubeToScanPosParams[0]"/>
<a-input class="!w-32" prefix="TubeIndex : " v-model:value="moveTubeToScanPosParams[1]"/>
</a-input-group>
</div>
<div class="mt-1">
<a-input-group compact class="flex flex-row">
<a-button @click="actionMoveTubeToScanPosAndScan">移动试管到扫码位置并扫码</a-button>
<a-input class="!w-64" prefix="TubeType : " v-model:value="moveTubeToScanPosAndScanParams[0]"/>
<a-input class="!w-32" prefix="TubeIndex : " v-model:value="moveTubeToScanPosAndScanParams[1]"/>
</a-input-group>
</div>
<div class="mt-1">
<a-input-group compact class="flex flex-row">
<a-button @click="actionMoveTubeToHeighJudgmentPos">移动试管到试管高低判断位置</a-button>
<a-input class="!w-64" prefix="TubeType : " v-model:value="moveTubeToHeighJudgmentPosParams[0]"/>
<a-input class="!w-32" prefix="TubeIndex : " v-model:value="moveTubeToHeighJudgmentPosParams[1]"/>
</a-input-group>
</div>
<div class="mt-1">
<a-input-group compact class="flex flex-row">
<a-button @click="actionMoveTubeToPreProcessPos">移动试管到试管预处理的位置</a-button>
<a-input class="!w-64" prefix="TubeType : " v-model:value="moveTubeToPreProcessPosParams[0]"/>
<a-input class="!w-32" prefix="TubeIndex : " v-model:value="moveTubeToPreProcessPosParams[1]"/>
</a-input-group>
</div>
<div class="mt-1">
<a-input-group compact class="flex flex-row">
<a-button @click="actionMoveTubeToExistJudgmentPos">移动试管到试管有无判断位置</a-button>
<a-input class="!w-64" prefix="TubeType : " v-model:value="moveTubeToExistJudgmentPosParams[0]"/>
<a-input class="!w-32" prefix="TubeIndex : " v-model:value="moveTubeToExistJudgmentPosParams[1]"/>
</a-input-group>
</div>
</div>
</a-col>
<a-col :span="8" class="p-5">
<div class="border rounded p-5 whitespace-pre-line h-full overflow-y-auto bg-white"
>{{ message }}</div>
</a-col>
</a-row>
</div>
</template>
<script setup>
import ApiClient from '@/utils/ApiClient';
import { ref } from 'vue';
import { LoadingOutlined } from '@ant-design/icons-vue';
const message = ref('');
const moveTubeToScanPosParams = ref(['', 0]);
const moveTubeToScanPosAndScanParams = ref(['',0]);

162
src/components/TestTubePreProcess.vue

@ -0,0 +1,162 @@
<template>
<div class="h-full flex flex-col">
<div class="border-b p-5 bg-white flex flex-row">
<div>样本预处理</div>
<div v-if="false" class="ml-1"><LoadingOutlined /></div>
</div>
<a-row class="h-0 grow">
<a-col class="border-r" :span="16">
<div class="p-5 border-t border-b">
<a-row>
<a-col class="p-1" :span="8"><a-input prefix="回零超时时间 : " v-model:value="serviceParams.MoveToZeroOvertime" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="执行动作的超时时间 : " v-model:value="serviceParams.ActionOvertime" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="高全血试管取帽位置 : " v-model:value="serviceParams.ZMotor_HighBloodTakeCapHeight" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="矮全血试管取帽位置 : " v-model:value="serviceParams.ZMotor_ShortBloodTakeCapHeight" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="高试管帽子判断位置 : " v-model:value="serviceParams.ZMotor_HighBloodCapJudgeHeight" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="矮全血试管帽子判断位置 : " v-model:value="serviceParams.ZMotor_ShortBloodCapJudgeHeight" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="摇匀位放置高度 : " v-model:value="serviceParams.ZMotor_placeShakeHeight" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="水平移动电机待机位置 : " v-model:value="serviceParams.HorizontalMotor_standbyPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="水平移动电机取帽位置 : " v-model:value="serviceParams.HorizontalMotor_takeCapPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="水平移动电机放帽位置 : " v-model:value="serviceParams.HorizontalMotor_takePushCapPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="抓手舵机待机位置 : " v-model:value="serviceParams.GripperServo_standbyPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="抓手舵机取帽扭矩 : " v-model:value="serviceParams.GripperServo_takeCapTorque" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="抓手舵机取试管位置 : " v-model:value="serviceParams.GripperServo_takeTubePos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="判断是否有帽子的位置阈值 : " v-model:value="serviceParams.GripperServo_hatDeterminesPosThres" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="摇匀电机待机位置 : " v-model:value="serviceParams.ShakeMotor_standbyPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="摇匀电机摇匀角度 : " v-model:value="serviceParams.ShakeMotor_shakeDegree" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="试管夹紧电机待机位置 : " v-model:value="serviceParams.TubeClampMotor_standbyPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="试管夹紧电机夹紧位置 : " v-model:value="serviceParams.TubeClampMotor_ClampPos" /></a-col>
<a-col class="p-1" :span="8"><a-input prefix="气溶胶风扇控制参数 : " v-model:value="serviceParams.AerosolFanLevel" /></a-col>
<a-col class="p-1" :span="8">
<a-button class="mr-1" @click="actionServiceParamsReload">刷新</a-button>
<a-button @click="actionServiceParamsSave">保存</a-button>
</a-col>
</a-row>
</div>
<div class="p-5">
<a-button class="m-1" @click="actionQuickExec('enableModule',0)">失能</a-button>
<a-button class="m-1" @click="actionQuickExec('enableModule',1)">使能</a-button>
<a-button class="m-1" @click="actionQuickExec('')">停止</a-button>
<a-button class="m-1" @click="actionQuickExec('moveToZero')">归零</a-button>
<a-button class="m-1" @click="actionQuickExec('openAerosolFan')">打开气溶胶风扇</a-button>
<a-button class="m-1" @click="actionQuickExec('closeAerosolFan')">关闭气溶胶风扇</a-button>
<a-button class="m-1" @click="actionQuickExec('moduleResetWhenPowerOn')">设备初始化时复位</a-button>
<a-button class="m-1" @click="actionQuickExec('moduleRuntimeReset')">设备运行时复位</a-button>
<div class="mt-1">
<a-input-group compact class="flex flex-row">
<a-button @click="actionShakeTube">摇匀试管</a-button>
<a-input class="!w-64" prefix="TubeType : " v-model:value="shakeTubeParams[0]"/>
<a-input class="!w-32" prefix="TubeIndex : " v-model:value="shakeTubeParams[1]"/>
</a-input-group>
</div>
<div class="mt-1">
<a-input-group compact class="flex flex-row">
<a-button @click="actionTakeTube">取试管</a-button>
<a-input class="!w-64" prefix="TubeType : " v-model:value="takeTubeParams[0]"/>
</a-input-group>
</div>
<div class="mt-1">
<a-input-group compact class="flex flex-row">
<a-button @click="actionTakeTubeCap">取试管帽</a-button>
<a-input class="!w-64" prefix="TubeType : " v-model:value="takeTubeCapParams[0]"/>
</a-input-group>
</div>
<div class="mt-1">
<a-input-group compact class="flex flex-row">
<a-button @click="actionPushBackTubeCapAndTakeBakTube">盖试管帽并将试管移动回试管架中</a-button>
<a-input class="!w-64" prefix="TubeType : " v-model:value="pushBackTubeCapAndTakeBakTubeParams[0]"/>
</a-input-group>
</div>
</div>
</a-col>
<a-col :span="8" class="p-5">
<div class="border rounded p-5 whitespace-pre-line h-full overflow-y-auto bg-white"
>{{ message }}</div>
</a-col>
</a-row>
</div>
</template>
<script setup>
import ApiClient from '@/utils/ApiClient';
import { ref } from 'vue';
import { LoadingOutlined } from '@ant-design/icons-vue';
const message = ref('');
const serviceParams = ref({});
const shakeTubeParams = ref(['', 3, 90]);
const takeTubeParams = ref(['']);
const takeTubeCapParams = ref(['']);
const pushBackTubeCapAndTakeBakTubeParams = ref(['']);
async function actionServiceParamsReload() {
serviceParams.value = {};
message.value = '';
let client = ApiClient.getClient();
try {
let res = await client.call('tmp-test/get-service-params');
message.value = res;
serviceParams.value = res.data;
} catch ( e ) {
message.value = e.message
}
}
async function actionServiceParamsSave() {
message.value = '';
let client = ApiClient.getClient();
try {
let res = await client.call('tmp-test/update-service-params', serviceParams.value);
message.value = res;
} catch ( e ) {
message.value = e.message
}
}
// execute service method
async function executeServiceMethod( method, params=[]) {
message.value = '';
let client = ApiClient.getClient();
try {
let res = await client.call('tmp-test/execute-service-method', {
service:'motorTubeRackMoveCtrlService',
method,
params
});
message.value = res;
} catch ( e ) {
message.value = e.message
}
}
function actionQuickExec( action, ... params ) {
executeServiceMethod(action, params);
}
function actionShakeTube() {
executeServiceMethod('ShakeTube',[
serviceParams.value[0],
serviceParams.value[1] * 1,
serviceParams.value[2] * 1
])
}
function actionTakeTube() {
executeServiceMethod('takeTube',[
takeTubeParams.value[0],
])
}
function actionTakeTubeCap() {
executeServiceMethod('takeTubeCap',[
takeTubeCapParams.value[0]
]);
}
function actionPushBackTubeCapAndTakeBakTube() {
executeServiceMethod('pushBackTubeCapAndTakeBakTube',[
pushBackTubeCapAndTakeBakTubeParams.value[0]
]);
}
</script>

4
src/main.js

@ -3,12 +3,14 @@ import { createWebHashHistory, createRouter } from 'vue-router'
import App from './App.vue'
import Antd from 'ant-design-vue';
import TestFeeder from './components/TestFeeder.vue';
import TestTubePreProcess from './components/TestTubePreProcess.vue';
import './style/app.css'
const router = createRouter({
history: createWebHashHistory(),
routes : [
{name:'feeder', path:'/feeder', component:TestFeeder}
{name:'feeder', path:'/feeder', component:TestFeeder},
{name:'tube-pre-process', path:'/tube-pre-process', component:TestTubePreProcess},
],
})

Loading…
Cancel
Save