在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

邊緣網(wǎng)關教程-Modbus協(xié)議轉(zhuǎn)MQTT協(xié)議

IOTRouter ? 來源:IOTRouter ? 作者:IOTRouter ? 2024-07-03 10:37 ? 次閱讀

需求概述

主要實現(xiàn)一個流程:

1.采集Modbus電表數(shù)據(jù)上傳到MQTT指定topic

2.如果傳感器未響應需要發(fā)送報警信息到指定topic

3.MQTT連接成功時發(fā)送注冊信息

4.周期推送心跳到指定topic

5.云端下發(fā)控制EG8200繼電器并回復

對接資料

1.南向接口 RS485對接協(xié)議(標準modbus)

點位 字段 寄存器地址 解析方式
A相電壓 voltageA 40001~40002 float32 ABCD
B相電壓 voltageB 40003~40004 float32 ABCD
C相電壓 voltageC 40005~40006 float32 ABCD
A相電壓 currentA 40007~40008 float32 ABCD
B相電壓 currentB 40009~40010 float32 ABCD
C相電壓 currentC 40011~40012 float32 ABCD

2.北向接口協(xié)議說明:

MQTT連接信息
Broker 139.129.229.113
Clientid TestClient
Username 82000000305E144F
Password EG12345678
Topic報文格式
功能 Topic 數(shù)據(jù)流向 報文示例
信息注冊 data/sg/${sn}/info 網(wǎng)關->平臺 {
"sn":"82000000305E144F",
"time":"2023-01-01 12:00:00"
}
數(shù)據(jù)上報 data/sg/${sn}/report 網(wǎng)關->平臺 {
"sn":"82000000305E144F",
"data":{
"voltageA":0,
"voltageB":0,
"voltageC":0,
"currentA":0,
"currentB":0,
"currentC":0
},
time:"2023-01-01 12:00:00"
}
心跳 data/sg/${sn}/heart 網(wǎng)關->平臺 {
"sn":"82000000305E144F",
"data":{},
"message":"heart",
"time":"2023-01-01 12:00:00"
}
報警 data/sg/${sn}/warn 網(wǎng)關->平臺 {
"sn":"82000000305E144F",
"data":{},
"message":"offline",
"time":"2023-01-01 12:00:00"
}
平臺控制 /data/sg/${sn}/request 平臺->網(wǎng)關 {
"event_id":"HsUCigC4Jk",
"data": {
"parameter": "DO1",
"value": 0
}
}
控制回復 data/sg/${sn}/response 網(wǎng)關->平臺 {
"event_id":"HsUCigC4Jk",
"message":"OK",
"data":{},
"time":"2023-01-01 12:00:00"
}

需求分析

注冊與連接工作

a.建立MQTT連接,發(fā)布到注冊主題(MQTT發(fā)布節(jié)點)注:MQTT訂閱發(fā)布節(jié)點連接信息共享,其他MQTT無需在配置連接參數(shù),選擇第一次配置的連接參數(shù)即可

b.監(jiān)聽MQTT連接狀態(tài)(狀態(tài)變化節(jié)點)

c.封裝注冊信息(函數(shù)節(jié)點)

數(shù)據(jù)上報

a.modbus讀取電表數(shù)據(jù)(modbus讀節(jié)點)

b.判斷傳感器是否有回復并封裝上報報文(函數(shù)節(jié)點)

c.配置對應的發(fā)布主題(MQTT發(fā)布節(jié)點)

心跳推送

a.注入節(jié)點周期觸發(fā)(注入節(jié)點)

b.封裝心跳報文(函數(shù)節(jié)點)

c.MQTT發(fā)布數(shù)據(jù)(MQTT發(fā)布節(jié)點)

下發(fā)控制

a.MQTT訂閱云端下發(fā)主題(MQTT訂閱節(jié)點)

b.解析云端數(shù)據(jù),并控制對應DO(函數(shù)節(jié)點)

c.響應MQTT控制情況(函數(shù)節(jié)點)

d.上報響應報文(MQTT發(fā)布)

實現(xiàn)流程框架

wKgZomaEt1uAGN4qAABu4JP5xmw397.png

需求實現(xiàn)

1.監(jiān)聽MQTT狀態(tài)并發(fā)布注冊信息

a.從節(jié)點庫拖出一個MQTT發(fā)布節(jié)點,函數(shù)節(jié)點,調(diào)試節(jié)點,狀態(tài)監(jiān)測節(jié)點和條件判斷節(jié)點,MQTT發(fā)布用于消息發(fā)布,函數(shù)節(jié)點用于注冊信息封裝,狀態(tài)檢測節(jié)點用于檢測MQTT的連接狀態(tài),調(diào)試節(jié)點用于打印發(fā)布的報文

