1. 程式人生 > 其它 >基於高速序列匯流排的分散式RS485串列埠通訊介面設計

基於高速序列匯流排的分散式RS485串列埠通訊介面設計

引言

  RS485串列埠通訊技術具有傳輸距離遠、成本低、抗干擾能力強等優點,在計算機通訊領域佔有一席之地。但是由於RS485匯流排缺少匯流排仲裁,多對多會導致多個裝置在總線上訊號衝撞,所以只能構成一對一或一對多的通訊網路,使其難以實現較為複雜的工業現場測控網路的構建[1]。控制器區域網網路(Controller Area Network, CAN)是應用最為廣泛的工業現場匯流排之一,具有匯流排仲裁、高可靠性和高效能等特點,在變電站、礦山煤場、汽車等領域有廣泛的應用[2-4]。但是CAN匯流排最高速率只有1Mbps,難以滿足高速資料採集、通訊的速率要求。高速序列匯流排(High-speed Serial Bus, HSB)利用低壓差分訊號(Low Voltage Deferential Signaling, LVDS )的高速特點(最高1.923Gbps)來改進CAN匯流排的效能,其中CAN作為控制匯流排,LVDS作為資料匯流排,從而實現多點互聯的大資料量高速通訊的應用需求,在變電站等領域有廣泛應用[5-6]

  變電站內一次裝置線上監測、火災消防、安全防衛、動環系統等為變電站監控提供輔助支撐的裝置,總稱為輔助裝置。輔助裝置通過RS485介面接入火災自動報警系統、溫溼度感測器、空調控制器等外部監測和控制裝置,實現對各種資料的採集接入和裝置的控制[7-8]。然而一般的處理器整合的串列埠資源有限,難以滿足使用需求。針對於此,本文實現了一種基於高速序列匯流排的分散式串列埠擴充套件方式,可以根據使用需求快速擴充套件串列埠資源。

1 系統概述

  基於靈活硬體資源配置和硬體平臺設計考慮,典型的變電站輔助裝置裝置硬體系統採用多板卡的分散式結構,由控制、數字量採集、模擬量採集和RS485通訊等板卡組成,每個板卡可以根據需要進行多個配置,裝置內部互聯匯流排採用HSB匯流排,硬體匯流排架構圖如圖1所示。控制板卡是輔助裝置的核心,通過HSB匯流排與其他板卡進行通訊,對採集的資料進行計算處理,其中的FPGA模組實現HSB匯流排和千兆乙太網匯流排控制,通過千兆乙太網匯流排與CPU模組互聯;CPU模組為ARM Cortex-A7系列處理器,處理器包含4個CPU核心,主頻1.2GHz,執行嵌入式Linux作業系統。RS485通訊板卡包含8個RS485介面,用於接入RS485介面裝置,其中的FPGA模組實現HSB匯流排控制和RS485匯流排控制功能。其他板卡與本文內容無關,限於篇幅不再贅述。

圖1 硬體匯流排架構圖

  RS485通訊板卡的FPGA接收RS485報文後,新增HSB報文頭後傳送到HSB匯流排,控制板卡的FPGA從HSB匯流排接收HSB報文後,通過千兆乙太網口上送CPU,由CPU進行HSB報文解包和計算處理,至此,完成一幀RS485報文的接收。

  控制板卡的CPU接收到RS485報文後,新增HSB報文頭後通過千兆乙太網口傳送給FPGA,FPGA的HSB匯流排控制模組將HSB報文傳送到HSB匯流排,RS485通訊板卡的FPGA從HSB匯流排接到HSB報文後,從HSB報文中解析出RS485報文,並根據HSB報文頭中的相關資訊將RS485報文傳送到指定的RS485介面,至此,完成一幀RS485報文的傳送。

2 通訊協議設計

  通訊雙方要進行正常通訊,就必須需要一個通訊協議。通訊協議是指雙方實體完成通訊或服務所必須遵循的規則和約定。基於通訊過程的複雜性和靈活性考慮,通常將通訊協議劃分為若干個層次,每個層次完成一部分功能,各個層次相互配合共同完成通訊功能。

  控制板卡與RS485通訊板卡間的通訊基於HSB匯流排,依照分層通訊體系結構,通訊協議從下往上依次劃分為資料鏈路層、HSB通訊協議層和串列埠通訊協議層,如圖2所示。

