MODBUS 透传

本文档介绍了如何在MODBUS透传设备上编写Master代码,该设备通过串口转485模块与485设备通信。主要内容包括参照MODBUS应用协议,实现串口读写的超时设置,并提供了相关代码资源链接。
摘要由CSDN通过智能技术生成

概述

编写一段在 MODBUS 透传设备上的 Master 代码。透传设备上是通过串口转485模块跟485设备通信。透传设备上主要是按照 MODBUS Master的角色,发起 Request 并等待485设备的Response。其实,就是简单的调用了串口写后,再调用串口读超时。

参考文档及代码

MODBUS Application Protocol 1 1 bhttps://modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdfAbout - Embedded Experts (embedded-experts.at)https://www.embedded-experts.at/en/freemodbus/about/luoyun1989/freemodbushttps://gitee.com/luoyun1989/freemodbus.gitluoyun1989/STM32_HAL_FREEMODBUS_RTUhttps://gitee.com/luoyun1989/STM32_HAL_FREEMODBUS_RTU.gitluoyun1989/FreeModbus_Slave-Master-RTT-STM32https://gitee.com/luoyun1989/FreeModbus_Slave-Master-RTT-STM32.gitluoyun1989/libmodbushttps://gitee.com/luoyun1989/libmodbus.git

代码编写

根据自己的串口驱动,实现write_ex, read_ex, read_ex中设置了500ms超时。(Master等待Slaver 回复的时间,通常设置为300~500ms,根据不同设备也可能是几秒)。

int32_t write_ex(uint8_t *buf, uint32_t buf_len) {

    uint32_t write_len = 0;

    int32_t retVal = rs232_write(s_pst232port, buf, buf_len, &write_len);

    return retVal;

}

int32_t read_ex(uint8_t *buf, uint32_t buf_len) {

    uint32_t read_len = 0;

    int32_t retVal = 0;

    if ((buf == NULL) || (buf_len < MAX_BUF_LEN)) {

        return -1;

    }

    retVal = rs232_read_timeout(s_pst232port, buf, buf_len, &read_len, 500);

    if (retVal == 0) {

        return read_len;

    }

    return -1;

}

#define MB_ADU_LEN                      256

#define MB_PDU_LEN                      (MB_ADU_LEN - 3)

#define MB_ADU_REQ_LEN_MIN              8

#define MB_ADU_RSP_LEN_MIN              5

#define MB_ADU_ADDR_INDEX               0

#define MB_ADU_FUNC_INDEX               (MB_ADU_ADDR_INDEX + 1)

#define MB_ADU_START_ADDR_INDEX         (MB_ADU_FUNC_INDEX + 1)

#define MB_ADU_QUANTITY_INDEX           (MB_ADU_START_ADDR_INDEX + 2)

#define MB_ADU_COUNT_INDEX              (MB_ADU_FUNC_INDEX + 1)

#define MB_ADU_INVALID_FUNC             0

#define MB_ADU_RSP_FUNC_EXCEPTION       0x80

#define MB_COILS_QUANTITY_MAX               2000  //0x7D0

#define MB_DISCRETE_INPUTS_QUANTITY_MAX     2000  //0x7D0

#define MB_INPUT_REGISTER_QUANTITY_MAX      125  //0x7D

#define MAX_DATA_LEN    48

typedef enum MB_function_code {   //常用的 Function Code,其它暂不实现

    MB_READ_COILS = 01,

    MB_READ_DISCRETE_INPUTS,

    MB_READ_HOLDING_REGISTERS,

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值