wKgZomaEt2uAWCAWAAF4ebgsg2A254.png

b.從上可以看見日志打印了注冊報文,以及MQTTx端以及接收到了注冊信息

wKgaomaEt32AM3yLAAGesr-MT8g037.png

c.注冊流程使用的代碼塊:

const fmt = dateFormat("YYYY-mm-dd HH:MM:SS", new Date())

let obj = {
    "sn": "82000000305E144F",
    "time": fmt
}

function dateFormat(fmt, timestamp) {
    let ret;
    const opt = {
        "Y+": timestamp.getFullYear().toString(), // 年
        "m+": (timestamp.getMonth() + 1).toString(),  // 月
        "d+": timestamp.getDate().toString(), // 日
        "H+": timestamp.getHours().toString(), // 時
        "M+": timestamp.getMinutes().toString(), // 分
        "S+": timestamp.getSeconds().toString() // 秒
        // 有其他格式化字符需求可以繼續(xù)添加,必須轉(zhuǎn)化成字符串
    };
    for (let k in opt) {
        ret = new RegExp("(" + k + ")").exec(fmt);
        if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
        };
    };
    return fmt;
}

msg.payload = JSON.stringify(obj)
return msg

2.數(shù)據(jù)上報

a.從節(jié)點庫拖出一個注入節(jié)點,函數(shù)節(jié)點和一個MQTT發(fā)布節(jié)點,注入節(jié)點用于周期觸發(fā),函數(shù)節(jié)點用于封裝心跳報文,MQTT發(fā)布節(jié)點用于心跳發(fā)布

wKgaomaEt5yAGYc1AAHXgK03t6I764.png

b.從上面可以看到日志窗口打印了數(shù)據(jù)報文,MQTTx也接收到了上報數(shù)據(jù)

wKgZomaEt6qAblqPAAHzi27BQzo469.png

c.數(shù)據(jù)上報流程使用的代碼塊:

function dateFormat(fmt, timestamp) {
    let ret;
    const opt = {
        "Y+": timestamp.getFullYear().toString(), // 年
        "m+": (timestamp.getMonth() + 1).toString(),  // 月
        "d+": timestamp.getDate().toString(), // 日
        "H+": timestamp.getHours().toString(), // 時
        "M+": timestamp.getMinutes().toString(), // 分
        "S+": timestamp.getSeconds().toString() // 秒
        // 有其他格式化字符需求可以繼續(xù)添加,必須轉(zhuǎn)化成字符串
    };
    for (let k in opt) {
        ret = new RegExp("(" + k + ")").exec(fmt);
        if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
        };
    };
    return fmt;
}

var flag = msg.status
var data = msg.payload
var payload
const fmt = dateFormat("YYYY-mm-dd HH:MM:SS", new Date())

if (flag == "TIMEOUT") {
    payload = {
        "sn": "82000000305E144F",
        "data": {},
        "message": "offline",
        "time": fmt
    }
    msg.payload = JSON.stringify(payload)
    return [msg, null]
}
else if (flag == "OK") {
    payload = {
        sn: "02C00081275A574E",
        data,
        time: fmt
    }
    msg.payload = JSON.stringify(payload)
    return [null, msg]
}

3.心跳推送

a.從節(jié)點庫拿出一個注入節(jié)點,函數(shù)節(jié)點,MQTT發(fā)布節(jié)點。注入節(jié)點用于周期發(fā)發(fā)送心跳,函數(shù)節(jié)點用于封裝心跳報文,MQTT發(fā)布節(jié)點用于發(fā)布到MQTT

wKgZomaEt7-AWVocAAJlZz-ZS_Y845.png

b.從上面可以看到日志窗口打印了心跳報文,MQTTx也接收到了心跳報

wKgaomaEt8eAQMTlAAHOWaHue9g429.png

心跳上報流程使用的代碼塊:

const fmt = dateFormat("YYYY-mm-dd HH:MM:SS", new Date())

function dateFormat(fmt, timestamp) {
  let ret;
  const opt = {
    "Y+": timestamp.getFullYear().toString(), // 年
    "m+": (timestamp.getMonth() + 1).toString(),  // 月
    "d+": timestamp.getDate().toString(), // 日
    "H+": timestamp.getHours().toString(), // 時
    "M+": timestamp.getMinutes().toString(), // 分
    "S+": timestamp.getSeconds().toString() // 秒
    // 有其他格式化字符需求可以繼續(xù)添加,必須轉(zhuǎn)化成字符串
  };
  for (let k in opt) {
    ret = new RegExp("(" + k + ")").exec(fmt);
    if (ret) {
      fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
    };
  };
  return fmt;
}

