| | |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="设备编码" prop="deviceCode"> |
| | | <el-input |
| | | v-model="deviceForm.deviceCode" |
| | | placeholder="请输入设备编码" |
| | | maxlength="50" |
| | | :disabled="isEdit" |
| | | /> |
| | | <template v-if="isEdit"> |
| | | <el-input |
| | | v-model="deviceForm.deviceCode" |
| | | maxlength="50" |
| | | disabled |
| | | /> |
| | | </template> |
| | | <template v-else> |
| | | <el-tag type="info">保存后自动生成</el-tag> |
| | | </template> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="设备类型" prop="deviceType"> |
| | |
| | | </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> |
| | | |
| | |
| | | /> |
| | | </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 |
| | |
| | | const deviceTypesLoading = ref(false) |
| | | |
| | | // 设备逻辑参数(根据设备类型动态显示) |
| | | const deviceLogicParams = reactive({}) |
| | | const deviceLogicParams = ref({}) |
| | | |
| | | const S7_PLC_TYPES = ['S1200', 'S1500'] |
| | | const MODBUS_PLC_TYPES = ['MODBUS'] |
| | |
| | | description: '', |
| | | isPrimary: false, |
| | | enabled: true, |
| | | extraParams: null |
| | | extraParams: null, |
| | | projectId: 1 |
| | | }) |
| | | |
| | | const deviceForm = reactive(getDefaultForm()) |
| | |
| | | const isEdit = computed(() => !!props.deviceData) |
| | | |
| | | // 表单验证规则 |
| | | const validateDeviceCode = async (rule, value, callback) => { |
| | | if (!value) { |
| | | // 允许留空,后台自动生成 |
| | | return callback() |
| | | } |
| | | try { |
| | | const res = await deviceConfigApi.checkCode( |
| | | value.trim(), |
| | | isEdit.value ? props.deviceData?.id : null |
| | | ) |
| | | if (res?.data === true) { |
| | | callback(new Error('设备编码已存在,请更换')) |
| | | } else { |
| | | callback() |
| | | } |
| | | } catch (err) { |
| | | console.error('检查设备编码失败', err) |
| | | callback(new Error('设备编码校验失败,请稍后重试')) |
| | | } |
| | | } |
| | | |
| | | const deviceRules = { |
| | | deviceName: [ |
| | | { required: true, message: '请输入设备名称', trigger: 'blur' }, |
| | | { min: 1, max: 50, message: '设备名称长度在 1 到 50 个字符', trigger: 'blur' } |
| | | ], |
| | | deviceCode: [ |
| | | { required: true, message: '请输入设备编码', trigger: 'blur' }, |
| | | { pattern: /^[A-Z0-9_]+$/, message: '设备编码只能包含大写字母、数字和下划线', trigger: 'blur' } |
| | | { pattern: /^[A-Z0-9_]+$/, message: '设备编码只能包含大写字母、数字和下划线', trigger: 'blur' }, |
| | | { validator: validateDeviceCode, trigger: 'blur' } |
| | | ], |
| | | deviceType: [ |
| | | { required: true, message: '请选择设备类型', trigger: 'change' } |
| | |
| | | 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' } |
| | |
| | | } |
| | | }) |
| | | |
| | | // 处理通讯协议变化 |
| | | const handleProtocolTypeChange = (value) => { |
| | | if (!deviceForm.plcType || !value) { |
| | | return |
| | | } |
| | | |
| | | if (value !== 'S7 Communication' && S7_PLC_TYPES.includes(deviceForm.plcType)) { |
| | | ElMessage.warning('S7系列PLC通常使用S7 Communication协议,请确认协议选择是否正确') |
| | | return |
| | | } |
| | | |
| | | if (value !== 'Modbus TCP' && MODBUS_PLC_TYPES.includes(deviceForm.plcType)) { |
| | | ElMessage.warning('Modbus 类型PLC通常使用 Modbus TCP 协议,请确认协议选择是否正确') |
| | | } |
| | | } |
| | | |
| | | // 方法定义 |
| | | // 加载设备类型列表 |
| | |
| | | } |
| | | |
| | | // 加载设备逻辑参数 |
| | | 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 = {} |
| | | } |
| | | } |
| | | |
| | |
| | | deviceFormRef.value?.clearValidate() |
| | | |
| | | // 重置设备逻辑参数 |
| | | Object.keys(deviceLogicParams).forEach(key => { |
| | | delete deviceLogicParams[key] |
| | | }) |
| | | deviceLogicParams.value = {} |
| | | } |
| | | |
| | | const addConfigParam = () => { |
| | |
| | | } |
| | | |
| | | // 保存设备逻辑参数(直接使用deviceLogicParams,由各个配置组件管理) |
| | | 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 字符串 |
| | |
| | | isPrimary: deviceForm.isPrimary, |
| | | enabled: deviceForm.enabled, |
| | | description: deviceForm.description, |
| | | projectId: deviceForm.projectId, |
| | | configJson: configJsonValue, // 保存配置参数JSON |
| | | extraParams: JSON.stringify(extraObj) |
| | | } |