C++开发Modbus通讯接口

C++开发Modbus通讯接口
对PLC上存储的数据进行读取,并转存到数据库

该回答引用ChatGPT-3.5,仅为您提供参考,不保证完全正确
要在C++中开发一个Modbus通信接口,用于读取PLC上存储的数据并将其存储到数据库,您可以按照以下步骤进行操作:

  1. 安装必要的库:
    首先,您需要安装用于Modbus通信和数据库连接的必要库。对于Modbus通信,您可以考虑使用libmodbus库,对于数据库连接,您可以使用适合您数据库类型的C++库,例如libmysqlclient(MySQL)或libpq(PostgreSQL)。

  2. 创建Modbus通信功能:
    使用libmodbus库创建C++函数,用于建立与PLC的Modbus通信连接并读取数据。以下是一个简单的示例:

    #include <modbus/modbus.h>
    
    int main() {
        modbus_t *ctx;
        ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);
        modbus_connect(ctx);
        
        // 读取PLC数据的代码
        
        modbus_close(ctx);
        modbus_free(ctx);
        return 0;
    }
    

    您需要根据PLC的配置和通信参数来设置上述代码。

  3. 读取PLC数据:
    使用Modbus通信功能从PLC读取所需的数据。您需要知道PLC上的寄存器地址和通信协议的详细信息,以便正确读取数据。通常,您可以使用modbus_read_registers或类似的函数来读取数据。

  4. 创建数据库连接:
    使用适当的C++库创建与数据库的连接。以下是一个使用libmysqlclient库的示例:

    #include <mysql/mysql.h>
    
    int main() {
        MYSQL *conn;
        conn = mysql_init(NULL);
        mysql_real_connect(conn, "localhost", "user", "password", "database", 0, NULL, 0);
        
        // 插入数据到数据库的代码
        
        mysql_close(conn);
        return 0;
    }
    

    请根据您的数据库类型和连接参数来设置上述代码。

  5. 将数据存储到数据库:
    使用数据库连接,将从PLC读取的数据存储到数据库表中。您可以使用SQL查询来执行插入操作,并将数据保存到适当的表中。

  6. 错误处理和异常处理:
    在整个过程中,确保实现适当的错误处理和异常处理机制,以处理可能出现的问题,如通信故障或数据库连接问题。

  7. 调试和测试:
    编写测试用例,确保Modbus通信和数据库存储功能都按预期工作。确保能够稳定地读取数据并将其存储到数据库中。

  8. 部署和监控:
    一旦所有功能都正常工作,您可以将应用程序部署到目标环境中,并设置监控机制以确保它一直正常运行。

请注意,以上示例代码是非常简化的示例,实际开发中可能需要更多的代码和配置。此外,根据您的PLC型号和数据库类型,代码可能会有所不同。建议查看相关库的文档以获取更多详细信息,并根据实际需求进行定制开发。


该回答引用NewBing,仅为您提供参考,不保证完全正确
根据我的搜索结果,您可以参考以下的步骤和资源:

  • 首先,您需要安装一个支持Modbus协议的库,例如libmodbus¹,它可以运行在Linux、MacOs X、FreeBSD、QNX和Win等平台上。如果您使用的是树莓派的Pi OS,您可以通过以下命令安装libmodbus³:
sudo apt update
sudo apt install libmodbus-dev
  • 其次,您需要创建一个Modbus对象,并建立TCP连接。您可以使用libmodbus提供的函数,例如modbus_new_tcp、modbus_set_slave、modbus_connect等,来设置IP地址、端口号、从站号等参数。您还可以设置响应延迟时间,以避免超时错误。以下是一个简单的示例代码²:
//创建Modbus对象
modbus_t *modbus;
//建立TCP连接
modbus = modbus_new_tcp(ip地址,端口号);
//设置从站号
int ret = modbus_set_slave(modbus,从站号);//错误返回-1,正确返回0;
//进行连接
ret = modbus_connect(modbus);//错误返回-1,正确返回0;
//设置响应延迟时间,第三个参数是最迟的时间,1000为1ms不是1s;
ret = modbus_response_timeout(modbus,0,900000);
  • 然后,您需要使用libmodbus提供的函数,例如modbus_read_registers、modbus_write_registers等,来读取或写入PLC上的寄存器数据。您需要指定起始地址、数据个数和存储容器等参数。以下是一个简单的示例代码²:
//读取数据
ret = modbus_read_registers(modbus,起始地址,数据个数,存储容器);//读取的数据存储在容器中,错误返回-1
//写入数据
ret = modbus_write_registers(modbus,起始地址,数据个数,存储容器);//将容器的数据依次写入寄存器
  • 最后,您需要使用C++中的数据库操作函数,例如mysql_query、mysql_real_query等,来对数据库进行增删改查等操作。您需要指定数据库的连接信息、SQL语句和结果集等参数。以下是一个简单的示例代码⁴:
//创建数据库连接对象
MYSQL *conn;
//初始化数据库连接对象
conn = mysql_init(NULL);
//连接数据库
conn = mysql_real_connect(conn,主机名,用户名,密码,数据库名,端口号,NULL,0);
//执行SQL语句
int ret = mysql_query(conn,SQL语句);//错误返回非0值,正确返回0
//获取结果集
MYSQL_RES *res = mysql_store_result(conn);
//遍历结果集
MYSQL_ROW row;
while ((row = mysql_fetch_row(res)) != NULL) {
    //处理每一行的数据
}
//释放结果集
mysql_free_result(res);
//关闭数据库连接
mysql_close(conn);

源: 与必应的对话, 2023/9/8
(1) 【持续更新】近期C++开发Modbus通讯接口小结 - CSDN博客. https://blog.csdn.net/qq_39407925/article/details/121348697.
(2) Modbus——基于libmodbus开发 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/365903204.
(3) C++客户端Modbus通信(TCP主站) - CSDN博客. https://blog.csdn.net/qq_45220555/article/details/110404825.


该回答引用文心一言,仅为您提供参考,不保证完全正确
要在C++中开发Modbus通信接口,可以使用现有的Modbus库,例如libmodbus或Modbus4J等。这些库提供了与Modbus设备通信的功能,并且可以在C++项目中使用。


以下是一些基本步骤,可用于读取PLC上存储的数据,并将其转存到数据库中:

  1. 连接到PLC:使用Modbus库建立与PLC的连接。需要指定PLC的IP地址和端口号。
  2. 读取数据:使用Modbus库读取PLC上存储的数据。这通常涉及使用Modbus功能码(例如03或04)来读取保持寄存器或输入寄存器的值。
  3. 处理数据:对从PLC读取的数据进行必要的处理。这可能包括将数据存储到变量中,进行数据转换或解析等。
  4. 连接到数据库:使用C++中的数据库连接库(例如MySQL Connector/C++)建立与数据库的连接。需要指定数据库的主机名、用户名、密码和数据库名称等。
  5. 插入数据:使用数据库连接库将数据插入到数据库中。这可能涉及创建SQL语句并使用数据库连接库执行该语句。
  6. 关闭连接:在完成与PLC和数据库的通信后,关闭连接以释放资源。

需要注意的是,以上步骤仅提供了基本的指南,具体的实现取决于使用的Modbus库和数据库连接库。此外,还需要了解Modbus协议和数据库的相关知识,以便正确实现与PLC和数据库的通信。


该回答引用讯飞星火,仅为您提供参考,不保证完全正确
在C++中开发Modbus通讯接口,可以使用第三方库来实现。一个常用的库是libmodbus。下面是一个简单的示例代码,演示如何使用libmodbus库进行Modbus通信并读取PLC上的数据,并将其转存到数据库中。


首先,你需要安装libmodbus和适合你使用的数据库的相应库。这里以MySQL为例,你可以使用MySQL Connector/C++库。

#include <iostream>
#include <modbus/modbus.h>
#include <mysql_driver.h>
#include <mysql_connection.h>

using namespace std;
using namespace sql;

