diff --git a/src/api/iot/device/modbus/config/index.ts b/src/api/iot/device/modbus/config/index.ts index fa0e0a80..7db9e69f 100644 --- a/src/api/iot/device/modbus/config/index.ts +++ b/src/api/iot/device/modbus/config/index.ts @@ -9,6 +9,8 @@ export interface DeviceModbusConfigVO { slaveId: number // 从站地址 timeout: number // 连接超时时间,单位:毫秒 retryInterval: number // 重试间隔,单位:毫秒 + mode: number // 模式 + frameFormat: number // 帧格式 status: number // 状态 } diff --git a/src/api/iot/product/product/index.ts b/src/api/iot/product/product/index.ts index 2025884b..a5fff456 100644 --- a/src/api/iot/product/product/index.ts +++ b/src/api/iot/product/product/index.ts @@ -37,7 +37,8 @@ export enum ProtocolTypeEnum { MQTT = 'mqtt', EMQX = 'emqx', COAP = 'coap', - MODBUS_TCP = 'modbus_tcp' + MODBUS_TCP_MASTER = 'modbus_tcp_master', + MODBUS_TCP_SLAVE = 'modbus_tcp_slave' } // IoT 序列化类型枚举 diff --git a/src/utils/dict.ts b/src/utils/dict.ts index e68f1384..ec54b408 100644 --- a/src/utils/dict.ts +++ b/src/utils/dict.ts @@ -248,5 +248,7 @@ export enum DICT_TYPE { IOT_ALERT_RECEIVE_TYPE = 'iot_alert_receive_type', // IoT 告警接收类型 IOT_OTA_TASK_DEVICE_SCOPE = 'iot_ota_task_device_scope', // IoT OTA任务设备范围 IOT_OTA_TASK_STATUS = 'iot_ota_task_status', // IoT OTA 任务状态 - IOT_OTA_TASK_RECORD_STATUS = 'iot_ota_task_record_status' // IoT OTA 记录状态 + IOT_OTA_TASK_RECORD_STATUS = 'iot_ota_task_record_status', // IoT OTA 记录状态 + IOT_MODBUS_MODE = 'iot_modbus_mode', // IoT Modbus 工作模式 + IOT_MODBUS_FRAME_FORMAT = 'iot_modbus_frame_format' // IoT Modbus 帧格式 } diff --git a/src/views/iot/device/device/detail/DeviceModbusConfig.vue b/src/views/iot/device/device/detail/DeviceModbusConfig.vue index f9682f04..a039aaa8 100644 --- a/src/views/iot/device/device/detail/DeviceModbusConfig.vue +++ b/src/views/iot/device/device/detail/DeviceModbusConfig.vue @@ -12,21 +12,38 @@ - - {{ modbusConfig.ip || '-' }} - - - {{ modbusConfig.port || '-' }} - + + + {{ modbusConfig.slaveId || '-' }} - - {{ modbusConfig.timeout ? `${modbusConfig.timeout} ms` : '-' }} - - - {{ modbusConfig.retryInterval ? `${modbusConfig.retryInterval} ms` : '-' }} - + + + + + @@ -141,7 +158,12 @@ - + import { DeviceVO } from '@/api/iot/device/device' -import { ProductVO } from '@/api/iot/product/product' +import { ProductVO, ProtocolTypeEnum } from '@/api/iot/product/product' import { ThingModelData } from '@/api/iot/thingmodel' import { DeviceModbusConfigApi, DeviceModbusConfigVO } from '@/api/iot/device/modbus/config' import { DeviceModbusPointApi, DeviceModbusPointVO } from '@/api/iot/device/modbus/point' @@ -175,6 +197,8 @@ const props = defineProps<{ const message = useMessage() // ======================= 连接配置 ======================= +const isMaster = computed(() => props.product.protocolType === ProtocolTypeEnum.MODBUS_TCP_MASTER) // 是否为 Master 模式 +const isSlave = computed(() => props.product.protocolType === ProtocolTypeEnum.MODBUS_TCP_SLAVE) // 是否为 Slave 模式 const modbusConfig = ref({} as DeviceModbusConfigVO) /** 获取连接配置 */ diff --git a/src/views/iot/device/device/detail/DeviceModbusConfigForm.vue b/src/views/iot/device/device/detail/DeviceModbusConfigForm.vue index b59a7b50..15e6ef97 100644 --- a/src/views/iot/device/device/detail/DeviceModbusConfigForm.vue +++ b/src/views/iot/device/device/detail/DeviceModbusConfigForm.vue @@ -8,19 +8,23 @@ label-width="120px" v-loading="formLoading" > - - - - - - + + + - - - - - - + + + + + import { DeviceModbusConfigApi, DeviceModbusConfigVO } from '@/api/iot/device/modbus/config' +import { ProtocolTypeEnum } from '@/api/iot/product/product' import { getIntDictOptions, DICT_TYPE } from '@/utils/dict' import { CommonStatusEnum } from '@/utils/constants' +import { ModbusModeEnum, ModbusFrameFormatEnum } from '@/views/iot/utils/constants' defineOptions({ name: 'DeviceModbusConfigForm' }) const props = defineProps<{ deviceId: number + protocolType: string }>() const emit = defineEmits<{ @@ -88,6 +124,8 @@ const emit = defineEmits<{ const message = useMessage() const dialogVisible = ref(false) // 弹窗的是否展示 const formLoading = ref(false) // 表单提交 loading 状态 +const isMaster = computed(() => props.protocolType === ProtocolTypeEnum.MODBUS_TCP_MASTER) // 是否为 Master 模式 +const isSlave = computed(() => props.protocolType === ProtocolTypeEnum.MODBUS_TCP_SLAVE) // 是否为 Slave 模式 const formData = ref({ deviceId: props.deviceId, ip: '', @@ -95,15 +133,26 @@ const formData = ref({ slaveId: 1, timeout: 3000, retryInterval: 10000, + mode: ModbusModeEnum.POLLING, + frameFormat: ModbusFrameFormatEnum.MODBUS_TCP, status: CommonStatusEnum.ENABLE }) -const formRules = { - ip: [{ required: true, message: '请输入 IP 地址', trigger: 'blur' }], - port: [{ required: true, message: '请输入端口', trigger: 'blur' }], - slaveId: [{ required: true, message: '请输入从站地址', trigger: 'blur' }], - timeout: [{ required: true, message: '请输入连接超时时间', trigger: 'blur' }], - retryInterval: [{ required: true, message: '请输入重试间隔', trigger: 'blur' }] -} +const formRules = computed(() => { + const rules: Record = { + slaveId: [{ required: true, message: '请输入从站地址', trigger: 'blur' }] + } + if (isMaster.value) { + rules.ip = [{ required: true, message: '请输入 IP 地址', trigger: 'blur' }] + rules.port = [{ required: true, message: '请输入端口', trigger: 'blur' }] + rules.timeout = [{ required: true, message: '请输入连接超时时间', trigger: 'blur' }] + rules.retryInterval = [{ required: true, message: '请输入重试间隔', trigger: 'blur' }] + } + if (isSlave.value) { + rules.mode = [{ required: true, message: '请选择工作模式', trigger: 'change' }] + rules.frameFormat = [{ required: true, message: '请选择帧格式', trigger: 'change' }] + } + return rules +}) const formRef = ref() // 表单 Ref /** 打开弹窗 */ @@ -124,7 +173,9 @@ const resetForm = () => { port: 502, slaveId: 1, timeout: 3000, - retryInterval: 1000, + retryInterval: 10000, + mode: ModbusModeEnum.POLLING, + frameFormat: ModbusFrameFormatEnum.MODBUS_TCP, status: CommonStatusEnum.ENABLE } formRef.value?.resetFields() diff --git a/src/views/iot/device/device/detail/index.vue b/src/views/iot/device/device/detail/index.vue index 417dd615..b53ae8cf 100644 --- a/src/views/iot/device/device/detail/index.vue +++ b/src/views/iot/device/device/detail/index.vue @@ -45,7 +45,11 @@ import { useTagsViewStore } from '@/store/modules/tagsView' import { DeviceApi, DeviceVO } from '@/api/iot/device/device' -import { DeviceTypeEnum, ProductApi, ProductVO } from '@/api/iot/product/product' +import { DeviceTypeEnum, ProductApi, ProductVO, ProtocolTypeEnum } from '@/api/iot/product/product' import { ThingModelApi, ThingModelData } from '@/api/iot/thingmodel' import DeviceDetailsHeader from './DeviceDetailsHeader.vue' import DeviceDetailsInfo from './DeviceDetailsInfo.vue' diff --git a/src/views/iot/device/device/index.vue b/src/views/iot/device/device/index.vue index 1406b21b..77824179 100644 --- a/src/views/iot/device/device/index.vue +++ b/src/views/iot/device/device/index.vue @@ -173,7 +173,7 @@
-
{{ item.deviceName }}
+
{{ item.deviceName }}
{ return ModbusByteOrder32Options } if (rawDataType === 'DOUBLE') { - // 64位暂时复用32位字节序 + // 64 位暂时复用 32 位字节序 return ModbusByteOrder32Options } return ModbusByteOrder16Options