Modbus poll通信實現

本文測試主機爲 arm-linux,可以使用 libmodbus 靜態庫實現modbus通信,爲追求可移植性,本文主要使用 freemodbus 來實現。
1、下載
移植到arm的需下載源碼進行交叉編譯 http://libmodbus.org/releases/libmodbus-3.1.4.tar.gz
2、解壓安裝

tar -xzvf libmodbus-3.1.4.tar.gz
cd libmodbus-3.1.4
# 新建安裝文件夾
mkdir -p install
chmod 777 install
./configure --prefix=$(pwd)/install --host=arm-linux --enable-static ac_cv_func_malloc_0_nonnull=yes CC=arm-fsl-linux-gnueabi-gcc
make
make install

3、編譯完成
編譯完成將獲得如下文件
在這裏插入圖片描述
4、測試
我的工程總體結構如下所示

在這裏插入圖片描述
在 mys_src 裏面添加 modbus 主機測試程序 modbus_test.c

makefile編寫如下所示:

#編譯配置,使能爲1
CONFIG_MODBUS_BUILD = 1

#當前路徑
CUR_DIR := $(shell pwd)

#libmodbus目錄
LIBMODBUS_DIR := $(CUR_DIR)/../libmodbus

# 頭文件路徑
INCLUDE :=
INCLUDE += -I$(CUR_DIR)/../include/
ifeq ($(CONFIG_MODBUS_BUILD), 1)
INCLUDE += -I$(LIBMODBUS_DIR)/include/modbus/
endif

#C編譯器的選項
CFLAGS :=
CFLAGS += -g -Wall
CFLAGS += -std=gnu99
CFLAGS += $(INCLUDE)


#庫文件參數
LDFLAGS :=
#libmodbus共享庫鏈接
#LDFLAGS += -L$(LIBMODBUS_DIR)/lib
#libmodbus靜態庫鏈接
ifeq ($(CONFIG_MODBUS_BUILD), 1)
LDFLAGS += $(LIBMODBUS_DIR)/lib/libmodbus.a
endif


SRCS += modbus_test.c
OBJS += modbus_test.o
BINS += modbus_test


all:$(OBJS) $(BINS) 

$(OBJS):%.o:%.c
    $(CC) -c $(CFLAGS) $^ -o $(OBJ_DIR)/$@

$(BINS):$(OBJS)
    $(CC) -o $(BIN_DIR)/$@ $(OBJ_DIR)/$^ $(LDFLAGS)

modbus_test.c

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

#define MODBUS_DEV_NAME    "/dev/ttymxc3"    ///< 串口設備

int main(void)
{
    modbus_t *ctx =NULL;

    // 以串口的方式創建libmobus實例,並設置參數
    ctx = modbus_new_rtu(MODBUS_DEV_NAME, 115200, 'N', 8, 1);
    if (ctx == NULL)                //使用UART4,對應的設備描述符爲ttymxc3
    {
        fprintf(stderr, "Unable to allocate libmodbus contex\n");
        return -1;
    }
    // 使用RS485時需考慮設置串口模式、RTS引腳等
//    modbus_rtu_set_serial_mode(MODBUS_RTU_RS485);    //設置串口模式

    modbus_set_debug(ctx, 1);      //設置1可看到調試信息
    modbus_set_slave(ctx, 1);      //設置slave ID

    if (modbus_connect(ctx) == -1) //等待連接設備
    {
        fprintf(stderr, "Connection failed:%s\n", modbus_strerror(errno));
        return -1;
    }

    int i,rc;
    uint16_t tab_reg[64] = {0}; //定義存放數據的數組
    while (1)
    {
        printf("\n----------------\n");
        //讀取保持寄存器的值,可讀取多個連續輸入保持寄存器
        rc = modbus_read_registers(ctx, 0, 10, tab_reg);
        if (rc == -1)
        {
            fprintf(stderr,"%s\n", modbus_strerror(errno));
            return -1;
        }
        for (i=0; i<10; i++)
        {
            printf("reg[%d] = %d(0x%x)\n", i, tab_reg[i], tab_reg[i]);
        }

        usleep(5000000);
    }
    modbus_close(ctx);  //關閉modbus連接
    modbus_free(ctx);   //釋放modbus資源,使用完libmodbus需要釋放掉

    return 0;
}

5、測試
modbus從機模擬

Modbus slave測試工具可以用來做modbus從機設備,從而實現arm控制板通過串口與PC端模擬的modbus從機進行通信測試。
Modbus slave下載地址:https://www.modbustools.com/download/ModbusSlaveSetup64Bit.exe
在這裏插入圖片描述
然後設置 setup->slave definition 從機ID、設置爲保存寄存器,10條

在這裏插入圖片描述
同時我們也給寄存器設置一些值
在這裏插入圖片描述
開發板運行測試程序後,成功讀取modbus從機寄存器值
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章