let obj = {
  "sn": "82000000305E144F",
  "data": {},
  "message": "heart",
  "time": fmt
}
msg.payload = JSON.stringify(obj)
return msg;

4.下發(fā)控制及響應

a.從節(jié)點庫拿出一個MQTT訂閱節(jié)點,MQTT發(fā)布節(jié)點,函數(shù)節(jié)點和DO節(jié)點,MQTT訂閱節(jié)點和MQTT發(fā)布節(jié)點用于接收云端發(fā)來的數(shù)據(jù)和控制響應,函數(shù)節(jié)點用于解析下發(fā)的報文和控制的響應報文封裝

wKgaomaEt9aAYWXtAAJQ_PKGmCk107.png

b.從上面可以看到日志窗口打印了報文,MQTTx也接收到了控制響應

wKgZomaEt-aANZv_AAGjccNC5Zk976.png

c.控制流程使用的代碼塊


//云端下發(fā)解析
//############################
if (msg.payload.length < 10) { return }

if (typeof (msg.payload) == "object") {
    var obj = msg.payload
    //信息獲取
    let event_id = obj.event_id;
    global.set("event_id", event_id)
    let parameter = obj.data.parameter
    let value = obj.data.value
    let arr = []
    switch (parameter) {
        case "DO1":
            arr = value
            break
        case "DO2":
            arr = value
            break
    }

    msg.payload = arr


    return msg;
}
//############################

//反饋響應封裝
//############################
let event_id = global.get("event_id")
const fmt = dateFormat("YYYY-mm-dd HH:MM:SS", new Date())
function dateFormat(fmt, timestamp) {
    let ret;
    const opt = {
        "Y+": timestamp.getFullYear().toString(), // 年
        "m+": (timestamp.getMonth() + 1).toString(),  // 月
        "d+": timestamp.getDate().toString(), // 日
        "H+": timestamp.getHours().toString(), // 時
        "M+": timestamp.getMinutes().toString(), // 分
        "S+": timestamp.getSeconds().toString() // 秒
        // 有其他格式化字符需求可以繼續(xù)添加,必須轉(zhuǎn)化成字符串
    };
    for (let k in opt) {
        ret = new RegExp("(" + k + ")").exec(fmt);
        if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
        };
    };
    return fmt;
}

let obj = {
    "event_id": event_id,
    "message": "OK",
    "data": {},
    "time": fmt

}

msg.payload = JSON.stringify(obj);
return msg;
//############################

通過以上步驟,你可以在邊緣網(wǎng)關上成功實現(xiàn) Modbus 協(xié)議到 MQTT 協(xié)議的轉(zhuǎn)換。這種集成方式不僅簡化了工業(yè)設備與物聯(lián)網(wǎng)平臺的通信,還增強了數(shù)據(jù)的實時性和可靠性。希望本文能為你提供有用的指導,助你更好地利用 Modbus 和 MQTT 技術

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • MODBUS
    +關注

    關注

    28

    文章

    1940

    瀏覽量

    78571
  • 網(wǎng)關
    +關注

    關注

    9

    文章

    5010

    瀏覽量

    52217
  • MQTT
    +關注

    關注

    5

    文章

    661

    瀏覽量

    23328