圖2 HSB通訊協議層次圖

  資料鏈路層的主要功能是幀編碼和誤差糾正控制。通過鏈路層協議來控制資料的傳輸,以保證被傳輸資料的正確性。使用千兆乙太網協議作為鏈路層協議,不僅可以利用Linux作業系統現有的千兆乙太網驅動和程式設計介面,減少開發工作量,而且可以利用Linux網路協議棧的NAPI收包、套接字快取等特性[9],提高通訊效能和穩定性。

  HSB通訊協議層的主要功能是實現控制板卡與RS485通訊板卡間的通訊,也是本文討論的重點。HSB通訊協議報文的各欄位定義如圖3所示。報文目標節點地址、報文源節點地址、報文優先順序、報文長度5個欄位用於HSB的CAN匯流排控制,其中,報文目標節點地址欄位表示通訊的接收方,報文源節點地址欄位表示通訊的傳送方,報文優先順序欄位用於CAN匯流排的傳送優先順序控制,報文長度欄位用於指定HSB協議資料段的長度。報文型別、串列埠埠、串列埠配置3個欄位用於HSB的RS485串列埠報文控制,其中,報文型別欄位用於區分發送報文和接收報文,串列埠埠欄位用於確定RS485通訊板卡上的串列埠地址,串列埠配置欄位用於確定串列埠的波特率和通訊協議配置,該通訊協議由1個起始位、5-9個數據位、1-2個停止位、1個奇偶校驗位組成。

圖3 HSB通訊協議報文格式圖

  串列埠通訊協議層的主要功能是實現各種應用功能。作為應用層協議,位於HSB報文的資料部分。常用的通訊協議包括ModBus、ProfiBus協議等。

3 通訊介面設計

  “一切皆是檔案”是 Unix/Linux 的基本哲學之一,Linux常用檔案介面包括開啟、關閉、讀、寫等。基於此設計思想,RS485串列埠通訊介面設計如下。COMOpen用於開啟和初始化RS485通訊板卡上的串列埠裝置,其中slotid引數用於指定RS485通訊板卡地址,devid引數用於指定串列埠埠地址,baud引數用於指定串列埠波特率,flags引數用於指定串列埠通訊協議配置,介面返回開啟的串列埠物件指標;COMClose用於關閉串列埠;COMWrite、COMRead分別用於串列埠報文傳送和接收,其中dev引數用於指定已開啟的串列埠物件,buf、len引數用於指定串列埠報文緩衝區的首地址和長度。

struct com_dev * COMOpen(uint32_t slotid, uint32_t devid,uint32_t baud, uint32_t flags);
int COMClose(struct com_dev *dev);
int COMWrite(struct com_dev *dev, uint8_t * buf, uint32_t len);
int COMRead(struct com_dev *dev, uint8_t * buf, uint32_t len);

3.1 串列埠開啟和初始化

  因為串列埠報文通過千兆乙太網匯流排進入控制板卡的CPU,所以CPU通過網路介面裝置與RS485通訊板卡進行通訊。首先通過socket介面實現網路介面裝置開啟和網路協議繫結,網路協議號由slotid和devid生成,通過網路協議號指定RS485通訊板卡的串列埠埠地址。接著設定報文接收超時時間,避免讀介面因為無報文而阻塞。然後建立並初始化串列埠裝置物件,串列埠裝置物件包含socket檔案描述符、RS485通訊板卡地址、串列埠地址和串列埠配置等資訊,作為其他介面的引數,提供相關通訊資訊。最後傳送一個空的串列埠報文,用於配置串列埠的波特率和通訊協議。串列埠的開啟和初始化偽碼程式如下。

struct com_dev * COMOpen(uint32_t slotid, uint32_t devid, uint32_t baud, uint32_t flags)
{
    // 根據RS485通訊板卡地址和串列埠地址獲取網路協議號
    proto = htons(COM_PROTO(slotid, devid));
    // 開啟千兆乙太網介面裝置,並繫結網路協議號
    fd = socket(PF_PACKET, SOCK_RAW, proto);
    sock_com.sll_family = PF_PACKET;
    sock_com.sll_protocol = proto;
    sock_com.sll_ifindex = if_nametoindex(COM_SOCK_DEV);
    bind(fd, (struct sockaddr *)&sock_com, sizeof(sock_com));
    // 設定串列埠報文接收超時時間
    setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
    // 建立和初始化串列埠裝置物件
    struct com_dev * dev;
    dev = malloc(sizeof(struct com_dev));
    dev->fd = fd;
    dev->slotid = slotid;
    dev->devid = devid;
    dev->config = com_config_parse(baud, flags);
    // 傳送一個空的串列埠報文,配置串列埠的波特率和通訊協議
    COMWrite(dev, NULL, 0);
    return dev;
}