int main() {
    // 初始化Modbus连接
    modbus_t *ctx = modbus_new_tcp("127.0.0.1", 502);
    if (ctx == nullptr) {
        cout << "无法创建Modbus连接" << endl;
        return -1;
    }

    // 连接到PLC
    if (modbus_connect(ctx) == -1) {
        cout << "无法连接到PLC" << endl;
        modbus_free(ctx);
        return -1;
    }

    // 读取PLC数据
    uint16_t data[10];
    int numRead = modbus_read_registers(ctx, 0, 10, data);
    if (numRead == -1) {
        cout << "无法读取PLC数据" << endl;
        modbus_close(ctx);
        modbus_free(ctx);
        return -1;
    }

    // 连接到MySQL数据库
    sql::mysql::MySQL_Driver *driver;
    sql::Connection *con;
    driver = sql::mysql::get_mysql_driver_instance();
    con = driver->connect("tcp://127.0.0.1:3306", "username", "password");

    // 创建数据库表(如果不存在)
    string createTableQuery = "CREATE TABLE IF NOT EXISTS plcData (id INT AUTO_INCREMENT PRIMARY KEY, value FLOAT)";
    con->execute(createTableQuery);

    // 插入数据到数据库
    for (int i = 0; i < numRead; i++) {
        string insertQuery = "INSERT INTO plcData (value) VALUES (" + to_string(data[i]) + ")";
        con->execute(insertQuery);
    }

    // 关闭数据库连接
    delete con;

    // 释放Modbus连接
    modbus_close(ctx);
    modbus_free(ctx);

    return 0;
}

请注意,上述代码中的IP地址、端口号、用户名和密码需要根据你的实际情况进行修改。此外,还需要根据你所使用的PLC和数据库类型进行相应的配置和调整。

引用 皆我百晓生 小程序回复内容作答:
要开发一个Modbus通讯接口,你可以按照以下步骤进行:

  1. 引入Modbus库:C++有很多可用的Modbus库,你可以选择一个适合你的项目的库。一些常用的Modbus库包括libmodbus、cppModbus和modbus-tk。

  2. 建立Modbus连接:使用库提供的函数来建立到PLC的Modbus连接。这通常需要指定PLC的IP地址、端口号和通信协议。

  3. 读取PLC数据:使用Modbus协议的读功能码(Function Code),通过Modbus连接从PLC读取数据。你需要指定要读取的寄存器地址和数量。

  4. 处理读取的数据:根据PLC上存储的数据类型,将读取的原始数据转换为适当的格式。例如,如果PLC上存储的数据是32位整数,则需要将读取的16位数据转换为整数。

  5. 连接到MySQL数据库:使用C++的MySQL连接库,建立与MySQL数据库的连接。你需要提供数据库的地址、用户名和密码。

  6. 创建数据库表:如果你的数据库中没有适当的表来存储Modbus数据,你可以使用SQL语句创建一个新的表。

  7. 将数据保存到MySQL数据库:使用SQL INSERT语句,将从PLC读取的数据插入到数据库表中。你需要指定要插入的数据列和对应值。

  8. 关闭Modbus连接和数据库连接:完成读取和保存数据后,你应该显式地关闭Modbus连接和数据库连接。

这只是一个基本的开发流程,实际开发中可能还需要处理一些错误和异常情况,以及进行适当的数据处理和转换。但是,这个流程可以帮助你开始开发Modbus通讯接口。

找个现成的程序参考下吧。
https://download.csdn.net/download/ksthen/74380409

可以看一下这个,解决问题的话,记得采纳哦

#include <iostream>  
#include <modbus.h>  
#include <mysql.h>  
  
