"# \u5229\u7528 libmodbus \u5feb\u901f\u90e8\u7f72\u4e00\u4e2a Modbus TCP \u670d\u52a1\u5668\n\n> 2024-04-21 | 2024-04-21\n> https:\/\/www.modbus.cn\/en\/27716.html\n\n**Modbus\u7f16\u7a0b\u5f00\u53d1**\n\n---\n\n\u5728\u73b0\u4ee3\u5de5\u4e1a\u901a\u4fe1\u4e2d\uff0cModbus \u534f\u8bae\u56e0\u5176\u7b80\u6d01\u6027\u548c\u6613\u4e8e\u5b9e\u73b0\u800c\u88ab\u5e7f\u6cdb\u5e94\u7528\u3002\u672c\u6587\u5c06\u901a\u8fc7\u4e00\u4e2a\u5177\u4f53\u7684\u793a\u4f8b\uff0c\u8be6\u7ec6\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528 libmodbus \u5e93\u521b\u5efa\u4e00\u4e2a\u57fa\u4e8e TCP \u7684 Modbus \u670d\u52a1\u5668\u3002\u8fd9\u4e2a\u670d\u52a1\u5668\u80fd\u591f\u5904\u7406\u5ba2\u6237\u7aef\u7684 Modbus \u8bf7\u6c42\uff0c\u5e76\u5bf9\u8fd9\u4e9b\u8bf7\u6c42\u4f5c\u51fa\u54cd\u5e94\u3002\n\n\u5b8c\u6574\u4ee3\u7801\uff08\u4e2d\u6587\u6ce8\u91ca\uff09\uff1a\n\n```\n#include &lt;stdio.h>\n#ifndef _MSC_VER\n#include &lt;unistd.h>  \/\/ Unix\u6807\u51c6\u529f\u80fd\u5e93\n#endif\n#include &lt;errno.h>  \/\/ \u9519\u8bef\u53f7\u5b9a\u4e49\n#include &lt;stdlib.h>  \/\/ \u6807\u51c6\u5e93\u51fd\u6570\n\n#include &lt;modbus.h>  \/\/ \u5305\u542bmodbus\u5e93\n\nint main(void)\n{\n    int s = -1;  \/\/ \u7528\u4e8e\u4fdd\u5b58socket\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\n    modbus_t *ctx;  \/\/ \u5b9a\u4e49modbus\u7ed3\u6784\u4f53\u6307\u9488\n    modbus_mapping_t *mb_mapping;  \/\/ \u5b9a\u4e49modbus\u6620\u5c04\u7ed3\u6784\u4f53\u6307\u9488\n\n    \/\/ \u521b\u5efa\u4e00\u4e2aModbus TCP\u670d\u52a1\u5668\n    ctx = modbus_new_tcp(\"127.0.0.1\", 1502);\n    \/* modbus_set_debug(ctx, TRUE);  \/\/ \u5982\u679c\u9700\u8981\u8c03\u8bd5\u4fe1\u606f\uff0c\u53ef\u4ee5\u53d6\u6d88\u6ce8\u91ca\u8fd9\u884c *\/\n\n    \/\/ \u521b\u5efa\u4e00\u4e2a\u65b0\u7684Modbus\u6620\u5c04\u533a\u57df\uff0c\u5404\u533a\u5757\u5927\u5c0f\u5747\u4e3a500\n    mb_mapping = modbus_mapping_new(500, 500, 500, 500);\n    if (mb_mapping == NULL) {\n        fprintf(stderr, \"Failed to allocate the mapping: %s\\n\", modbus_strerror(errno));\n        modbus_free(ctx);  \/\/ \u91ca\u653emodbus\u4e0a\u4e0b\u6587\n        return -1;  \/\/ \u51fa\u9519\u9000\u51fa\n    }\n\n    \/\/ \u76d1\u542cTCP\u8fde\u63a5\uff0c\u53ea\u5141\u8bb8\u4e00\u4e2a\u5ba2\u6237\u7aef\u8fde\u63a5\n    s = modbus_tcp_listen(ctx, 1);\n    modbus_tcp_accept(ctx, &amp;s);  \/\/ \u63a5\u53d7\u5ba2\u6237\u7aef\u8fde\u63a5\n\n    \/\/ \u5faa\u73af\u7b49\u5f85\u5ba2\u6237\u7aef\u8bf7\u6c42\n    for (;;) {\n        uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];  \/\/ \u5b9a\u4e49\u8bf7\u6c42\u7f13\u51b2\u533a\n        int rc;\n\n        \/\/ \u63a5\u6536\u5ba2\u6237\u7aef\u8bf7\u6c42\n        rc = modbus_receive(ctx, query);\n        if (rc > 0) {\n            \/\/ \u5982\u679c\u63a5\u6536\u5230\u8bf7\u6c42\uff0c\u56de\u590d\u5ba2\u6237\u7aef\n            modbus_reply(ctx, query, rc, mb_mapping);\n        } else if (rc == -1) {\n            \/\/ \u5982\u679c\u8fde\u63a5\u88ab\u5ba2\u6237\u7aef\u5173\u95ed\u6216\u53d1\u751f\u9519\u8bef\uff0c\u9000\u51fa\u5faa\u73af\n            break;\n        }\n    }\n\n    \/\/ \u6253\u5370\u9000\u51fa\u539f\u56e0\n    printf(\"Quit the loop: %s\\n\", modbus_strerror(errno));\n\n    \/\/ \u5173\u95edsocket\u8fde\u63a5\n    if (s != -1) {\n        close(s);\n    }\n    \/\/ \u91ca\u653emodbus\u6620\u5c04\u533a\u57df\n    modbus_mapping_free(mb_mapping);\n    \/\/ \u5173\u95edmodbus\u8fde\u63a5\n    modbus_close(ctx);\n    \/\/ \u91ca\u653emodbus\u4e0a\u4e0b\u6587\n    modbus_free(ctx);\n\n    return 0;\n}\n\n```\n\n### 1. \u521d\u59cb\u5316 Modbus TCP \u670d\u52a1\u5668\n\n\u9996\u5148\uff0c\u6211\u4eec\u9700\u8981\u5f15\u5165 libmodbus \u5e93\uff0c\u5e76\u521d\u59cb\u5316\u4e00\u4e2a Modbus TCP \u670d\u52a1\u5668\u3002\u5728\u6211\u4eec\u7684\u793a\u4f8b\u4e2d\uff0c\u670d\u52a1\u5668\u5c06\u7ed1\u5b9a\u5230\u672c\u5730\u5730\u5740 `127.0.0.1` \u548c\u7aef\u53e3 `1502`\u3002\u901a\u8fc7\u8c03\u7528 `modbus_new_tcp` \u51fd\u6570\uff0c\u6211\u4eec\u521b\u5efa\u4e86\u4e00\u4e2a\u6307\u5411 `modbus_t` \u7ed3\u6784\u7684\u6307\u9488\uff0c\u8fd9\u4e2a\u7ed3\u6784\u4f53\u5c06\u4f5c\u4e3a\u540e\u7eed\u6240\u6709\u64cd\u4f5c\u7684\u4e0a\u4e0b\u6587\uff1a\n\n```\nctx = modbus_new_tcp(&quot;127.0.0.1&quot;, 1502);\n```\n\n### 2. \u6620\u5c04 Modbus \u6570\u636e\u6a21\u578b\n\n\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u9700\u8981\u5b9a\u4e49\u670d\u52a1\u5668\u5c06\u8981\u4f7f\u7528\u7684 Modbus \u6570\u636e\u6620\u5c04\u3002\u8fd9\u4e00\u6b65\u9aa4\u662f\u901a\u8fc7 `modbus_mapping_new` \u51fd\u6570\u5b8c\u6210\u7684\uff0c\u5b83\u4e3a\u4e0d\u540c\u7c7b\u578b\u7684 Modbus \u6570\u636e\uff08\u4f4d\u3001\u8f93\u5165\u4f4d\u3001\u4fdd\u6301\u5bc4\u5b58\u5668\u548c\u8f93\u5165\u5bc4\u5b58\u5668\uff09\u5206\u914d\u548c\u521d\u59cb\u5316\u5185\u5b58\uff1a\n\n```\nmb_mapping = modbus_mapping_new(500, 500, 500, 500);\nif (mb_mapping == NULL) {\n    fprintf(stderr, &quot;Failed to allocate the mapping: %s\\n&quot;, modbus_strerror(errno));\n    modbus_free(ctx);\n    return -1;\n}\n```\n\n### 3. \u76d1\u542c\u548c\u63a5\u53d7\u5ba2\u6237\u7aef\u8fde\u63a5\n\n\u4e00\u65e6\u6570\u636e\u6620\u5c04\u51c6\u5907\u597d\uff0c\u670d\u52a1\u5668\u5c31\u53ef\u4ee5\u5f00\u59cb\u76d1\u542c\u6765\u81ea\u5ba2\u6237\u7aef\u7684\u8fde\u63a5\u8bf7\u6c42\u3002\u4f7f\u7528 `modbus_tcp_listen` \u51fd\u6570\u5f00\u59cb\u76d1\u542c\uff0c\u7136\u540e\u4f7f\u7528 `modbus_tcp_accept` \u5904\u7406\u63a5\u5165\u7684\u5ba2\u6237\u7aef\u8fde\u63a5\uff1a\n\n```\ns = modbus_tcp_listen(ctx, 1);\nmodbus_tcp_accept(ctx, &amp;s);\n```\n\n### 4. \u63a5\u6536\u548c\u54cd\u5e94\u8bf7\u6c42\n\n\u670d\u52a1\u5668\u7684\u4e3b\u5faa\u73af\u5305\u62ec\u7b49\u5f85\u5ba2\u6237\u7aef\u8bf7\u6c42\u3001\u63a5\u6536\u8bf7\u6c42\u3001\u5904\u7406\u8bf7\u6c42\uff0c\u5e76\u53d1\u9001\u54cd\u5e94\u3002\u8fd9\u901a\u8fc7\u4e0d\u65ad\u8c03\u7528 `modbus_receive` \u51fd\u6570\u6765\u63a5\u6536\u8bf7\u6c42\uff0c\u5e76\u4f7f\u7528 `modbus_reply` \u51fd\u6570\u6765\u53d1\u9001\u54cd\u5e94\uff1a\n\n```\nfor (;;) {\n    rc = modbus_receive(ctx, query);\n    if (rc &gt; 0) {\n        modbus_reply(ctx, query, rc, mb_mapping);\n    } else if (rc == -1) {\n        break;\n    }\n}\n```\n\n### 5. \u6e05\u7406\u548c\u5173\u95ed\u8d44\u6e90\n\n\u4e00\u65e6\u670d\u52a1\u5668\u5b8c\u6210\u4efb\u52a1\uff08\u901a\u5e38\u662f\u7531\u4e8e\u9519\u8bef\u6216\u5ba2\u6237\u7aef\u5173\u95ed\u8fde\u63a5\uff09\uff0c\u5b83\u9700\u8981\u91ca\u653e\u6240\u6709\u5206\u914d\u7684\u8d44\u6e90\uff0c\u5e76\u4f18\u96c5\u5730\u5173\u95ed\u8fde\u63a5\uff1a\n\n```\nprintf(&quot;Quit the loop: %s\\n&quot;, modbus_strerror(errno));\nif (s != -1) {\n    close(s);\n}\nmodbus_mapping_free(mb_mapping);\nmodbus_close(ctx);\nmodbus_free(ctx);\n```\n\n\u901a\u8fc7\u4e0a\u8ff0\u6b65\u9aa4\uff0c\u6211\u4eec\u5c55\u793a\u4e86\u5982\u4f55\u4f7f\u7528 libmodbus \u521b\u5efa\u4e00\u4e2a\u529f\u80fd\u5b8c\u5907\u7684 Modbus TCP \u670d\u52a1\u5668\u3002\u8fd9\u4e2a\u670d\u52a1\u5668\u80fd\u591f\u5904\u7406\u6807\u51c6\u7684 Modbus \u529f\u80fd\u7801\uff0c\u5305\u62ec\u8bfb\u5199\u5355\u4e2a\u6216\u591a\u4e2a\u4f4d\u548c\u5bc4\u5b58\u5668\u7684\u64cd\u4f5c\u3002\u672c\u793a\u4f8b\u4e0d\u4ec5\u9002\u7528\u4e8e\u6559\u80b2\u548c\u6d4b\u8bd5\u76ee\u7684\uff0c\u4e5f\u53ef\u4ee5\u4f5c\u4e3a\u5b9e\u9645\u5e94\u7528\u4e2d\u7684\u57fa\u7840\u3002\n\n---\n*modbus.cn*\n"