libmodbus學(xué)習(xí)(二)之Modbus TCP

一宣蔚、以太網(wǎng)(modbus tcp/ip)

Modbus設(shè)備可分為主站(poll)和從站(slave)肚逸。主站只有一個,從站有多個聘萨,主站向各從站發(fā)送請求幀竹椒,從站給予響應(yīng)。在使用TCP通信時米辐,主站為client端胸完,主動建立連接;從站為server端翘贮,等待連接赊窥。

image.png

二、所需的libmobus API(server端)

  1. 使用modbus_new_tcp創(chuàng)建一個modbus的上下文狸页,ip地址為開發(fā)板自身的ip
modbus_t *ctx = modbus_new_tcp(const char *ip_address, int port); //開發(fā)板ip自行修改锨能,port常用502。
  1. 地址映射
    使用modbus_mapping_new_start_address初始化從站地址的映射肴捉,即線圈狀態(tài)腹侣、離散輸入、保持寄存器齿穗、輸入寄存器的首地址和個數(shù)的映射傲隶。該首地址供主站進(jìn)行尋址讀取數(shù)值或?qū)懭霐?shù)值。
modbus_mapping_t *mb_mapping = modbus_mapping_new_start_address(
    unsigned int start_bits, unsigned int nb_bits,
    unsigned int start_input_bits, unsigned int nb_input_bits,
    unsigned int start_registers, unsigned int nb_registers,
    unsigned int start_input_registers, unsigned int nb_input_registers);

完成mb_mapping的映射后需要綁定table的地址空間窃页,即給相應(yīng)指針開辟空間跺株。該空間為后續(xù)寫入和讀取數(shù)據(jù)使用。

    /* map 地址與存儲空間 */
    mb_mapping->tab_bits = UT_BITS_TAB;
    mb_mapping->tab_input_bits = UT_INPUT_BITS_TAB;
    mb_mapping->tab_registers = UT_REGISTERS_TAB;
    mb_mapping->tab_input_registers = UT_INPUT_REGISTERS_TAB;

3.監(jiān)聽連接
使用以上創(chuàng)建的modbus tcp server監(jiān)聽客戶的接入

int socket = modbus_tcp_listen(modbus_t *ctx, int nb_connection);
modbus_tcp_accept(modbus_t *ctx, int *s);

4.阻塞接收數(shù)據(jù)
接收主站的請求數(shù)據(jù)(原始數(shù)據(jù))并保存在req指定的空間中脖卖。

modbus_receive(modbus_t *ctx, uint8_t *req);

5.響應(yīng)接收
modbus_reply會自動解析modbus請求并做響應(yīng)

modbus_reply(modbus_t *ctx, const uint8_t *req,
                            int req_length, modbus_mapping_t *mb_mapping);

三乒省、從站(server)程序

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>

#include <modbus/modbus.h>

int main(void)
{
    int socket;
    modbus_t *ctx;
    modbus_mapping_t *mb_mapping;

    ctx = modbus_new_tcp("127.0.0.1", 1502); //開發(fā)板ip自行修改
    /* modbus_set_debug(ctx, TRUE); */

    mb_mapping = modbus_mapping_new_start_address(
        UT_BITS_ADDRESS, UT_BITS_NB,
        UT_INPUT_BITS_ADDRESS, UT_INPUT_BITS_NB,
        UT_REGISTERS_ADDRESS, UT_REGISTERS_NB_MAX,
        UT_INPUT_REGISTERS_ADDRESS, UT_INPUT_REGISTERS_NB);

    if (mb_mapping == NULL) {
        fprintf(stderr, "Failed to allocate the mapping: %s\n",
                modbus_strerror(errno));
        modbus_free(ctx);
        return -1;
    }

    socket = modbus_tcp_listen(ctx, 1);
    modbus_tcp_accept(ctx, &socket);

    for (;;) {
        uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
        int rc;

        rc = modbus_receive(ctx, query);
        if (rc != -1) {
            /* rc is the query size */
            modbus_reply(ctx, query, rc, mb_mapping);
            printf("In the loop \n");
        } else {
            /* Connection closed by the client or error */
            break;
        }
    }

    printf("Quit the loop: %s\n", modbus_strerror(errno));

    modbus_mapping_free(mb_mapping);
    modbus_close(ctx);
    modbus_free(ctx);

    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市畦木,隨后出現(xiàn)的幾起案子袖扛,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛆封,死亡現(xiàn)場離奇詭異唇礁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)惨篱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門盏筐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人砸讳,你說我怎么就攤上這事琢融。” “怎么了簿寂?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵漾抬,是天一觀的道長。 經(jīng)常有香客問我常遂,道長奋蔚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任烈钞,我火速辦了婚禮,結(jié)果婚禮上坤按,老公的妹妹穿的比我還像新娘毯欣。我一直安慰自己,他們只是感情好臭脓,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布酗钞。 她就那樣靜靜地躺著,像睡著了一般来累。 火紅的嫁衣襯著肌膚如雪砚作。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天嘹锁,我揣著相機(jī)與錄音葫录,去河邊找鬼。 笑死领猾,一個胖子當(dāng)著我的面吹牛米同,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摔竿,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼面粮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了继低?” 一聲冷哼從身側(cè)響起熬苍,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袁翁,沒想到半個月后柴底,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婿脸,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年似枕,在試婚紗的時候發(fā)現(xiàn)自己被綠了盖淡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡凿歼,死狀恐怖褪迟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情答憔,我是刑警寧澤味赃,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站虐拓,受9級特大地震影響心俗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蓉驹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一城榛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧态兴,春花似錦狠持、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绍撞,卻和暖如春正勒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背傻铣。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工章贞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人矾柜。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓阱驾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親怪蔑。 傳聞我的和親對象是個殘疾皇子里覆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359