收藏 人收藏

    評論

    相關推薦

    Modbus協(xié)議轉(zhuǎn)Profinet協(xié)議網(wǎng)關與氣體監(jiān)測系統(tǒng)配置案例

    Modbus協(xié)議和Profinet協(xié)議作為工業(yè)領域常見的兩種通訊協(xié)議,各自具有一定的特點和應用范圍。Modbus轉(zhuǎn)Profinet
    的頭像 發(fā)表于 06-13 17:50 ?1635次閱讀
    <b class='flag-5'>Modbus協(xié)議</b><b class='flag-5'>轉(zhuǎn)</b>Profinet<b class='flag-5'>協(xié)議</b><b class='flag-5'>網(wǎng)關</b>與氣體監(jiān)測系統(tǒng)配置案例

    Modbus協(xié)議轉(zhuǎn)Profibus協(xié)議網(wǎng)關接溫控表與PLC通訊

    Modbus協(xié)議轉(zhuǎn)Profibus協(xié)議網(wǎng)關(XD-MDPB100)則是實現(xiàn)這一通訊的重要工具。Modbus
    的頭像 發(fā)表于 06-21 11:31 ?2226次閱讀
    <b class='flag-5'>Modbus協(xié)議</b><b class='flag-5'>轉(zhuǎn)</b>Profibus<b class='flag-5'>協(xié)議</b><b class='flag-5'>網(wǎng)關</b>接溫控表與PLC通訊

    巴圖自動化Profinet協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關模塊連接智能儀表與PLC通訊

    巴圖自動化Profinet協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關模塊(BT-MDPN10)的主要功能是實現(xiàn)Modbus協(xié)議和Profinet
    的頭像 發(fā)表于 07-04 11:35 ?2920次閱讀
    巴圖自動化Profinet<b class='flag-5'>協(xié)議</b><b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>Modbus協(xié)議</b><b class='flag-5'>網(wǎng)關</b>模塊連接智能儀表與PLC通訊

    Modbus轉(zhuǎn)profient網(wǎng)關連接Smart PLC實現(xiàn)Profinet轉(zhuǎn)modbus協(xié)議轉(zhuǎn)換

    Modbus轉(zhuǎn)profinet網(wǎng)關連接西門子/DCS及機器人Profinet轉(zhuǎn)modbus協(xié)議轉(zhuǎn)換,不需要PLC或者Profinet主站編程
    發(fā)表于 03-22 19:13

    西門子S7協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關

    西門子S7協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關
    發(fā)表于 11-13 15:03 ?1949次閱讀

    歐姆龍CP1L-EL轉(zhuǎn)Modbus協(xié)議歐姆龍PLC轉(zhuǎn)Modbus協(xié)議

    歐姆龍PLC轉(zhuǎn)Modbus協(xié)議 歐姆龍CP1L-EL轉(zhuǎn)Modbus協(xié)議
    的頭像 發(fā)表于 11-06 15:55 ?3561次閱讀
    歐姆龍CP1L-EL<b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>Modbus協(xié)議</b>歐姆龍PLC<b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>Modbus協(xié)議</b>

    4G無線Modbus轉(zhuǎn)MQTT協(xié)議網(wǎng)關BL100產(chǎn)品簡介

    4G無線Modbus轉(zhuǎn)MQTT協(xié)議網(wǎng)關
    發(fā)表于 08-19 15:22 ?22次下載

    Modbus協(xié)議網(wǎng)關是什么?Modbus協(xié)議網(wǎng)關的功能

    數(shù)據(jù)的互聯(lián)互通。Modbus協(xié)議作為一種廣泛應用于工業(yè)控制領域的通信協(xié)議,主要用于在主設備(如PLC、SCADA系統(tǒng))與從設備(如傳感器、執(zhí)行器、智能儀表等)之間交換數(shù)據(jù)。 Modbus協(xié)議網(wǎng)
    的頭像 發(fā)表于 04-11 15:51 ?988次閱讀

    Profibus協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關模塊在船舶中的應用

    本文主要介紹了Profibus協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關模塊(XD-MDPB100)在船舶中的應用。 Profibus轉(zhuǎn)
    的頭像 發(fā)表于 06-27 17:25 ?705次閱讀
    Profibus<b class='flag-5'>協(xié)議</b><b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>Modbus協(xié)議</b><b class='flag-5'>網(wǎng)關</b>模塊在船舶中的應用

    鋇錸協(xié)議網(wǎng)關輕松實現(xiàn)Modbus轉(zhuǎn)MQTT協(xié)議

    效的數(shù)據(jù)交換。本文從Modbus協(xié)議轉(zhuǎn)換為MQTT協(xié)議的必要性為出發(fā)點,分析鋇錸Modbus轉(zhuǎn)MQTT
    的頭像 發(fā)表于 07-23 15:51 ?539次閱讀
    鋇錸<b class='flag-5'>協(xié)議</b><b class='flag-5'>網(wǎng)關</b>輕松實現(xiàn)<b class='flag-5'>Modbus</b><b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>MQTT</b><b class='flag-5'>協(xié)議</b>

    基于MQTT協(xié)議云平臺的Modbus轉(zhuǎn)MQTT網(wǎng)關

    鋇錸Modbus轉(zhuǎn)MQTT網(wǎng)關BL100是一款高性能、高性價比的物聯(lián)網(wǎng)網(wǎng)關,它支持將Modbus協(xié)議
    的頭像 發(fā)表于 07-29 17:59 ?976次閱讀
    基于<b class='flag-5'>MQTT</b><b class='flag-5'>協(xié)議</b>云平臺的<b class='flag-5'>Modbus</b><b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>MQTT</b><b class='flag-5'>網(wǎng)關</b>

    鋇錸技術Modbus轉(zhuǎn)MQTT網(wǎng)關:橋接Modbus協(xié)議MQTT協(xié)議

    提供了一鍵對接亞馬遜云平臺的解決方案。 BL101網(wǎng)關是鋇錸技術研發(fā)的一款高性能工業(yè)物聯(lián)網(wǎng)設備,通過橋接Modbus協(xié)議MQTT通信協(xié)議,實現(xiàn)了工業(yè)設備與云端平臺之間的高效互聯(lián)。支持
    的頭像 發(fā)表于 07-30 16:28 ?580次閱讀
    鋇錸技術<b class='flag-5'>Modbus</b><b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>MQTT</b><b class='flag-5'>網(wǎng)關</b>:橋接<b class='flag-5'>Modbus協(xié)議</b>與<b class='flag-5'>MQTT</b><b class='flag-5'>協(xié)議</b>

    BACnet轉(zhuǎn)Modbus協(xié)議網(wǎng)關實現(xiàn)設備無縫對接GE Digital iFIX

    與整合,實現(xiàn)協(xié)議間的無縫轉(zhuǎn)換,鋇錸技術隆重推出BACnet轉(zhuǎn)Modbus協(xié)議網(wǎng)關BL120BN,為用戶提供了一個既高效又可靠的解決方案。 一、BACnet
    的頭像 發(fā)表于 08-06 17:32 ?566次閱讀
    BACnet<b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>Modbus協(xié)議</b><b class='flag-5'>網(wǎng)關</b>實現(xiàn)設備無縫對接GE Digital iFIX

    Modbus、樓宇自控、電力協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關BL120ML支持一鍵對接LabVIEW

    Modbus樓宇自控電力協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關BL120ML在LabVIEW中的實際應用中,我們首先需要理解LabVIEW和
    的頭像 發(fā)表于 08-10 10:40 ?607次閱讀
    <b class='flag-5'>Modbus</b>、樓宇自控、電力<b class='flag-5'>協(xié)議</b><b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>Modbus協(xié)議</b><b class='flag-5'>網(wǎng)關</b>BL120ML支持一鍵對接LabVIEW

    使用Modbus、樓宇自控、電力協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關實現(xiàn)生產(chǎn)設備的遠程監(jiān)控和管理

    Modbus協(xié)議、樓宇自控、電力協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關,將不同類型的生產(chǎn)設備數(shù)據(jù)集中傳輸?shù)奖O(jiān)控系統(tǒng),實現(xiàn)遠程監(jiān)控和管理。 我們先來看整
    的頭像 發(fā)表于 08-08 17:29 ?543次閱讀
    使用<b class='flag-5'>Modbus</b>、樓宇自控、電力<b class='flag-5'>協(xié)議</b><b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>Modbus協(xié)議</b><b class='flag-5'>網(wǎng)關</b>實現(xiàn)生產(chǎn)設備的遠程監(jiān)控和管理
    主站蜘蛛池模板: 日本不卡毛片一二三四 | 中韩日欧美电影免费看 | 99久久精品免费观看国产 | 欧美大香a蕉免费 | 三级免费黄录像 | 日本一区免费在线观看 | 免费在线观看视频网站 | 牛牛a级毛片在线播放 | 国内一级野外a一级毛片 | 国产精品久久久久久久久久影院 | 免费视频播放 | 久久精品国产亚洲综合色 | 在线天堂中文www官网 | 精品国产中文一级毛片在线看 | 黄色毛片儿 | 久青草视频免费视频播放线路1 | 欧美第四色| 天天插天天狠天天透 | 你懂的在线免费观看 | 国产综合在线播放 | 国产高清一级在线观看 | 日本精品一在线观看视频 | 天堂网www在线资源链接 | 伊人久久大香线蕉影院95 | 天天狠天天操 | 18女人毛片水真多免费 | 色婷婷在线视频观看 | 女生扒开尿口让男生舔 | 亚洲 欧美 精品专区 极品 | 亚洲精品综合网在线8050影院 | 日本黄色小视频网站 | 成人a毛片高清视频 | 一区二区在线免费视频 | 国产美女精品久久久久中文 | 国产va免费精品高清在线 | 99视频热 | 午夜免费啪在线观看视频网站 | 亚洲五月综合网色九月色 | 天天操天天操天天 | 国产一区二区三区不卡观 | 国产精品嫩草影院一二三区 |