modbus TCP 操作寄存器,控制气密性测试仪

#include "modbus.h"
#include <iostream>
#pragma comment ( lib,"modbus.lib" )

using namespace std;
int main()
{
    modbus_t* ctx;
    const char* ipAddress = "192.168.1.2"; // Modbus TCP 从机的 IP 地址
    const int port = 8000; // Modbus TCP 端口号
    const int slaveId = 1; // 从机 ID

    int rc;

    //创建Modbus TCP上下文
    ctx = modbus_new_tcp(ipAddress, port);
    if (ctx == nullptr) {
        std::cerr << "Failed to create Modbus context" << std::endl;
        system("pause");
        return -1;
    }

    //连接到Modbus从设备
    if (modbus_connect(ctx) == -1) {
        std::cerr << "Modbus connection failed: " << modbus_strerror(errno) << std::endl;
        modbus_free(ctx);
        system("pause");
        return -1;
    }
    else
        std::cout << "连接到Modbus从设备 成功" << std::endl;


    //写入Modbus寄存器
     int registerAddress = 90;  // 寄存器地址
     int numRegisters = 10;     // 寄存器数量
    uint16_t writeValue_register[10];
    uint16_t readValue_register[10];

    modbus_set_slave(ctx, slaveId);
    for (int i = 0; i < numRegisters; i++) {
        writeValue_register[i] = i + 1; // 填充要写入的寄存器值
    }
    for (int i = 0; i < numRegisters; i++) {
        
        cout <<"writeValue : " << i << writeValue_register[i] << endl;// show 来看一下 
         
    }

    for (int i = 0; i < numRegisters; i++) {
        modbus_set_slave(ctx, slaveId);
        rc = modbus_write_register(ctx, registerAddress, uint16_t(writeValue_register[i]));
        registerAddress++;
        if (rc == -1) {
            cerr << "Failed to write to register: "<< i<<" "<< modbus_strerror(errno) << endl;
            system("pause");
            //return -1;
        }
    }
    //读取Modbus寄存器
    registerAddress = 90;
    modbus_set_slave(ctx, slaveId);
    rc = modbus_read_registers(ctx, registerAddress, numRegisters, readValue_register);
    if (rc == -1) {
        std::cerr << "Failed  to read Modbus registers: " << modbus_strerror(errno) << std::endl;
        system("pause");
        return -1;
    }  
    else {
        //打印读取到的寄存器值
         for (int i = 0; i < 10; i++)
         {
             //此代k码段从从设备的首个寄存器开始读取10个寄存器,并将结果打印到屏幕上。
             cout << "Register " << i << ": " << readValue_register[i] << endl;
         }
    }

    modbus_close(ctx);
    modbus_free(ctx);
    system("pause");
    return 0;
}

posted @   江南王小帅  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示