libmodbus之rtu方式通讯

1. 打开

char chDevCom[10] = “COM1”;  // 串口号

int nBaudRate = 9600;  // 波特率

char chParity = 'O'; // 校验码

int nDataBits = 8;  // 数据位

int nStopBits = 1;  // 停止位

modbus_t * pCtx = modbus_new_rtu(devCom, nBaudRate, chParity, nDataBits, nStopBits); // 新建连接对象

int nSlaveId = 1;

modbus_set_slave(pCtx , nSlaveId);  // 设置从机号

int nRet = modbus_connect(pCtx ); // 连接

2.读取寄存器内容

/**********************************************/
// 功能: 读取寄存器内容
// 返回值: 读取到的字符个数
// 参数: destCh, destSh 读取到的结果
//          addr 读取的寄存器地址
//          funcCode 功能码
//          size 读取的寄存器个数
/*********************************************/
int Read(unsigned char* destCh, unsigned short* destSh, int addr, int funcCode,int size)
{
    int nRet = -1;
    switch(funcCode)
    {
    case 0x01:
        // 0x01:读取线圈状态取得一组逻辑线圈的当前状态(ON/OFF)? 
        // Reads the boolean status of bits and sets the array elements in the destination to TRUE or FALSE (single bits).
        nRet = modbus_read_bits(m_ctx, addr, size, destCh);
        break;
    case 0x02:
        // 0x02:读取输入状态 取得一组开关输入的当前状态(ON/OFF)  
        nRet = modbus_read_input_bits(m_ctx, addr,  size, destCh);
        break;
    case 0x03:
        // 0x03:读取保持寄存器 在一个或多个保持寄存器中取得当前的二进制值
        nRet = modbus_read_registers(m_ctx, addr, size, destSh);
        break;
    case 0x04:
        // 0x04:读取输入寄存器 在一个或多个输入寄存器中取得当前的二进制值
        nRet = modbus_read_input_registers(m_ctx, addr,  size, destSh);
        break;
    } 
    return nRet;
}

3.保存到寄存器

/**********************************************/
// 功能: 写寄存器内容
// 返回值: 保存到的字符个数
// 参数: destCh, destSh,value 保存的结果
//          addr 保存的寄存器地址
//          funcCode 功能码
//          size 保存的寄存器个数
/*********************************************/
int Write(unsigned char* destCh, unsigned short* destSh, int value,int addr,int funcCode,int size)
{
    int nRet = -1;
    switch(funcCode)
    {
    case 5:
        //0x05:强置单线圈 强置一个逻辑线圈的通断状态
        nRet = modbus_write_bit(m_ctx, addr, value);
        break;
    case 6:
        //0x06:预置单寄存器 把具体二进值装入一个保持寄存器
        nRet = modbus_write_register(m_ctx, addr, value);
        break;
    case 15:
        // 0x0F:强置多线圈 强置一串连续逻辑线圈的通断
        // Write the bits of the array in the remote device
        nRet = modbus_write_bits(m_ctx, addr, size, destCh);
        break;
    case 16:
        // 0x10:控询(只用于484) 可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送
        // Write the values from the array to the registers of the remote device 
        nRet = modbus_write_registers(m_ctx, addr,  size, destSh);
        break;
    } 
    return nRet;
}

4.释放资源

    modbus_close(pCtx );
    modbus_free(pCtx );

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值