int main() {  
    modbus_t *ctx;  
    uint16_t tab_reg[32];  
    int rc;  
    MYSQL *conn;  
    MYSQL_RES *res;  
    MYSQL_ROW row;  
  
    // 连接到PLC  
    ctx = modbus_new_tcp("192.168.0.1", 502);  
    if (ctx == NULL) {  
        std::cerr << "Unable to create the libmodbus context" << std::endl;  
        return -1;  
    }  
    modbus_set_slave(ctx, 1);  
    if (modbus_connect(ctx) == -1) {  
        std::cerr << "Connection failed: " << modbus_strerror(errno) << std::endl;  
        modbus_free(ctx);  
        return -1;  
    }  
  
    // 读取PLC数据  
    rc = modbus_read_registers(ctx, 0, 10, tab_reg);  
    if (rc == -1) {  
        std::cerr << "Read failed: " << modbus_strerror(errno) << std::endl;  
    } else {  
        std::cout << "Read registers: ";  
        for (int i = 0; i < 10; i++) {  
            std::cout << tab_reg[i] << " ";  
        }  
        std::cout << std::endl;  
    }  
  
    // 连接到数据库  
    conn = mysql_init(NULL);  
    if (conn == NULL) {  
        std::cerr << "mysql_init() failed" << std::endl;  
        modbus_close(ctx);  
        modbus_free(ctx);  
        return -1;  
    }  
    if (mysql_real_connect(conn, "localhost", "user", "password", "database", 0, NULL, 0) == NULL) {  
        std::cerr << "mysql_real_connect() failed" << std::endl;  
        mysql_close(conn);  
        modbus_close(ctx);  
        modbus_free(ctx);  
        return -1;  
    }  
  
    // 将数据插入数据库  
    std::string query = "INSERT INTO table_name (column1, column2, column3) VALUES (";  
    for (int i = 0; i < 10; i++) {  
        query += std::to_string(tab_reg[i]);  
        if (i < 9) {  
            query += ", ";  
        }  
    }  
    query += ")";  
    if (mysql_query(conn, query.c_str())) {  
        std::cerr << "Insert failed: " << mysql_error(conn) << std::endl;  
    } else {  
        std::cout << "Data inserted successfully" << std::endl;  
    }  
  
    // 关闭连接和清理资源  
    mysql_close(conn);  
    modbus_close(ctx);  
    modbus_free(ctx);  
    return 0;  
}

结合GPT给出回答如下请题主参考
C++开发Modbus通讯接口可以采用现有的开源库或自己编写Modbus通讯协议。对于数据读取,可以使用Modbus协议的读取命令(如读取保持寄存器、输入寄存器等),根据PLC中存储的地址和数据类型进行数据读取。得到数据后,可以使用数据库客户端库将数据存储到数据库中,常见的客户端库有MySQL、SQL Server等。为了提高数据传输的稳定性和安全性,可以在通讯接口中加入数据校验和加密等措施。同时,需要考虑到通讯时序、错误处理和异常处理等情况,以确保通讯的可靠性和安全性。



#include <iostream>  
#include <modbus.h>  
#include <mysql.h>  
int main() {  
    modbus_t *ctx;  
    uint16_t tab_reg[32];  
    int rc;  
    MYSQL *conn;  
    MYSQL_RES *res;  
    MYSQL_ROW row;  
    // 连接到PLC  
    ctx = modbus_new_tcp("192.168.0.1", 502);  
    if (ctx == NULL) {  
        std::cerr << "Unable to create the libmodbus context" << std::endl;  
        return -1;  
    }  
    modbus_set_slave(ctx, 1);  
    if (modbus_connect(ctx) == -1) {  
        std::cerr << "Connection failed: " << modbus_strerror(errno) << std::endl;  
        modbus_free(ctx);  
        return -1;  
    }  
    // 读取PLC数据  
    rc = modbus_read_registers(ctx, 0, 10, tab_reg);  
    if (rc == -1) {  
        std::cerr << "Read failed: " << modbus_strerror(errno) << std::endl;  
    } else {  
        std::cout << "Read registers: ";  
        for (int i = 0; i < 10; i++) {  
            std::cout << tab_reg[i] << " ";  
        }  
        std::cout << std::endl;  
    }  
    // 连接到数据库  
    conn = mysql_init(NULL);  
    if (conn == NULL) {  
        std::cerr << "mysql_init() failed" << std::endl;  
        modbus_close(ctx);  
        modbus_free(ctx);  
        return -1;  
    }  
    if (mysql_real_connect(conn, "localhost", "user", "password", "database", 0, NULL, 0) == NULL) {  
        std::cerr << "mysql_real_connect() failed" << std::endl;  
        mysql_close(conn);  
        modbus_close(ctx);  
        modbus_free(ctx);  
        return -1;  
    }  
    // 将数据插入数据库  
    std::string query = "INSERT INTO table_name (column1, column2, column3) VALUES (";  
    for (int i = 0; i < 10; i++) {  
        query += std::to_string(tab_reg[i]);  
        if (i < 9) {  
            query += ", ";  
        }  
    }  
    query += ")";  
    if (mysql_query(conn, query.c_str())) {  
        std::cerr << "Insert failed: " << mysql_error(conn) << std::endl;  
    } else {  
        std::cout << "Data inserted successfully" << std::endl;  
    }  
    // 关闭连接和清理资源  
    mysql_close(conn);  
    modbus_close(ctx);  
    modbus_free(ctx);  
    return 0;  
}

