From 14763d895151f3ddad09906f2233057b8b967881 Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期五, 19 十二月 2025 17:06:18 +0800
Subject: [PATCH] 添加plc通讯协议工厂,支持后续多种plc协议
---
mes-web/src/views/device/DeviceEditDialog.vue | 111 +++++++++++++++++++++++++++++--------------------------
1 files changed, 58 insertions(+), 53 deletions(-)
diff --git a/mes-web/src/views/device/DeviceEditDialog.vue b/mes-web/src/views/device/DeviceEditDialog.vue
index 494fa61..ad6668c 100644
--- a/mes-web/src/views/device/DeviceEditDialog.vue
+++ b/mes-web/src/views/device/DeviceEditDialog.vue
@@ -40,19 +40,21 @@
</el-form-item>
<el-form-item label="璁惧绫诲瀷" prop="deviceType">
- <el-select v-model="deviceForm.deviceType" placeholder="閫夋嫨璁惧绫诲瀷" style="width: 100%;">
- <el-option label="澶ц溅璁惧" value="澶ц溅璁惧" />
- <el-option label="澶х悊鐗囩" value="澶х悊鐗囩" />
- <el-option label="鍗ц浆绔嬫壂鐮�" value="鍗ц浆绔嬫壂鐮�" />
- <el-option label="鍗ц浆绔�" value="鍗ц浆绔�" />
+ <el-select v-model="deviceForm.deviceType" placeholder="閫夋嫨璁惧绫诲瀷" style="width: 100%;" :loading="deviceTypesLoading">
+ <el-option
+ v-for="type in deviceTypes"
+ :key="type"
+ :label="type"
+ :value="type"
+ />
</el-select>
</el-form-item>
- <el-form-item label="PLC绫诲瀷" prop="plcType">
- <el-select v-model="deviceForm.plcType" placeholder="閫夋嫨PLC绫诲瀷" style="width: 100%;" clearable>
+ <el-form-item label="閫氳绫诲瀷" prop="plcType">
+ <el-select v-model="deviceForm.plcType" placeholder="閫夋嫨閫氳绫诲瀷" style="width: 100%;" clearable>
<el-option label="瑗块棬瀛� S7-1200" value="S1200" />
<el-option label="瑗块棬瀛� S7-1500" value="S1500" />
- <el-option label="Modbus 鎺у埗鍣�" value="MODBUS" />
+ <el-option label="Modbus TCP" value="MODBUS" />
</el-select>
</el-form-item>
@@ -103,22 +105,7 @@
/>
</el-form-item>
- <el-form-item label="閫氳鍗忚" prop="protocolType">
- <el-select
- v-model="deviceForm.protocolType"
- placeholder="閫夋嫨閫氳鍗忚"
- style="width: 100%;"
- @change="handleProtocolTypeChange"
- >
- <el-option label="S7 Communication" value="S7 Communication" />
- <el-option label="Modbus TCP" value="Modbus TCP" />
- <el-option label="OPC UA" value="OPC UA" />
- <el-option label="EtherNet/IP" value="EtherNet/IP" />
- <el-option label="Profinet" value="Profinet" />
- <el-option label="鍏朵粬" value="鍏朵粬" />
- </el-select>
- <span class="form-tip">S7绯诲垪PLC閫氬父浣跨敤S7 Communication鍗忚</span>
- </el-form-item>
+
<el-form-item label="瓒呮椂鏃堕棿(绉�)" prop="timeout">
<el-input-number
@@ -347,8 +334,12 @@
const testing = ref(false)
const testResult = ref(null)
+// 璁惧绫诲瀷鍒楄〃
+const deviceTypes = ref([])
+const deviceTypesLoading = ref(false)
+
// 璁惧閫昏緫鍙傛暟锛堟牴鎹澶囩被鍨嬪姩鎬佹樉绀猴級
-const deviceLogicParams = reactive({})
+const deviceLogicParams = ref({})
const S7_PLC_TYPES = ['S1200', 'S1500']
const MODBUS_PLC_TYPES = ['MODBUS']
@@ -417,9 +408,7 @@
moduleName: [
{ required: true, message: '璇疯緭鍏ユā鍧楀悕绉�', trigger: 'blur' }
],
- protocolType: [
- { required: true, message: '璇烽�夋嫨閫氳鍗忚', trigger: 'change' }
- ],
+
timeout: [
{ required: true, message: '璇疯緭鍏ヨ秴鏃舵椂闂�', trigger: 'blur' },
{ type: 'number', min: 1, max: 300, message: '瓒呮椂鏃堕棿鍦� 1 鍒� 300 绉掍箣闂�', trigger: 'blur' }
@@ -447,6 +436,8 @@
watch(() => props.modelValue, (newVal) => {
dialogVisible.value = newVal
if (newVal) {
+ // 鍔犺浇璁惧绫诲瀷鍒楄〃
+ loadDeviceTypes()
if (isEdit.value && props.deviceData) {
loadDeviceData(props.deviceData)
} else {
@@ -483,23 +474,41 @@
}
})
-// 澶勭悊閫氳鍗忚鍙樺寲
-const handleProtocolTypeChange = (value) => {
- if (!deviceForm.plcType || !value) {
+
+
+// 鏂规硶瀹氫箟
+// 鍔犺浇璁惧绫诲瀷鍒楄〃
+const loadDeviceTypes = async () => {
+ if (deviceTypes.value.length > 0) {
+ // 濡傛灉宸茬粡鍔犺浇杩囷紝涓嶅啀閲嶅鍔犺浇
return
}
-
- if (value !== 'S7 Communication' && S7_PLC_TYPES.includes(deviceForm.plcType)) {
- ElMessage.warning('S7绯诲垪PLC閫氬父浣跨敤S7 Communication鍗忚锛岃纭鍗忚閫夋嫨鏄惁姝g‘')
- return
- }
-
- if (value !== 'Modbus TCP' && MODBUS_PLC_TYPES.includes(deviceForm.plcType)) {
- ElMessage.warning('Modbus 绫诲瀷PLC閫氬父浣跨敤 Modbus TCP 鍗忚锛岃纭鍗忚閫夋嫨鏄惁姝g‘')
+ // 鎵�鏈夋敮鎸佺殑璁惧绫诲瀷锛堢‘淇濆寘鍚墍鏈夋湁閰嶇疆缁勪欢鐨勭被鍨嬶級
+ const supportedTypes = ['澶ц溅璁惧', '澶х悊鐗囩', '鍗ц浆绔嬫壂鐮�', '鍗ц浆绔�']
+
+ try {
+ deviceTypesLoading.value = true
+ const res = await deviceConfigApi.getDeviceTypes()
+ if (res?.data && Array.isArray(res.data)) {
+ // 鍚堝苟鏁版嵁搴撲腑鐨勭被鍨嬪拰鏀寔鐨勭被鍨嬶紝鍘婚噸骞舵帓搴�
+ const dbTypes = res.data
+ const allTypes = [...new Set([...supportedTypes, ...dbTypes])].sort()
+ deviceTypes.value = allTypes
+ } else {
+ // 濡傛灉API杩斿洖澶辫触锛屼娇鐢ㄩ粯璁ょ被鍨�
+ deviceTypes.value = supportedTypes
+ console.warn('鑾峰彇璁惧绫诲瀷鍒楄〃澶辫触锛屼娇鐢ㄩ粯璁ょ被鍨�')
+ }
+ } catch (error) {
+ console.error('鍔犺浇璁惧绫诲瀷鍒楄〃澶辫触:', error)
+ // 澶辫触鏃朵娇鐢ㄩ粯璁ょ被鍨�
+ deviceTypes.value = supportedTypes
+ ElMessage.warning('鍔犺浇璁惧绫诲瀷鍒楄〃澶辫触锛屼娇鐢ㄩ粯璁ょ被鍨�')
+ } finally {
+ deviceTypesLoading.value = false
}
}
-// 鏂规硶瀹氫箟
const parseJsonSafe = (str, defaultValue = null) => {
if (!str) return defaultValue
try {
@@ -643,15 +652,11 @@
}
// 鍔犺浇璁惧閫昏緫鍙傛暟
-const loadDeviceLogicParams = (deviceLogic, deviceType) => {
- // 娓呯┖鐜版湁鍙傛暟
- Object.keys(deviceLogicParams).forEach(key => {
- delete deviceLogicParams[key]
- })
-
- // 鏍规嵁璁惧绫诲瀷鍔犺浇瀵瑰簲鐨勫弬鏁�
+const loadDeviceLogicParams = (deviceLogic) => {
if (deviceLogic && Object.keys(deviceLogic).length > 0) {
- Object.assign(deviceLogicParams, deviceLogic)
+ deviceLogicParams.value = { ...deviceLogic }
+ } else {
+ deviceLogicParams.value = {}
}
}
@@ -661,9 +666,7 @@
deviceFormRef.value?.clearValidate()
// 閲嶇疆璁惧閫昏緫鍙傛暟
- Object.keys(deviceLogicParams).forEach(key => {
- delete deviceLogicParams[key]
- })
+ deviceLogicParams.value = {}
}
const addConfigParam = () => {
@@ -738,8 +741,10 @@
}
// 淇濆瓨璁惧閫昏緫鍙傛暟锛堢洿鎺ヤ娇鐢╠eviceLogicParams锛岀敱鍚勪釜閰嶇疆缁勪欢绠$悊锛�
- if (deviceLogicParams && Object.keys(deviceLogicParams).length > 0) {
- extraObj.deviceLogic = { ...deviceLogicParams }
+ if (deviceLogicParams.value && Object.keys(deviceLogicParams.value).length > 0) {
+ extraObj.deviceLogic = { ...deviceLogicParams.value }
+ } else {
+ delete extraObj.deviceLogic
}
// 鏋勫缓 configJson锛氬皢 configParams 鏁扮粍杞崲涓� JSON 瀛楃涓�
--
Gitblit v1.8.0