diff --git a/public/images/DataCollect/IEC104.png b/public/images/DataCollect/IEC104.png
new file mode 100644
index 00000000..fd8b1454
Binary files /dev/null and b/public/images/DataCollect/IEC104.png differ
diff --git a/src/utils/consts.ts b/src/utils/consts.ts
index c87d2cae..ac738daf 100644
--- a/src/utils/consts.ts
+++ b/src/utils/consts.ts
@@ -58,4 +58,5 @@ export const protocolList = [
{ label: 'MODBUS_TCP', value: 'MODBUS_TCP', alias: 'Modbus/TCP' },
{ label: 'COLLECTOR_GATEWAY', value: 'COLLECTOR_GATEWAY', alias: 'GATEWAY' },
{ label: 'S7', value: 'snap7', alias: 'snap7' },
+ { label: 'IEC104', value: 'iec104', alias: 'IEC104' }
]
diff --git a/src/views/DataCollect/Channel/Save/index.vue b/src/views/DataCollect/Channel/Save/index.vue
index 42ee9a87..b9cfda66 100644
--- a/src/views/DataCollect/Channel/Save/index.vue
+++ b/src/views/DataCollect/Channel/Save/index.vue
@@ -249,6 +249,8 @@ const handleOk = async () => {
params.configuration={
connect : false
}
+ } else {
+ params.configuration = {}
}
params.circuitBreaker = {
@@ -316,7 +318,7 @@ const getProvidersList = async () => {
if (resp.status === 200) {
const arr = resp.result
.filter(
- (item: any) => ['GATEWAY', 'Modbus/TCP', 'opc-ua','snap7'].includes(item.name),
+ (item: any) => ['GATEWAY', 'Modbus/TCP', 'opc-ua','snap7', 'IEC104'].includes(item.name),
)
.map((it: any) => it.name);
const providers: any = protocolList.filter((item: any) =>
diff --git a/src/views/DataCollect/Channel/index.vue b/src/views/DataCollect/Channel/index.vue
index 0ec2378e..7229d70c 100644
--- a/src/views/DataCollect/Channel/index.vue
+++ b/src/views/DataCollect/Channel/index.vue
@@ -67,9 +67,9 @@
{{
- slotProps.provider
+ protocolList.find(item => item.value === slotProps.provider)?.label
}}
- {{ slotProps.provider }}
+ {{ protocolList.find(item => item.value === slotProps.provider)?.label }}
@@ -103,9 +103,11 @@
说明
-
- {{slotProps.description}}
-
+
+
+ {{slotProps.description}}
+
+
@@ -161,10 +163,12 @@ const opcImage = getImage('/DataCollect/device-opcua.png');
const modbusImage = getImage('/DataCollect/device-modbus.png');
const s7Image = getImage('/DataCollect/s7.png')
const gatewayImage = getImage('/DataCollect/gateway.png')
+const iecImage = getImage('/DataCollect/IEC104.png')
const ImageMap = new Map()
ImageMap.set('OPC_UA',opcImage)
ImageMap.set('MODBUS_TCP',modbusImage)
ImageMap.set('snap7',s7Image)
+ImageMap.set('iec104',iecImage)
ImageMap.set('COLLECTOR_GATEWAY',gatewayImage)
@@ -367,6 +371,9 @@ const handleSearch = (e: any) => {
text-overflow: ellipsis; //溢出用省略号显示
white-space: nowrap; //溢出不换行
}
+ .explain {
+ margin-top: 10px;
+ }
}
.details-text {
font-weight: 700;
diff --git a/src/views/DataCollect/Collector/Point/Save/SaveIEC104.vue b/src/views/DataCollect/Collector/Point/Save/SaveIEC104.vue
new file mode 100644
index 00000000..ea569dca
--- /dev/null
+++ b/src/views/DataCollect/Collector/Point/Save/SaveIEC104.vue
@@ -0,0 +1,263 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 点位死区点位死区范围内的异常数据将被过滤(请勿配置非数值类型)
+
+
+
+
+
+
+ 采集频率采集频率为0时不执行轮询任务
+
+
+
+
+
+ 只推送变化的数据
+
+
+
+
+
+
+
+ 取消
+
+ 确认
+
+
+
+
+
diff --git a/src/views/DataCollect/Collector/Point/Save/SaveS7.vue b/src/views/DataCollect/Collector/Point/Save/SaveS7.vue
index c64080f3..dcc7f498 100644
--- a/src/views/DataCollect/Collector/Point/Save/SaveS7.vue
+++ b/src/views/DataCollect/Collector/Point/Save/SaveS7.vue
@@ -97,20 +97,14 @@
采集频率采集频率为0时不执行轮询任务
-
-
- 3000ms
- 6000ms
- 9000ms
-
- {{
- ![3000, 6000, 9000].includes(form.configuration.interval)
- ? form.configuration.interval + 'ms'
- : '自定义'
- }}
-
-
-
+
@@ -121,17 +115,6 @@
-
-
-
-
-
-
-
-
取消
();
-const formRef2 = ref();
-const deviceType = ref(props.data.deviceType);
+const deviceType = ref(props. data.deviceType);
const dataTypesList = ref([]);
const daveAreaList = ref([]);
@@ -203,10 +185,6 @@ const form = ref({
// inheritBreaker: true,
// pointKey: randomString(9)
});
-const intervalRef = reactive({
- visible: false,
- interval: 3000,
-})
/**选择S7点位数据类型 */
@@ -259,19 +237,6 @@ const dataAreaFilterList = computed(() => {
return result;
});
-const handleInterval = async () => {
- const res = await formRef2.value?.validate()
- if (res) {
- form.value.configuration.interval = res.interval
- intervalRef.visible = false
- }
-};
-const handleCancelInterval = () => {
- intervalRef.visible = false
- intervalRef.interval = 3000
-}
-
-
const handleOk = async () => {
const res: any = await formRef.value?.validate();
diff --git a/src/views/DataCollect/Collector/Point/index.vue b/src/views/DataCollect/Collector/Point/index.vue
index 9a27e6ce..8963059e 100644
--- a/src/views/DataCollect/Collector/Point/index.vue
+++ b/src/views/DataCollect/Collector/Point/index.vue
@@ -20,7 +20,7 @@
+
@@ -352,6 +353,7 @@ import { map } from 'rxjs/operators';
import dayjs from 'dayjs';
import { responsiveArray } from 'ant-design-vue/lib/_util/responsiveObserve';
import SaveS7 from './Save/SaveS7.vue';
+import SaveIEC104 from './Save/SaveIEC104.vue';
import Import from './components/Import/index.vue'
const props = defineProps({
data: {
@@ -366,10 +368,12 @@ const opcImage = getImage('/DataCollect/device-opcua.png');
const modbusImage = getImage('/DataCollect/device-modbus.png');
const s7Image = getImage('/DataCollect/s7.png')
const gatewayImage = getImage('/DataCollect/gateway.png')
+const iecImage = getImage('/DataCollect/IEC104.png')
const ImageMap = new Map()
ImageMap.set('OPC_UA',opcImage)
ImageMap.set('MODBUS_TCP',modbusImage)
ImageMap.set('snap7',s7Image)
+ImageMap.set('iec104',iecImage)
ImageMap.set('COLLECTOR_GATEWAY',gatewayImage)
@@ -380,7 +384,8 @@ const visible = reactive({
batchUpdate: false,
scan: false,
saveS7:false,
- import:false
+ import:false,
+ saveIEC104: false
});
const current: any = ref({});
const accessModesOption = ref();
@@ -500,7 +505,13 @@ const handlAdd = () => {
provider: props.data?.provider,
deviceType:props.data?.configuration.type,
}
- }else{
+ }else if (props.data?.provider === 'iec104'){
+ visible.saveIEC104 = true;
+ current.value = {
+ collectorId: props.data?.id,
+ provider: props.data?.provider,
+ }
+ } else {
visible.saveModBus = true;
current.value = {
collectorId: props.data?.id,
@@ -514,7 +525,9 @@ const handlEdit = (data: any) => {
visible.saveOPCUA = true;
} else if(data?.provider === 'snap7'){
visible.saveS7 = true
- }else{
+ } else if(data?.provider === 'iec104') {
+ visible.saveIEC104 = true
+ } else {
visible.saveModBus = true;
}
current.value = cloneDeep({
diff --git a/src/views/DataCollect/Collector/Tree/Save/index.vue b/src/views/DataCollect/Collector/Tree/Save/index.vue
index 05822b99..36ee3e2c 100644
--- a/src/views/DataCollect/Collector/Tree/Save/index.vue
+++ b/src/views/DataCollect/Collector/Tree/Save/index.vue
@@ -67,6 +67,20 @@
串行
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/device/Product/Detail/MetadataMap/index.vue b/src/views/device/Product/Detail/MetadataMap/index.vue
index dc37b576..7044cf8e 100644
--- a/src/views/device/Product/Detail/MetadataMap/index.vue
+++ b/src/views/device/Product/Detail/MetadataMap/index.vue
@@ -113,10 +113,11 @@
功能说明
- 该功能用于将插件中的
+ 该功能用于将插件/协议包中的
物模型属性标识与
平台物模型属性标识进行映射,当两方属性标识不一致时,可在当前页面直接修改映射管理,系统将以映射后的物模型属性进行数据处理。
+ >进行映射,当两方属性标识不一致时,可在当前页面直接修改映射管理,系统将以
+ 映射后的物模型属性进行数据处理。
未完成映射的属性标识“目标属性”列数据为空,代表该属性值来源以在平台配置的来源为准。
diff --git a/src/views/device/Product/Detail/index.vue b/src/views/device/Product/Detail/index.vue
index bab355e9..e0049ca6 100644
--- a/src/views/device/Product/Detail/index.vue
+++ b/src/views/device/Product/Detail/index.vue
@@ -315,7 +315,9 @@ const getProtocol = async () => {
];
}
}
- if (productStore.current?.accessProvider === 'plugin_gateway') {
+ //当前设备接入选择的协议
+ const protocol = res.result?.transports.find(item => item.id === productStore.current.transportProtocol);
+ if(protocol?.features.find(item => item.id === 'diffMetadataSameProduct')){
list.value.push({ key: 'MetadataMap', tab: '物模型映射'})
}
}
diff --git a/src/views/rule-engine/Scene/Save/action/Notify/VariableDefinitions.vue b/src/views/rule-engine/Scene/Save/action/Notify/VariableDefinitions.vue
index 2bb5ea0d..66cd7a1a 100644
--- a/src/views/rule-engine/Scene/Save/action/Notify/VariableDefinitions.vue
+++ b/src/views/rule-engine/Scene/Save/action/Notify/VariableDefinitions.vue
@@ -10,7 +10,7 @@
:label="item?.name"
v-for="(item, index) in variableDefinitions"
:key="item.id"
- :required="getType(item) !== 'file' ? true : false"
+ :required="!['file', 'user', 'org', 'tag'].includes(getType(item)) ? true : false"
:rules="[
{
validator: (_rule, value) => checkValue(_rule, value, item),
@@ -62,6 +62,7 @@ import Tag from './variableItem/Tag.vue';
import InputFile from './variableItem/InputFile.vue';
import User from './variableItem/User.vue';
import { PropType } from 'vue';
+import { onlyMessage } from '@/utils/comm';
const props = defineProps({
variableDefinitions: {
@@ -209,6 +210,13 @@ const onChange = (val: any, type: any, index: number, options?: string) => {
const onSave = () =>
new Promise((resolve, reject) => {
+ const pass = props.variableDefinitions.filter(item => ['user', 'org', 'tag'].includes(getType(item))).some(item => {
+ return modelRef[item.id]
+ })
+ if(!pass) {
+ onlyMessage('收信人,收信人部门,收信人标签至少填写一个', 'warning')
+ return reject(false)
+ }
formRef.value?.validate().then((_data: any) => {
resolve(_data);
}).catch(() => {