libmodbus,例程多的是


#include <modbus.h>

int main() {
    modbus_t *ctx;
    ctx = modbus_new_rtu("/dev/ttyS0", 9600, 'N', 8, 1);
    modbus_connect(ctx);
    uint16_t data[2];

    if (modbus_read_registers(ctx, 0, 2, data) == 2) {
        // 读取数据成功,将数据插入到数据库
        // 数据库连接和插入代码
    } else {
        // 读取数据失败
    }

    modbus_close(ctx);
    modbus_free(ctx);
    return 0;
}

要实现C++开发Modbus通讯接口,读取PLC上存储的数据,并将其转存到数据库中,您可以按照以下步骤进行操作:

  1. 确定PLC的通讯协议和通讯参数,例如波特率、数据位、校验位等。
  2. 使用C++编写Modbus通讯接口程序,实现与PLC的通讯。可以使用现有的Modbus库,如libmodbus、Modbus TCP等,也可以自行编写Modbus协议栈。
  3. 在程序中实现读取PLC数据的功能。具体实现方式取决于PLC的型号和通讯协议,一般需要通过Modbus协议中的读指令(如03H或04H)读取PLC中的数据。
  4. 将读取的数据存储到数据库中。可以使用C++中的数据库连接库(如MySQL Connector/C++、SOCI等)连接数据库,并使用SQL语句将数据写入数据库中。

以下是一个简单的示例代码,用于读取PLC中存储的数据并将其转存到MySQL数据库中:

#include <iostream>
#include <mysql_driver.h>
#include <mysql_connection.h>
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include "libmodbus/modbus.h"

using namespace std;

int main() {
    // Modbus通讯参数
    modbus_t *ctx;
    uint16_t tab_reg[32];
    int rc;
    ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);
    modbus_set_slave(ctx, 1);
    modbus_set_debug(ctx, TRUE);
    rc = modbus_read_registers(ctx, 0, 10, tab_reg);
    if (rc != 5) {
        cout << "Failed to read PLC data" << endl;
        return -1;
    }
    modbus_free(ctx);

    // 连接MySQL数据库
    sql::mysql::MySQL_Driver *driver;
    sql::Connection *con;
    sql::Statement *stmt;
    sql::ResultSet *res;
    driver = sql::mysql::get_mysql_driver_instance();
    con = driver->connect("tcp://127.0.0.1:3306", "username", "password");
    stmt = con->createStatement();
    res = stmt->executeQuery("SELECT * FROM mytable");

    // 将读取的数据写入数据库
    for (int i = 0; i < 10; i++) {
        stmt->execute("INSERT INTO mytable (reg" + to_string(i) + ") VALUES (" + to_string(tab_reg[i]) + ")");
    }
    res->close();
    stmt->close();
    con->close();
    return 0;
}

请注意,上述示例代码仅供参考,具体实现需要根据实际情况进行调整。

【以下回答由 GPT 生成】

在C++开发Modbus通讯接口时,可能会遇到以下几个具体的问题:

  1. 通信协议的选择:在开发Modbus通讯接口时,需要选择适合的通信协议,主要有Modbus RTU(串口通信)和Modbus TCP(以太网通信)两种。选择合适的通信协议取决于设备的具体硬件接口和通信方式。

  2. Modbus通信协议的解析:Modbus协议是一种二进制协议,需要对接收到的数据进行解析。可以通过编写解析函数来正确地解析Modbus数据包,并提取出所需的数据。

  3. 通信接口的选择和配置:在C++开发Modbus通讯接口时,需要选择合适的串口或以太网接口,并进行相应的配置。对于串口通信,可以使用Windows API或Linux下的串口通信库;对于以太网通信,可以使用socket库进行网络通信。

  4. 数据转存到数据库:如果要将PLC上的数据存储到数据库中,可以选择使用MySQL数据库。在C++中可以使用MySQL的官方C API(mysql.h)来进行数据库操作,或者使用第三方开源库,如MySQL Connector/C++。