3.2 串列埠報文傳送

  串列埠報文傳送介面的核心工作是為串列埠報文新增HSB報文首部後發出。首先對串列埠裝置物件、報文緩衝區的首地址和長度進行合法性檢查,然後通過串列埠報文長度加上HSB報文首部長度計算出HSB報文長度,以此申請一個HSB報文緩衝區並初始化此HSB報文的目標節點地址、報文長度、報文型別、串列埠配置、資料段等各個傳送相關欄位,最後通過網路通訊介面sendto發出HSB報文。串列埠報文傳送偽碼程式如下。

int COMWrite(struct com_dev *dev, uint8_t * buf, uint32_t len)
{
    // 對串列埠物件、報文緩衝區的首地址和長度進行合法性檢查
    if((dev == NULL) || (buf == NULL && (len != 0)) || (len > COM_SOCK_MTU - hsb_hdr_size))
        return -EINVAL;
    // 計算HSB報文長度,並申請HSB報文緩衝區空間
    pkt = malloc(len + hsb_hdr_size);
    // 複製串列埠報文至HSB報文的資料段
    memcpy((uint8_t *)pkt+hsb_hdr_size, buf, len);
    // 初始化HSB首部報文傳送相關欄位
    pkt->dst=htons(1<< (dev->slotid));
    pkt->dlc = htons(len + COM_TX_HSB_HDR_LEN);
    pkt->type = htons(COM_SEND_TYPE);
    pkt->port = htons(1 << dev->devid);
    pkt->config = htonl(dev->config);
    // 傳送HSB報文
    ret = sendto(dev->fd, pkt, len+hsb_hdr_size, 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
    // 釋放HSB報文緩衝區
    free(pkt);
    return ret;
}

3.3 串列埠報文接收

  串列埠報文接收介面與串列埠報文傳送介面的處理流程類似。首先對所有引數進行合法性檢查,然後計算出HSB報文長度並申請一個HSB報文緩衝區,接著使用網路通訊介面recvfrom接收到HSB報文,最後將接收到的HSB報文的資料段資料拷貝到串列埠報文接收介面的緩衝區。串列埠報文接收的程式偽碼如下。

int COMRead(struct com_dev *dev, uint8_t * buf, uint32_t len)
{
    // 對串列埠物件、報文緩衝區的首地址和長度進行合法性檢查
    if((dev == NULL) || (buf == NULL && (len != 0)) || (len > COM_SOCK_MTU - hsb_hdr_size))
        return -EINVAL;
    // 計算HSB報文長度,並申請HSB報文緩衝區空間
    pkt = malloc(len + hsb_hdr_size);
    // 接收HSB報文
    ret = recvfrom(dev->fd, pkt, len + hsb_hdr_size, 0, (struct sockaddr *)&device, &sll_len);
    // 將HSB報文資料段拷貝到串列埠報文緩衝區
    memcpy(buf,(uint8_t *)pkt+hsb_hdr_size, ret);
    // 釋放HSB報文緩衝區
    free(pkt);
    return ret;
}

3.4 串列埠關閉

  串列埠關閉介面的主要功能是釋放相關係統資源,如關閉socket介面、釋放串列埠裝置物件等等。串列埠關閉介面的程式偽碼如下。

int COMClose(struct com_dev *dev)
{
    // 釋放socke資源
    ret = close(dev->fd);
    // 釋放串列埠裝置物件資源
    free(dev);
    return ret;
}

4 工程應用

  本方案目前已應用到新一代的安防監控、消防資訊傳輸控制等多個變電站輔助裝置中。通過RS485通訊板卡的RS485介面,與安防監控、火災自動報警系統等終端的通訊功能工作正常,通過RS485介面接入的擴充套件鍵盤、探測器和輸出前端等裝置,能正確實現報警訊號、布撤防等資料互動。裝置現場執行情況良好,所有功能工作穩定,效能符合裝置技術指標要求。

5 結語

  本文實現了一種基於高速序列匯流排的分散式RS485串列埠通訊方案,支援裝置根據需要靈活配置RS485通訊板卡數量來擴充套件RS485串列埠資源。通過對通訊協議的分層設計,實現了分散式RS485串列埠的訪問控制和資料傳輸,並給出了詳細的通訊介面設計。本方案提高裝置的可擴充套件性,通訊協議易於升級與維護,對低速通訊匯流排的擴充套件具有一定參考價值。

(本文發表於《工業控制計算機》2021年第11期)

作者:wahaha02 出處:https://www.cnblogs.com/wahaha02 本文為博主原創文章,內容歡迎轉載或引用,但請註明出處。