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 @ 2024-06-17 16:11  江南王小帅  阅读(12)  评论(0编辑  收藏  举报