以下是一个简单的示例代码,用于从PLC读取数据并存储到MySQL数据库中:

#include <mysql.h>

// Modbus通讯相关的代码...

// MySQL数据库相关配置
const char* host = "localhost";
const char* user = "root";
const char* password = "123456";
const char* database = "modbus_data";

int main() {
    // Modbus通讯代码...

    // 连接MySQL数据库
    MYSQL* conn = mysql_init(NULL);
    if (!mysql_real_connect(conn, host, user, password, database, 0, NULL, 0)) {
        fprintf(stderr, "Failed to connect to database: Error: %s\n", mysql_error(conn));
        return 1;
    }

    // 读取PLC数据并存储到数据库
    // 假设读取到的数据存储在变量data中
    // 假设数据存储在名为"modbus_data"的表中,表结构为id(INT, PRIMARY KEY, AI), value(INT)
    char query[100];
    sprintf(query, "INSERT INTO modbus_data (value) VALUES (%d)", data);
    if (mysql_query(conn, query)) {
        fprintf(stderr, "Failed to insert data into database: Error: %s\n", mysql_error(conn));
        return 1;
    }

    // 断开与MySQL数据库的连接
    mysql_close(conn);

    return 0;
}

请注意,上述代码仅为示例,实际开发中需要根据具体情况进行修改和完善。同时,还需要注意数据库安全性和代码健壮性的考虑。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

参考gpt4:
结合自己分析给你如下建议:
选择一个适合您的平台和需求的Modbus库。有许多开源的Modbus库,如libmodbus1、modbus-tk2、modbuspp3等。您可以根据库的文档和示例来安装和使用它们。
建立与Modbus设备的连接。您需要知道设备的IP地址、端口号、从站号、波特率、数据位、停止位和奇偶校验等参数。您可以使用库提供的函数来创建一个Modbus对象,并设置相应的参数。例如,使用libmodbus,您可以这样写:

//创建Modbus对象
modbus_t *modbus;
//建立TCP连接
modbus = modbus_new_tcp (ip地址,端口号);
//设置从站号
int ret = modbus_set_slave (modbus,从站号);//错误返回-1,正确返回0//进行连接
ret = modbus_connect (modbus);//错误返回-1,正确返回0//设置响应超时,第三个参数是最迟的时间,10001ms不是1s;
ret = modbus_set_response_timeout (modbus,0,900000);

读取或写入Modbus设备的数据。您需要知道设备的寄存器类型(线圈、离散输入、输入寄存器或保持寄存器)、起始地址和数据个数。您可以使用库提供的函数来读取或写入数据,并将数据存储在一个数组或容器中。例如,使用libmodbus1,您可以这样写:
//读取输入寄存器
ret = modbus_read_input_registers (modbus,起始地址,数据个数,存储的容器);//读取的数据存储在容器中,错误返回-1
//写入保持寄存器
ret = modbus_write_registers (modbus,起始地址,数据个数,存储的容器);//将容器的数据依次写入寄存器,错误返回-1

关闭与Modbus设备的连接。当您完成通讯后,您需要释放Modbus对象,并关闭连接。例如,使用libmodbus1,您可以这样写:
//关闭连接
modbus_close (modbus);
//释放对象
modbus_free (modbus);

C++与PLC通过Modbus TCP协议进行PLC内部寄存器的值的读取/写入总结
可以参考下


【持续更新】近期C++开发Modbus通讯接口小结_c++ modbus_小白的求生之路111的博客-CSDN博客 项目需求:对PLC上存储的数据进行读取,并转存到数据库语言:C++、DDL所需知识点:Socket通信、Modbus帧结构、C++中数据库的操作、多线程、Linux项目进度与困难(不会做就是困难!!管它简不简单!)1、Socket通信。由于之前一直采用串口通信,并未了解过其他通信机制,所以&*%¥%!@#(啥也不会)。打开网页、视频各种学习,发现是自己掌握的TCP通信机制,但自己只是理论掌握,不具备代码实现的能力,在CSDN、GitHub寻找各种资源后,终于写出了自己的S_c++ modbus https://blog.csdn.net/qq_39407925/article/details/121348697