"# \u5f00\u6e90 Modbus \u534f\u8bae\u6808\u9009\u578b\u6307\u5357\uff1a\u4e03\u5927\u534f\u8bae\u6808\u6df1\u5ea6\u5bf9\u6bd4\n\n> 2026-07-01 | 2026-07-01\n> https:\/\/www.modbus.cn\/en\/45426.html\n\n**Modbus\u6280\u672f\u6587\u6863**\n\n---\n\n## \u4f60\u4e3a\u4ec0\u4e48\u8981\u770b\u8fd9\u7bc7\u6587\u7ae0\n\n\u8fd9\u4e2a\u95ee\u9898\u5728 Stack Overflow\u3001control.com\u3001CSDN \u4e0a\u88ab\u95ee\u4e86\u51e0\u5343\u6b21\u2014\u2014\u300c\u6211\u8be5\u7528\u54ea\u4e2a\u5f00\u6e90 Modbus \u5e93\uff1f\u300d\u3002\u6bcf\u6b21\u56de\u7b54\u90fd\u662f\u96f6\u6563\u7684\u51e0\u53e5\uff0c\u6ca1\u4eba\u7cfb\u7edf\u5bf9\u6bd4\u8fc7\u3002\u4e2d\u6587\u793e\u533a\u66f4\u60e8\uff0c\u641c\u51fa\u6765\u7684\u5e16\u5b50\u4e00\u534a\u5728\u8d34\u5341\u5e74\u524d NModbus4 \u7684\u4ee3\u7801\uff0c\u8fde NModbus \u4e3b\u4ed3\u5e93\u5df2\u7ecf\u8fc1\u79fb\u5230 3.0.x \u4e86\u90fd\u4e0d\u77e5\u9053\u3002\n\n\u6211\u82b1\u4e86\u4e09\u5929\u65f6\u95f4\u628a\u8fd9\u4e03\u4e2a\u534f\u8bae\u6808\u7684\u4ed3\u5e93\u7ffb\u4e86\u4e00\u904d\uff0c\u8dd1\u4e86\u6bcf\u4e2a\u7684\u6700\u5c0f\u793a\u4f8b\uff0c\u786e\u8ba4\u4e86\u7ef4\u62a4\u72b6\u6001\u3002\u4e0b\u9762\u662f\u7ed3\u679c\u3002\u5982\u679c\u4f60\u8d76\u65f6\u95f4\uff0c\u76f4\u63a5\u8df3\u5230\u300c\u65b0\u624b\u63a8\u8350\u8def\u5f84\u300d\u90a3\u4e00\u6bb5\uff0c\u9009\u4f60\u7684\u5e73\u53f0\u5bf9\u5e94\u7684\u5e93\uff0c\u5f00\u5de5\u3002\n\n## \u603b\u89c8\u5bf9\u6bd4\u8868\n\n\u534f\u8bae\u6808\u8bed\u8a00\u8bb8\u53efStar \u6570\u7ef4\u62a4\u72b6\u6001\u4e3b\u7ad9\u4ece\u7ad9RTUTCP\u9002\u5408\u8c01FreeModbusCBSD~1.5k\u4f4e\u6d3b\u8dc3\u4ed8\u8d39\u2705\u2705\u2705STM32 \u88f8\u673a\/RTOSlibmodbusCLGPL v2.1+~3.5k\u6d3b\u8dc3\u2705\u2705\u2705\u2705Linux \u5de5\u63a7\u673a\/\u7f51\u5173pymodbusPythonBSD~2.2k\u975e\u5e38\u6d3b\u8dc3\u2705\u2705\u2705\u2705\u4e0a\u4f4d\u673a\/\u6d4b\u8bd5\u811a\u672cNModbusC#MIT~700\u6d3b\u8dc3\u2705\u2705\u2705\u2705.NET\/WinForm \u4e0a\u4f4d\u673ajamodJavaApache 2.0~300\u505c\u6ede\u2705\u2705\u2705\u2705Java \u9057\u7559\u7cfb\u7edfmodbus-tkPythonLGPL~500\u4f4e\u6d3b\u8dc3\u2705\u2705\u2705\u2705\u5feb\u901f\u539f\u578bQtModbusC++LGPL\/GPLQt \u5185\u7f6e\u6d3b\u8dc3\u2705\u2705\u274c\u2705Qt \u8de8\u5e73\u53f0\u5e94\u7528\n\nStar \u6570\u662f\u6211\u5728 2026 \u5e74 6 \u6708\u6293\u7684\uff0c\u5927\u81f4\u6570\u91cf\u7ea7\u5bf9\uff0c\u5177\u4f53\u6570\u5b57\u4f60\u53bb GitHub \u770b\u4e00\u773c\u5c31\u77e5\u9053\u3002\n\n## FreeModbus \u2014\u2014 \u5d4c\u5165\u5f0f\u88f8\u673a\u7684\u6807\u51c6\u7b54\u6848\n\nGitHub: https:\/\/github.com\/cwalter-at\/freemodbus\n\nFreeModbus \u662f Christian Walter \u5199\u7684\uff0c\u4e00\u4e2a\u5965\u5730\u5229\u5d4c\u5165\u5f0f\u5de5\u7a0b\u5e08\u3002\u8fd9\u4e1c\u897f\u5728 STM32 \u5708\u5b50\u91cc\u7684\u5730\u4f4d\u76f8\u5f53\u4e8e Linux \u5185\u6838\u91cc\u7684 ext4\u2014\u2014\u4f60\u4e0d\u662f\u4e0d\u80fd\u7528\u522b\u7684\uff0c\u4f46\u7528\u5b83\u662f\u6700\u4e0d\u4f1a\u51fa\u9519\u7684\u3002\n\n**\u4ee3\u7801\u4f53\u79ef**\uff1a\u7f16\u8bd1\u5b8c\u5927\u7ea6 6-12KB ROM\uff0c\u53d6\u51b3\u4e8e\u4f60\u5f00\u4e86\u54ea\u4e9b\u529f\u80fd\u7801\u548c\u4f20\u8f93\u6a21\u5f0f\u3002RAM \u5f00\u9500\u51e0\u767e\u5b57\u8282\uff0c\u4e3b\u8981\u662f\u90a3\u51e0\u5757\u6570\u636e\u7f13\u51b2\u533a\u548c\u4e8b\u4ef6\u961f\u5217\u3002\u57fa\u672c\u4e0a\u662f\u4e2a Cortex-M0 \u5c31\u80fd\u8dd1\u3002\n\n**\u529f\u80fd\u7801\u652f\u6301**\uff1a03\uff08\u8bfb\u4fdd\u6301\u5bc4\u5b58\u5668\uff09\u300104\uff08\u8bfb\u8f93\u5165\u5bc4\u5b58\u5668\uff09\u300106\uff08\u5199\u5355\u4e2a\u5bc4\u5b58\u5668\uff09\u300116\uff08\u5199\u591a\u4e2a\u5bc4\u5b58\u5668\uff09\u300101\uff08\u8bfb\u7ebf\u5708\uff09\u300102\uff08\u8bfb\u79bb\u6563\u8f93\u5165\uff09\u300105\uff08\u5199\u5355\u4e2a\u7ebf\u5708\uff09\u300115\uff08\u5199\u591a\u4e2a\u7ebf\u5708\uff09\u3002\u8fd8\u6709 17\uff08\u62a5\u544a\u4ece\u7ad9 ID\uff09\u3002\u6ce8\u610f\uff0c\u6ca1\u6709 22\uff08\u63a9\u7801\u5199\u5bc4\u5b58\u5668\uff09\u548c 23\uff08\u8bfb\u5199\u591a\u4e2a\u5bc4\u5b58\u5668\uff09\uff0c\u9700\u8981\u7684\u8bdd\u5f97\u81ea\u5df1\u52a0\u3002\n\n**\u4f20\u8f93\u6a21\u5f0f**\uff1aRTU\u3001ASCII\u3001TCP \u90fd\u652f\u6301\uff0c\u901a\u8fc7\u7f16\u8bd1\u5b8f\u5f00\u5173\u3002\n\n**\u4e3b\u7ad9\/\u4ece\u7ad9**\uff1a\u8fd9\u662f FreeModbus \u6700\u5bb9\u6613\u88ab\u8bef\u89e3\u7684\u5730\u65b9\u3002\u5b98\u65b9\u4ed3\u5e93\u53ea\u5f00\u6e90\u4e86\u4ece\u7ad9\u4ee3\u7801\uff0c\u4e3b\u7ad9\u662f\u4ed8\u8d39\u7684\u3002GitHub \u4e0a\u6709\u4e0d\u5c11\u793e\u533a\u9b54\u6539\u7248\u52a0\u4e86\u4e3b\u7ad9\u529f\u80fd\uff0c\u6bd4\u5982 armink \u7684 FreeModbus_Slave-Master-RTT-STM32\uff0c\u5f00\u6e90\u7684\uff0c\u8d28\u91cf\u4e0d\u9519\uff0c\u4f46\u4e0d\u662f\u5b98\u65b9\u7ef4\u62a4\u3002\u7528\u8fd9\u4e9b\u7b2c\u4e09\u65b9\u7248\u672c\u7684\u65f6\u5019\u6ce8\u610f\uff1a\u8d85\u65f6\u5904\u7406\u548c\u91cd\u8bd5\u903b\u8f91\u5b9e\u73b0\u5f97\u5f88\u7c97\u7cd9\uff0c\u522b\u76f4\u63a5\u4e0a\u751f\u4ea7\u3002\n\n**\u4ee3\u7801\u793a\u4f8b**\u2014\u2014STM32 \u4e0a\u521d\u59cb\u5316\u4e00\u4e2a RTU \u4ece\u7ad9\uff0c\u5730\u5740 1\uff0c\u6ce2\u7279\u7387 9600\uff0c\u65e0\u6821\u9a8c\uff1a\n\n```\n#include &quot;mb.h&quot;\n\nint main(void) {\n    eMBInit(MB_RTU, 0x01, 0, 9600, MB_PAR_NONE);\n    eMBEnable();\n    while (1) {\n        eMBPoll();\n    }\n}\n```\n\n\u5c31\u8fd9\u4e09\u884c\u3002`eMBPoll()` \u91cc\u8dd1\u7740\u6574\u4e2a\u534f\u8bae\u6808\u7684\u72b6\u6001\u673a\uff0c\u975e\u963b\u585e\u7684\uff0c\u4f60\u9700\u8981\u5728\u5b9a\u65f6\u5668\u4e2d\u65ad\u91cc\u5582 3.5T \u8d85\u65f6\u4fe1\u53f7\u7ed9\u5b83\u3002\u8fd9\u4e2a 3.5T \u5b9a\u65f6\u5668\u662f FreeModbus \u79fb\u690d\u7684\u5934\u53f7\u5751\uff0c\u4e0b\u9762\u4f1a\u4e13\u95e8\u8bb2\u3002\n\n**\u5df2\u77e5\u95ee\u9898**\uff1a\n- \u5b98\u65b9\u4ed3\u5e93\u66f4\u65b0\u6781\u6162\uff0c\u6700\u540e\u7684\u5927\u7248\u672c v1.6 \u5df2\u7ecf\u597d\u51e0\u5e74\u6ca1\u52a8\u4e86\uff0cbug \u4fee\u4e0d\u4fee\u770b\u7f18\u5206\n- \u53ea\u652f\u6301\u5355\u4e32\u53e3\uff0c\u4e00\u4e2a\u534f\u8bae\u6808\u5b9e\u4f8b\u53ea\u80fd\u7ed1\u5b9a\u4e00\u4e2a UART\uff0c\u591a\u4e32\u53e3\u573a\u666f\u8981\u6539\u4ee3\u7801\n- TCP \u6a21\u5f0f\u7528\u7684\u662f lwIP raw API\uff0c\u4e0d\u662f socket\uff0c\u8fd9\u610f\u5473\u7740 FreeRTOS+LWIP \u73af\u5883\u4e0b\u80fd\u7528\uff0c\u4f46 Linux \u4e0a\u6839\u672c\u8dd1\u4e0d\u4e86 TCP \u6a21\u5f0f\n- \u6ca1\u6709\u6d6e\u70b9\u6570\u5904\u7406\u8f85\u52a9\u51fd\u6570\uff0c\u5927\u5c0f\u7aef\u8f6c\u6362\u81ea\u5df1\u5199\n\n**\u6587\u6863**\uff1a\u53ea\u6709\u4e00\u4efd API \u6587\u6863\uff0cHTML \u683c\u5f0f\u7684\uff0c\u591f\u7528\u4f46\u8c08\u4e0d\u4e0a\u597d\u3002\u4e2d\u6587\u793e\u533a\u6559\u7a0b\u5012\u662f\u591a\uff0cCSDN \u641c\u4e00\u4e0b\u4e00\u5806\u3002\n\n## libmodbus \u2014\u2014 Linux \u5de5\u63a7\u673a\u7684\u4e0d\u4e8c\u4e4b\u9009\n\nGitHub: https:\/\/github.com\/stephane\/libmodbus\n\n\u7ef4\u62a4\u8005 St\u00e9phane Raimbault\uff0c\u6cd5\u56fd\u4eba\u3002libmodbus \u662f C \u8bed\u8a00\u5199\u7684\u6700\u6210\u719f\u7684 Modbus \u5e93\uff0c\u6ca1\u6709\u4e4b\u4e00\u30023.5k star \u4e0d\u662f\u767d\u6765\u7684\u3002\n\n\u8fd9\u4e2a\u5e93\u7684\u8bbe\u8ba1\u601d\u8def\u8ddf FreeModbus \u5b8c\u5168\u4e0d\u540c\u3002FreeModbus \u662f\u4e3a\u8d44\u6e90\u53d7\u9650\u7684 MCU \u8bbe\u8ba1\u7684\uff0c\u7528\u56de\u8c03\u51fd\u6570\u548c\u72b6\u6001\u673a\u3002libmodbus \u662f POSIX \u98ce\u683c\u7684\uff0c\u963b\u585e API\uff0c`modbus_read_registers()` \u8c03\u7528\u4f1a\u4e00\u76f4\u7b49\u5230\u6570\u636e\u56de\u6765\u6216\u8d85\u65f6\u3002\u5199\u5de5\u63a7\u673a\u7a0b\u5e8f\u7684\u4eba\u559c\u6b22\u8fd9\u79cd\u98ce\u683c\u2014\u2014\u7b80\u5355\u76f4\u63a5\uff0c\u4e0d\u7528\u7ba1\u4ec0\u4e48\u72b6\u6001\u673a\u3002\n\n**\u529f\u80fd\u7801\u652f\u6301**\uff1a\u51e0\u4e4e\u6240\u6709\u300201\/02\/03\/04\/05\/06\/07\/0F\/10\/11\/16\/17\uff0c\u8fd8\u652f\u6301 22\uff08\u63a9\u7801\u5199\uff09\u548c 23\uff08\u8bfb\u5199\u591a\u4e2a\uff09\u3002\u6709 `modbus_set_float()` \/ `modbus_get_float()` \u53ef\u4ee5\u76f4\u63a5\u6309 IEEE 754 \u5904\u7406\u6d6e\u70b9\u6570\uff0c\u652f\u6301 ABCD\/DCBA\/BADC\/CDAB \u56db\u79cd\u5b57\u8282\u5e8f\u3002\n\n**\u4f20\u8f93\u6a21\u5f0f**\uff1aRTU + TCP \u5168\u652f\u6301\u3002\u540c\u4e00\u5957 API\uff0c`modbus_new_rtu()` \u521b\u5efa\u4e32\u53e3\u4e0a\u4e0b\u6587\uff0c`modbus_new_tcp()` \u521b\u5efa TCP \u4e0a\u4e0b\u6587\uff0c\u4e4b\u540e\u8bfb\u5199\u63a5\u53e3\u5b8c\u5168\u4e00\u6837\u3002\n\n**\u4e3b\u7ad9\/\u4ece\u7ad9**\uff1a\u90fd\u652f\u6301\u3002TCP \u4ece\u7ad9\u7528 `modbus_tcp_listen()` + `modbus_tcp_accept()`\uff0c\u548c\u5199 Linux socket \u670d\u52a1\u7aef\u4e00\u4e2a\u5957\u8def\u3002\n\n**\u4ee3\u7801\u793a\u4f8b**\u2014\u2014\u8bfb\u4ece\u7ad9 1 \u7684\u4fdd\u6301\u5bc4\u5b58\u5668 0x0000\uff0c\u8fd4\u56de 1 \u4e2a 16 \u4f4d\u503c\uff1a\n\n```\n#include &lt;modbus.h&gt;\n#include &lt;stdio.h&gt;\n\nint main() {\n    modbus_t *ctx = modbus_new_rtu(&quot;\/dev\/ttyUSB0&quot;, 9600, &apos;N&apos;, 8, 1);\n    modbus_set_slave(ctx, 1);\n    modbus_connect(ctx);\n    uint16_t val;\n    modbus_read_registers(ctx, 0, 1, &amp;val);\n    printf(&quot;Register 0 = %dn&quot;, val);\n    modbus_close(ctx);\n    modbus_free(ctx);\n}\n```\n\n**\u5df2\u77e5\u95ee\u9898**\uff1a\n- `modbus_connect()` \u7684\u8bed\u4e49\u5bb9\u6613\u8e29\u5751\u3002RTU \u6a21\u5f0f\u4e0b\u8c03\u7684\u662f `open()` \u6253\u5f00\u4e32\u53e3\uff0cTCP \u6a21\u5f0f\u4e0b\u8c03\u7684\u662f `connect()` \u8fde\u670d\u52a1\u5668\u3002TCP \u4ece\u7ad9\u6a21\u5f0f\u4e0d\u9700\u8981\u4e5f\u4e0d\u80fd\u8c03 `modbus_connect()`\uff0c\u800c\u662f\u7528 `modbus_tcp_listen()`\u3002\u641e\u6df7\u4e86\u8fde\u4e0d\u4e0a\u8fd8\u4e0d\u77e5\u9053\u4e3a\u4ec0\u4e48\n- `modbus_free()` \u4e4b\u540e\u6307\u9488\u4e0d\u4f1a\u81ea\u52a8\u7f6e\u7a7a\u3002\u5982\u679c\u4f60\u5728\u5faa\u73af\u91cc\u91cd\u8fde\uff0c\u5148 free \u518d new\uff0c\u4e0d\u624b\u52a8 `ctx = NULL` \u7684\u8bdd\uff0c\u5076\u5c14\u4f1a\u6307\u5411\u5df2\u91ca\u653e\u7684\u5185\u5b58\uff0c\u8868\u73b0\u4e3a\u968f\u673a\u5d29\u6e83\u6216\u75af\u72c2\u91cd\u8fde\u3002\u8fd9\u4e2a\u6211\u5403\u8fc7\u4e8f\n- \u7ebf\u7a0b\u4e0d\u5b89\u5168\u3002\u4e00\u4e2a `modbus_t*` \u4e0a\u4e0b\u6587\u4e0d\u80fd\u88ab\u4e24\u4e2a\u7ebf\u7a0b\u540c\u65f6\u64cd\u4f5c\uff0c\u5f97\u81ea\u5df1\u52a0\u9501\n- Windows \u4e0b\u4e32\u53e3\u540d\u662f `\\\\.\\COM10` \u8fd9\u79cd\u683c\u5f0f\uff0cLinux \u662f `\/dev\/ttyUSB0`\uff0c\u8de8\u5e73\u53f0\u7f16\u8bd1\u8981\u6ce8\u610f\n\n**\u6587\u6863**\uff1a\u5b98\u7f51 libmodbus.org \u6709\u4e00\u5957 manual page \u98ce\u683c\u7684\u6587\u6863\uff0c\u5916\u52a0 mkdocs \u5728\u7ebf\u7248\u3002\u6e05\u6670\u4f46\u6ca1\u4ec0\u4e48\u793a\u4f8b\u9879\u76ee\uff0c\u5c31 `tests\/` \u76ee\u5f55\u4e0b\u90a3\u51e0\u4e2a\u3002\n\n## pymodbus \u2014\u2014 Python \u751f\u6001\u7684\u4e8b\u5b9e\u6807\u51c6\n\nGitHub: https:\/\/github.com\/pymodbus-dev\/pymodbus\n\npymodbus \u662f\u76ee\u524d\u7ef4\u62a4\u6700\u6d3b\u8dc3\u7684 Modbus \u5e93\uff0c\u6ca1\u6709\u4e4b\u4e00\u3002pymodbus-dev \u7ec4\u7ec7\u63a5\u624b\u540e\uff0c3.x \u91cd\u5199\u4e86\u5f02\u6b65\u67b6\u6784\uff0c\u652f\u6301 asyncio\uff0c\u8fd8\u5728\u6301\u7eed\u53d1\u7248\u30022024 \u5e74\u5e95\u6700\u65b0\u7684\u7a33\u5b9a\u7248\u662f v3.6.x\u3002\n\n**\u529f\u80fd\u7801**\uff1a\u5168\u652f\u6301\u300201\/02\/03\/04\/05\/06\/15\/16\/22\/23\uff0c\u8fde 43\uff08\u8bfb\u8bbe\u5907\u8bc6\u522b\uff09\u90fd\u6709\u3002\n\n**\u4f20\u8f93\u6a21\u5f0f**\uff1aRTU + TCP + TLS\u3002TLS \u652f\u6301\u662f pymodbus 3.x \u65b0\u52a0\u7684\uff0c\u53ef\u4ee5\u76f4\u63a5\u8dd1 `modbus+tls:\/\/`\u3002ASCII \u6a21\u5f0f\u4e5f\u652f\u6301\u4f46\u5728 3.x \u91cc\u88ab\u6807\u8bb0\u4e3a\u5e9f\u5f03\u3002\n\n**\u4e3b\u7ad9\/\u4ece\u7ad9**\uff1a\u90fd\u652f\u6301\uff0c\u800c\u4e14\u652f\u6301\u540c\u6b65\u548c\u5f02\u6b65\u4e24\u79cd API\u3002\u4ece\u7ad9\u53ef\u4ee5\u8dd1\u4e00\u4e2a\u5b8c\u6574\u7684\u6a21\u62df\u5668\u2014\u2014`pymodbus.simulator` \u80fd\u4ece JSON \u914d\u7f6e\u6587\u4ef6\u542f\u52a8\u4e00\u4e2a\u5e26\u591a\u5757\u5bc4\u5b58\u5668\u7684\u865a\u62df\u8bbe\u5907\uff0c\u4e0a\u4f4d\u673a\u5f00\u53d1\u8c03\u8bd5\u7684\u65f6\u5019\u975e\u5e38\u597d\u7528\u3002\n\n**\u4ee3\u7801\u793a\u4f8b**\u2014\u2014\u540c\u6b65\u6a21\u5f0f\u8bfb\u4e00\u4e2a\u4fdd\u6301\u5bc4\u5b58\u5668\uff1a\n\n```\nfrom pymodbus.client import ModbusSerialClient\n\nclient = ModbusSerialClient(port=&quot;\/dev\/ttyUSB0&quot;, baudrate=9600)\nclient.connect()\nrr = client.read_holding_registers(address=0, count=1, slave=1)\nprint(rr.registers[0])\nclient.close()\n```\n\n\u5f02\u6b65\u7248\u7a0d\u5fae\u591a\u51e0\u884c\uff0c\u7528 `async with` \u4e0a\u4e0b\u6587\u7ba1\u7406\u5668\uff0c\u914d\u5408 asyncio \u8dd1\u3002\n\n**\u5df2\u77e5\u95ee\u9898**\uff1a\n- 2.x \u5230 3.x \u7684 API \u53d8\u5316\u5de8\u5927\u3002`pymodbus.client.sync.ModbusSerialClient` \u53d8\u6210\u4e86 `pymodbus.client.ModbusSerialClient`\uff0c`read_holding_registers` \u8fd4\u56de\u503c\u4ece `ReadHoldingRegistersResponse` \u53d8\u6210\u4e86 `ModbusResponse`\u3002\u5982\u679c\u4f60\u5728\u7f51\u4e0a\u641c\u5230\u7684\u793a\u4f8b\u4ee3\u7801\u7528\u7684\u662f `from pymodbus.client.sync import ...`\uff0c\u90a3\u80af\u5b9a\u662f 2.x \u7684\uff0c\u522b\u76f4\u63a5\u6284\n- \u540c\u6b65\u6a21\u5f0f\u548c\u5f02\u6b65\u6a21\u5f0f\u4e0d\u80fd\u6df7\u7528\u3002\u540c\u4e00\u4e2a\u8fdb\u7a0b\u91cc\u5982\u679c\u5df2\u7ecf\u8dd1\u4e86 asyncio event loop\uff0c\u540c\u6b65\u5ba2\u6237\u7aef\u4f1a\u963b\u585e\u4e8b\u4ef6\u5faa\u73af\u5bfc\u81f4\u8d85\u65f6\n- RTU \u6a21\u5f0f\u4e0b\u4e32\u53e3\u8d85\u65f6\u914d\u7f6e\u6bd4\u8f83\u654f\u611f\u3002\u9ed8\u8ba4\u7684 3 \u79d2\u8d85\u65f6\u5bf9\u4e8e\u4f4e\u901f\u8bbe\u5907\uff084800bps\uff09\u53ef\u80fd\u4e0d\u591f\uff0c\u9700\u8981\u81ea\u5df1\u8c03\u5230 5-10 \u79d2\n- pip \u5b89\u88c5\u65f6 `pip install pymodbus`\uff0c\u4e0d\u662f `pymodbus3` \u6216 `pymodbus2`\uff0c\u522b\u88c5\u9519\u4e86\n\n**\u6587\u6863**\uff1areadthedocs \u4e0a\u6709\u5b8c\u6574\u7684\u6587\u6863\uff0c`examples\/` \u76ee\u5f55\u4e0b\u6709\u51e0\u5341\u4e2a\u793a\u4f8b\u811a\u672c\u3002\u6ca1\u6709\u4e2d\u6587\u6587\u6863\uff0c\u4f46\u82f1\u6587\u5f88\u6e05\u6670\u3002\n\n## NModbus \u2014\u2014 .NET \u5e73\u53f0\u7684\u552f\u4e00\u4e25\u8083\u9009\u62e9\n\nGitHub: https:\/\/github.com\/NModbus\/NModbus\n\nNModbus \u7684\u5386\u53f2\u6709\u70b9\u7ed5\u3002\u6700\u65e9\u7684 NModbus \u662f Google Code \u4e0a\uff08\u5bf9\uff0c\u5c31\u662f\u90a3\u4e2a Google Code\uff09\u7684\u4e00\u4e2a\u9879\u76ee\uff0c\u540e\u6765\u8fc1\u79fb\u5230 GitHub \u53d8\u6210 NModbus4\uff0c\u518d\u540e\u6765 NModbus4 \u4e5f\u505c\u66f4\u4e86\u3002\u73b0\u5728\u7684 NModbus\/NModbus \u662f NModbus4 \u7684\u7ee7\u4efb\u8005\uff0c\u7ef4\u62a4\u8005 rquackenbush\uff0c\u6d3b\u8dc3\u5f00\u53d1\u4e2d\uff0cnuget \u5305\u540d `NModbus`\uff0c\u6700\u65b0\u7248 3.0.x\uff0c\u652f\u6301 .NET 6+\u3002\n\n**\u529f\u80fd\u7801**\uff1a01\/02\/03\/04\/05\/06\/15\/16 \u5168\u652f\u6301\u300222 \u548c 23 \u9700\u8981\u81ea\u5b9a\u4e49\u529f\u80fd\u7801\u5904\u7406\u3002\n\n**\u4f20\u8f93\u6a21\u5f0f**\uff1aRTU\u3001ASCII\u3001TCP\u3001UDP \u5168\u652f\u6301\u3002\u4e32\u53e3\u901a\u8fc7 `NModbus.Serial` \u5305\uff0c\u652f\u6301 Windows\/Linux\u3002\n\n**\u4e3b\u7ad9\/\u4ece\u7ad9**\uff1a\u90fd\u652f\u6301\u3002\u4ece\u7ad9\u652f\u6301\u81ea\u5b9a\u4e49\u6570\u636e\u5b58\u50a8\uff0c\u53ef\u4ee5\u628a\u5bc4\u5b58\u5668\u6620\u5c04\u5230\u5185\u5b58\u3001\u6570\u636e\u5e93\u751a\u81f3 PLC\u3002\n\n**\u4ee3\u7801\u793a\u4f8b**\u2014\u2014TCP \u4e3b\u7ad9\u8bfb\u4e00\u4e2a\u5bc4\u5b58\u5668\uff1a\n\n```\nusing NModbus;\n\nvar client = new TcpClient(&quot;192.168.1.100&quot;, 502);\nvar factory = new ModbusFactory();\nvar master = factory.CreateMaster(client);\nushort[] result = master.ReadHoldingRegisters(1, 0, 1);\nConsole.WriteLine(result[0]);\n```\n\n**\u5df2\u77e5\u95ee\u9898**\uff1a\n- \u4e32\u53e3\u652f\u6301\u4f9d\u8d56 `System.IO.Ports`\uff0cLinux \u4e0a\u9700\u8981\u989d\u5916\u914d\u7f6e\u6743\u9650\n- `SlaveDataStore` \u5728\u591a\u7ebf\u7a0b\u4e0b\u4e0d\u662f\u7ebf\u7a0b\u5b89\u5168\u7684\uff0c\u9ad8\u5e76\u53d1\u8bfb\u5199\u65f6\u8981\u81ea\u5df1\u52a0\u9501\n- \u5f02\u6b65 API\uff08`ReadHoldingRegistersAsync`\uff09\u8fd4\u56de `Task`\uff0c\u4f46\u5e95\u5c42 I\/O \u5b9e\u9645\u4e0a\u662f\u540c\u6b65\u7684\uff0c\u6ca1\u6709\u771f\u6b63\u7684 async I\/O\n\n**\u6587\u6863**\uff1aREADME \u591f\u7528\uff0c`Samples\/` \u76ee\u5f55\u6709\u51e0\u4e2a\u793a\u4f8b\u3002\u4e3b\u8981\u9760 Stack Overflow \u4e0a\u7684\u8001\u5e16\u5b50\u3002\n\n## jamod \u2014\u2014 Java \u751f\u6001\u7684\u300c\u524d\u8f88\u300d\uff0c\u4f46\u5efa\u8bae\u4f60\u522b\u7528\n\nSourceForge: https:\/\/sourceforge.net\/projects\/jamod\/\nGitHub (openHAB fork): https:\/\/github.com\/openhab\/jamod\n\njamod \u662f Dieter Wimberger \u5728 2002 \u5e74\u5199\u7684\uff0c\u6bd4\u5728\u5ea7\u5f88\u591a\u5de5\u7a0b\u5e08\u7684\u5de5\u9f84\u90fd\u957f\u3002\u6700\u540e\u4e00\u6b21\u5b9e\u8d28\u6027\u66f4\u65b0\u662f 2010 \u5e74\uff0c\u4e4b\u540e\u57fa\u672c\u5c31\u6ca1\u6709\u4e86\u3002openHAB \u793e\u533a fork \u4e86\u4e00\u4e2a\u7248\u672c\u4fee\u4e86\u51e0\u4e2a bug \u7ed9\u81ea\u5df1\u7528\uff0c\u4f46\u90a3\u4e2a fork \u4e5f\u53ea\u662f\u88ab\u52a8\u7ef4\u62a4\u3002\n\n\u5982\u679c\u4f60\u73b0\u5728\u65b0\u5f00\u4e00\u4e2a Java \u9879\u76ee\u8981\u505a Modbus\uff0c\u76f4\u63a5\u8df3\u8fc7 jamod\uff0c\u770b j2mod\uff08GitHub: steveohara\/j2mod\uff09\u3002j2mod \u662f jamod \u7684\u91cd\u5199\u7248\u672c\uff0cApache 2.0 \u8bb8\u53ef\uff0cJava 8+\uff0c\u8fd8\u5728\u66f4\u65b0\uff082024 \u5e74 7 \u6708\u6700\u540e\u4e00\u6b21\u63d0\u4ea4\uff09\uff0cRTU + TCP \u5168\u652f\u6301\uff0c\u4e3b\u7ad9\u4ece\u7ad9\u90fd\u6709\u3002\n\n\u4f46\u65e2\u7136\u8fd9\u7bc7\u6587\u7ae0\u8981\u8986\u76d6 jamod\uff0c\u6211\u8fd8\u662f\u5199\u4e0a\u3002jamod \u652f\u6301\u7684\u529f\u80fd\u7801\uff1a01\/02\/03\/04\/05\/06\/15\/16\u3002\u4f20\u8f93\u6a21\u5f0f RTU + ASCII + TCP\u3002\u4e32\u53e3\u901a\u4fe1\u4f9d\u8d56 `javax.comm`\uff08\u5de8\u53e4\u8001\u7684 API\uff0cJDK \u90fd\u4e0d\u81ea\u5e26\u4e86\uff09\uff0c\u66ff\u4ee3\u65b9\u6848\u662f RXTX \u6216 jSerialComm\u3002\n\n\u4ee3\u7801\u793a\u4f8b\uff1a\n\n```\nimport net.wimpi.modbus.Modbus;\nimport net.wimpi.modbus.io.ModbusTCPTransaction;\nimport net.wimpi.modbus.msg.ReadInputRegistersRequest;\nimport net.wimpi.modbus.msg.ReadInputRegistersResponse;\nimport net.wimpi.modbus.net.TCPMasterConnection;\nimport java.net.InetAddress;\n\nTCPMasterConnection conn = new TCPMasterConnection(\n    InetAddress.getByName(&quot;192.168.1.100&quot;));\nconn.connect();\nReadInputRegistersRequest req = new ReadInputRegistersRequest(0, 1);\nModbusTCPTransaction trans = new ModbusTCPTransaction(conn);\ntrans.setRequest(req);\ntrans.execute();\nReadInputRegistersResponse res = (ReadInputRegistersResponse) trans.getResponse();\nSystem.out.println(res.getRegisterValue(0));\nconn.close();\n```\n\n\u300c\u5df2\u77e5\u95ee\u9898\u300d\u8fd9\u4e2a\u8bcd\u5bf9 jamod \u6765\u8bf4\u592a\u8f7b\u4e86\uff0c\u5b83\u672c\u8eab\u5c31\u662f\u4e2a\u95ee\u9898\u3002\u4f46\u5982\u679c\u4f60\u7ef4\u62a4\u7684\u662f 2012 \u5e74\u7684\u8001\u7cfb\u7edf\uff0c\u53c8\u4e0d\u5f97\u4e0d\u7528\u5b83\uff0c\u90a3 openHAB \u7684 fork \u6bd4\u539f\u7248\u9760\u8c31\u3002\n\n## modbus-tk \u2014\u2014 \u5feb\u901f\u539f\u578b\u7684\u597d\u5e2e\u624b\n\nGitHub: https:\/\/github.com\/ljean\/modbus-tk\n\n\u6cd5\u56fd\u4eba Luc Jean \u5199\u7684\uff0c\u540d\u5b57\u91cc\u7684 tk \u662f TestKit \u7684\u7f29\u5199\u2014\u2014\u5b9a\u4f4d\u975e\u5e38\u660e\u786e\uff1a\u6d4b\u8bd5\u5de5\u5177\u3002\u4e0d\u662f\u7ed9\u751f\u4ea7\u73af\u5883\u7528\u7684\u3002\u4f46\u5b9e\u9645\u4e0a\u5f88\u591a\u4eba\u62ff\u5b83\u505a\u4e86\u751f\u4ea7\uff0c\u56e0\u4e3a\u5b83\u786e\u5b9e\u7b80\u5355\u3002\n\n**\u529f\u80fd\u7801**\uff1a01\/02\/03\/04\/05\/06\/15\/16\u3002\u4e0d\u652f\u6301 22\/23\u3002\n\n**\u4f20\u8f93\u6a21\u5f0f**\uff1aRTU + TCP\u3002ASCII \u4e0d\u652f\u6301\u3002\n\n**\u4e3b\u7ad9\/\u4ece\u7ad9**\uff1a\u90fd\u652f\u6301\u3002\u4ece\u7ad9\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5730 `add_slave` + `add_block` \u521b\u5efa\u6a21\u62df\u8bbe\u5907\u3002\u5185\u7f6e\u4e00\u4e2a hook \u51fd\u6570\u673a\u5236\uff0c\u53ef\u4ee5\u5728\u6536\u5230\u8bfb\u5199\u8bf7\u6c42\u65f6\u63d2\u5165\u81ea\u5b9a\u4e49\u903b\u8f91\u2014\u2014\u8fd9\u4e2a\u8bbe\u8ba1\u5f88\u806a\u660e\uff0c\u5199\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\u53ef\u4ee5\u76f4\u63a5\u5728 hook \u91cc\u6ce8\u5165\u6545\u969c\u573a\u666f\u3002\n\n**\u4ee3\u7801\u793a\u4f8b**\u2014\u2014RTU \u4e3b\u7ad9\u8bfb\u5bc4\u5b58\u5668\uff1a\n\n```\nimport serial\nimport modbus_tk.defines as cst\nfrom modbus_tk import modbus_rtu\n\nmaster = modbus_rtu.RtuMaster(\n    serial.Serial(port=&quot;\/dev\/ttyUSB0&quot;, baudrate=9600))\nval = master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 1)\nprint(val[0])\n```\n\n**\u5df2\u77e5\u95ee\u9898**\uff1a\n- \u6700\u540e\u66f4\u65b0\u5728 2020 \u5e74\u5de6\u53f3\uff0cbug fix \u57fa\u672c\u9760\u793e\u533a PR\u3002Python 3.12 \u7684\u517c\u5bb9\u6027\u53ef\u80fd\u6709\u95ee\u9898\n- \u6ca1\u6709\u5f02\u6b65\u652f\u6301\uff0c\u6240\u6709\u64cd\u4f5c\u90fd\u662f\u540c\u6b65\u963b\u585e\u7684\n- \u6d6e\u70b9\u6570\u6ca1\u6709\u5185\u7f6e\u8f85\u52a9\uff0c\u4f60\u5f97\u81ea\u5df1 `struct.pack\/unpack`\n- \u4e3b\u7ad9 `execute()` \u65b9\u6cd5\u7684\u8d85\u65f6\u884c\u4e3a\u4e0d\u592a\u53ef\u63a7\uff0c\u5e95\u5c42\u4f9d\u8d56 pyserial \u7684\u8d85\u65f6\uff0c\u9047\u5230\u65e0\u54cd\u5e94\u7684\u4ece\u7ad9\u53ef\u80fd\u5361\u5f88\u4e45\n\n**\u6587\u6863**\uff1a`examples\/` \u76ee\u5f55\u91cc\u51e0\u4e2a\u793a\u4f8b\u5c31\u662f\u5168\u90e8\u6587\u6863\u4e86\u3002\u597d\u5728\u4ee3\u7801\u91cf\u5c0f\uff0c\u82b1\u5341\u5206\u949f\u5c31\u80fd\u770b\u5b8c\u3002\n\n## QtModbus \u2014\u2014 Qt \u5f00\u53d1\u8005\u7684\u539f\u751f\u65b9\u6848\n\n\u8fd9\u4e0d\u662f\u4e00\u4e2a\u300c\u5e93\u300d\uff0c\u662f Qt \u5b98\u65b9 `qtserialbus` \u6a21\u5757\u7684\u4e00\u90e8\u5206\u3002Qt 5.8 \u5f15\u5165\uff0c\u73b0\u5728\u662f Qt 6 \u7684\u6807\u914d\u6a21\u5757\u3002\n\n\u56e0\u4e3a\u662f Qt \u5b98\u65b9\u7684\uff0cAPI \u8bbe\u8ba1\u5b8c\u5168\u662f Qt \u98ce\u683c\uff1a\u4fe1\u53f7\u69fd\u3001\u4e8b\u4ef6\u5faa\u73af\u3001`QModbusReply`\u3002\u8de8\u5e73\u53f0\u5929\u7136\u652f\u6301\u2014\u2014\u540c\u4e00\u5957\u4ee3\u7801\u5728 Windows\u3001Linux\u3001macOS\u3001\u5d4c\u5165\u5f0f Linux\uff08Boot2Qt\uff09\u4e0a\u90fd\u80fd\u8dd1\u3002\n\n**\u529f\u80fd\u7801**\uff1a\u901a\u8fc7 `QModbusDataUnit::RegisterType` \u679a\u4e3e\u652f\u6301\u6240\u6709\u6807\u51c6\u7c7b\u578b\uff1aCoils\u3001DiscreteInputs\u3001InputRegisters\u3001HoldingRegisters\u3002\u5e95\u5c42\u53ef\u4ee5\u53d1\u81ea\u5b9a\u4e49\u529f\u80fd\u7801\u3002\n\n**\u4f20\u8f93\u6a21\u5f0f**\uff1a\u53ea\u6709 TCP\uff08`QModbusTcpClient` \/ `QModbusTcpServer`\uff09\u3002**\u6ca1\u6709 RTU**\u3002\u8fd9\u662f\u4e00\u4e2a\u91cd\u8981\u7684\u9650\u5236\u2014\u2014Qt \u5b98\u65b9\u6ca1\u6709\u5185\u7f6e Modbus RTU \u652f\u6301\uff0c\u4f60\u5f97\u7528 `QSerialPort` \u81ea\u5df1\u5728\u5e94\u7528\u5c42\u5199 RTU \u5e27\u89e3\u6790\uff0c\u6216\u8005\u627e\u7b2c\u4e09\u65b9\u5b9e\u73b0\u3002\u6709\u4e9b\u5f00\u53d1\u8005\u7528 `QModbusRtuSerialMaster`\uff08\u4e00\u4e2a\u793e\u533a\u9879\u76ee\uff09\u6765\u586b\u8865\u8fd9\u4e2a\u7a7a\u7f3a\u3002\n\n**\u4e3b\u7ad9\/\u4ece\u7ad9**\uff1a\u90fd\u652f\u6301\u3002TCP \u4ece\u7ad9\u53ef\u4ee5\u901a\u8fc7 `QModbusTcpServer` \u5b9e\u73b0\uff0c\u81ea\u5b9a\u4e49\u6570\u636e\u6620\u5c04\u5230 `QModbusServer` \u7684\u6ce8\u518c\u8868\u3002\n\n**\u4ee3\u7801\u793a\u4f8b**\u2014\u2014TCP \u5ba2\u6237\u7aef\u8bfb\u4e00\u4e2a\u5bc4\u5b58\u5668\uff1a\n\n```\n#include &lt;QModbusTcpClient&gt;\n#include &lt;QModbusDataUnit&gt;\n\nauto client = new QModbusTcpClient(this);\nclient-&gt;setConnectionParameter(\n    QModbusDevice::NetworkAddressParameter, &quot;192.168.1.100&quot;);\nclient-&gt;setConnectionParameter(\n    QModbusDevice::NetworkPortParameter, 502);\nclient-&gt;connectDevice();\n\nQModbusDataUnit unit(QModbusDataUnit::HoldingRegisters, 0, 1);\nauto *reply = client-&gt;sendReadRequest(unit, 1);\nconnect(reply, &amp;QModbusReply::finished, this, [reply]() {\n    qDebug() &lt;&lt; reply-&gt;result().values().at(0);\n});\n```\n\n\u5f02\u6b65\u7684\uff0c\u7528\u4fe1\u53f7\u69fd\u8fde\u63a5\u7ed3\u679c\u3002\u6ce8\u610f `sendReadRequest` \u8fd4\u56de\u7684 `QModbusReply*` \u751f\u547d\u5468\u671f\u5f52 Qt \u7ba1\u7406\uff0c\u522b\u624b\u52a8 delete\u3002\n\n**\u5df2\u77e5\u95ee\u9898**\uff1a\n- \u6ca1\u6709 RTU\uff0c\u8fd9\u662f\u6700\u5927\u7684\u4e00\u4e2a\u3002\u4f60\u6ca1\u770b\u9519\uff0cQt \u5b98\u65b9\u7684 Modbus \u6a21\u5757\u6ca1\u6709 RTU\n- \u8fde\u63a5\u65ad\u5f00\u540e\u4e0d\u4f1a\u81ea\u52a8\u91cd\u8fde\uff0c\u4f60\u5f97\u5728 `stateChanged` \u4fe1\u53f7\u91cc\u81ea\u5df1\u5199\u91cd\u8fde\u903b\u8f91\n- `QModbusTcpServer` \u7684 TCP \u8fde\u63a5\u6570\u6709\u4e0a\u9650\uff0c\u9ed8\u8ba4\u662f 1\u3002\u8981\u901a\u8fc7 `setMaxClients()` \u6539\n- \u8bb8\u53ef\u95ee\u9898\uff1aQt \u662f LGPL\/GPL \u53cc\u8bb8\u53ef\uff0c\u5546\u4e1a\u95ed\u6e90\u9879\u76ee\u9700\u8981\u4e70 Qt Commercial License\n\n**\u6587\u6863**\uff1aQt \u5b98\u65b9\u6587\u6863\u4e00\u6d41\u3002\u793a\u4f8b\u9879\u76ee\u5728 Qt Creator \u6b22\u8fce\u9875\u5c31\u80fd\u627e\u5230\u3002\n\n## \u65b0\u624b\u63a8\u8350\u8def\u5f84\n\n\u522b\u7ea0\u7ed3\u4e86\uff0c\u6309\u4f60\u7684\u6280\u672f\u6808\u9009\uff1a\n\n- **STM32 \u88f8\u673a \/ FreeRTOS** \u2192 FreeModbus\u3002\u4f60\u6ca1\u522b\u7684\u9009\u62e9\uff0c\u5b83\u5c31\u662f\u6807\u51c6\u7b54\u6848\u3002\u79fb\u690d\u82b1\u534a\u5929\uff0c\u8c03\u901a 3.5T \u5b9a\u65f6\u5668\u518d\u52a0\u534a\u5929\uff0c\u4e4b\u540e\u5c31\u4e0d\u7528\u7ba1\u4e86\n- **Linux \u5de5\u63a7\u673a \/ \u7f51\u5173\uff08C\uff09** \u2192 libmodbus\u3002\u5982\u679c\u662f\u6811\u8393\u6d3e\u8dd1 Debian \u505a Modbus \u7f51\u5173\uff0clibmodbus + MQTT \u6865\u63a5\u662f\u7ecf\u5178\u65b9\u6848\u3002`libmodbus` \u91c7\u96c6\uff0c`mosquitto` \u4e0a\u4e91\n- **Python \u4e0a\u4f4d\u673a \/ \u6d4b\u8bd5\u811a\u672c** \u2192 pymodbus\u3002pymodbus.simulator \u4eff\u771f + pymodbus client \u8bfb\u5199\uff0c\u4e00\u4e2a\u811a\u672c\u641e\u5b9a\u8bbe\u5907\u8c03\u8bd5\u3002\u914d\u5408 pytest \u53ef\u4ee5\u505a Modbus \u81ea\u52a8\u5316\u6d4b\u8bd5\n- **C# WinForm \/ WPF \u4e0a\u4f4d\u673a** \u2192 NModbus\u3002NuGet \u5b89\u88c5\uff0c\u4e09\u884c\u4ee3\u7801\u5f00\u59cb\u8bfb\u5bc4\u5b58\u5668\u3002\u914d\u5408 ScottPlot \u505a\u5b9e\u65f6\u66f2\u7ebf\uff0c\u5de5\u5382\u91cc\u6700\u5e38\u89c1\u7684\u6280\u672f\u6808\u7ec4\u5408\n- **Qt \u8de8\u5e73\u53f0\u684c\u9762\u5e94\u7528** \u2192 QtModbus\u3002\u5982\u679c\u4f60\u7684\u5e94\u7528\u5df2\u7ecf\u7528\u4e86 Qt\uff0c\u522b\u5f15\u5165\u989d\u5916\u7684 C \u5e93\u4f9d\u8d56\uff0c\u76f4\u63a5\u7528 Qt \u5b98\u65b9\u7684\n- **Java \u4f01\u4e1a\u7cfb\u7edf\uff08\u65b0\u9879\u76ee\uff09** \u2192 \u4e0d\u8981\u7528 jamod\u3002\u7528 j2mod\uff08GitHub: steveohara\/j2mod\uff09\uff0c\u5b83\u662f jamod \u7684\u73b0\u4ee3\u5316\u91cd\u5199\uff0cAPI \u6e05\u6670\u5f97\u591a\n- **\u5feb\u901f\u9a8c\u8bc1\u60f3\u6cd5** \u2192 modbus-tk\u3002\u4e09\u5206\u949f\u642d\u4e00\u4e2a\u4ece\u7ad9\u6a21\u62df\u5668\uff0c\u9a8c\u8bc1\u5bc4\u5b58\u5668\u6620\u5c04\u5bf9\u4e0d\u5bf9\uff0c\u7136\u540e\u5207\u5230 pymodbus \u505a\u6b63\u5f0f\u7684\n\n## \u7ecf\u5178\u7ec4\u5408\u65b9\u6848\n\n**\u300cFreeModbus \u4ece\u7ad9 + pymodbus \u4e0a\u4f4d\u673a\u6d4b\u8bd5\u300d**\uff1a\u5d4c\u5165\u5f0f\u8bbe\u5907\u8dd1 FreeModbus \u505a\u4ece\u7ad9\uff0c\u5f00\u53d1\u9636\u6bb5\u7528 Python \u5199 pymodbus \u811a\u672c\u8bfb\u5199\u5bc4\u5b58\u5668\u505a\u529f\u80fd\u9a8c\u8bc1\u3002\u6bd4\u7528 Modbus Poll \u7075\u6d3b\u2014\u2014\u4f60\u80fd\u5728\u811a\u672c\u91cc\u52a0\u6570\u636e\u6821\u9a8c\u3001\u8fb9\u754c\u6d4b\u8bd5\u3001\u538b\u529b\u6d4b\u8bd5\u3002\u8c03\u901a\u4e4b\u540e\uff0c\u518d\u6362\u6210\u771f\u6b63\u7684\u4e0a\u4f4d\u673a\uff08C# \u6216 Qt\uff09\u3002\n\n**\u300clibmodbus \u7f51\u5173 + pymodbus \u914d\u7f6e\u5de5\u5177\u300d**\uff1a\u5de5\u63a7\u673a\u8dd1 libmodbus \u5bf9\u63a5\u4e0b\u9762\u51e0\u5341\u53f0 Modbus RTU \u8bbe\u5907\uff0c\u6570\u636e\u6536\u96c6\u540e\u8f6c MQTT \u4e0a\u4e91\u3002Web \u540e\u53f0\u7528 pymodbus \u505a\u8bbe\u5907\u53c2\u6570\u8bfb\u5199\u2014\u2014\u4e0d\u8981\u6c42\u5b9e\u65f6\u6027\uff0cPython \u7684\u5f00\u53d1\u6548\u7387\u78be\u538b\u4e00\u5207\u3002\n\n**\u300cQtModbus \u505a\u754c\u9762 + libmodbus \u505a\u5e95\u5c42\u300d**\uff1aQt \u5199\u8de8\u5e73\u53f0\u684c\u9762 SCADA\uff0c\u4eba\u673a\u4ea4\u4e92\u548c\u56fe\u8868\u7528 Qt Charts\uff0c\u4f46 Modbus \u901a\u4fe1\u4e0d\u76f4\u63a5\u7528 QtModbus\uff08\u56e0\u4e3a\u6ca1\u6709 RTU\uff09\uff0c\u800c\u662f\u901a\u8fc7 libmodbus \u7684 C API \u505a\u5e95\u5c42\u91c7\u96c6\uff0cQt \u53ea\u8d1f\u8d23\u663e\u793a\u3002\u8fd9\u4e2a\u7ec4\u5408\u5728\u5382\u533a\u76d1\u63a7\u7cfb\u7edf\u91cc\u5f88\u5e38\u89c1\u3002\n\n## \u907f\u5751\u6e05\u5355\n\n**\u7b2c\u4e00\u5751\uff1aFreeModbus \u7684 3.5T \u5b9a\u65f6\u5668**\n\nModbus RTU \u534f\u8bae\u89c4\u5b9a\u5e27\u4e0e\u5e27\u4e4b\u95f4\u81f3\u5c11\u95f4\u9694 3.5 \u4e2a\u5b57\u7b26\u65f6\u95f4\u3002\u6ce2\u7279\u7387 9600 \u65f6\u4e00\u4e2a\u5b57\u7b26\u5927\u7ea6 1ms\uff0c3.5T \u2248 3.5ms\u3002\u5f88\u591a\u4eba\u79fb\u690d\u65f6\u76f4\u63a5\u628a\u5b9a\u65f6\u5668\u8bbe\u6210 3.5ms \u5468\u671f\u4e2d\u65ad\u3002\u9519\u4e86\u3002FreeModbus \u7684 3.5T \u5b9a\u65f6\u5668\u7528\u6cd5\u662f\uff1a\u6bcf\u6536\u5230\u4e00\u4e2a\u5b57\u8282\u5c31\u91cd\u7f6e\u5b9a\u65f6\u5668\uff0c\u5982\u679c\u5b9a\u65f6\u5668\u6ea2\u51fa\uff08\u8bf4\u660e 3.5T \u5185\u6ca1\u6709\u65b0\u5b57\u8282\uff09\uff0c\u5219\u8ba4\u4e3a\u4e00\u5e27\u7ed3\u675f\u3002\u6240\u4ee5\u5b9a\u65f6\u5668\u8981\u8bbe\u6210\u5355\u6b21\u6a21\u5f0f\uff0c\u4e0d\u662f\u5468\u671f\u6a21\u5f0f\u3002\u5728\u6536\u5230\u5b57\u8282\u7684\u4e2d\u65ad\u91cc\u8c03 `vMBPortTimersEnable()` \u91cd\u65b0\u542f\u52a8\u5b9a\u65f6\u5668\u3002\n\n\u6ce2\u7279\u7387\u4e0d\u540c\u65f6 3.5T \u5bf9\u5e94\u7684\u65f6\u95f4\u4e0d\u540c\uff1a9600bps \u2192 ~3.65ms\uff0c19200bps \u2192 ~1.83ms\uff0c115200bps \u2192 ~304\u03bcs\u3002115200 \u4e0b 3.5T \u53ea\u6709 300 \u5fae\u79d2\u5de6\u53f3\uff0c\u5982\u679c\u4f60\u7684\u5b9a\u65f6\u5668\u6700\u5c0f\u7c92\u5ea6\u662f 1ms\uff0c\u6821\u51c6\u4e0d\u4e86\u90a3\u4e48\u7cbe\u7ec6\uff0c\u5e27\u95f4\u9694\u68c0\u6d4b\u5c31\u4f1a\u51fa\u9519\u3002\u8fd9\u65f6\u5019\u8981\u4e48\u964d\u6ce2\u7279\u7387\u5230 38400\uff0c\u8981\u4e48\u7528\u786c\u4ef6\u5b9a\u65f6\u5668\u7684\u9ad8\u7cbe\u5ea6\u6a21\u5f0f\u3002\n\n**\u7b2c\u4e8c\u5751\uff1alibmodbus \u7684 connect vs new_tcp vs listen \u8bed\u4e49**\n\n`modbus_new_tcp(\"192.168.1.100\", 502)` \u521b\u5efa\u4e0a\u4e0b\u6587\uff0c\u4f46\u8fd8\u6ca1\u8fde\u63a5\u3002\n`modbus_connect(ctx)` \u5728 RTU \u6a21\u5f0f\u4e0b\u6253\u5f00\u4e32\u53e3\uff0c\u5728 TCP \u4e3b\u7ad9\u6a21\u5f0f\u4e0b connect \u5230\u670d\u52a1\u5668\u3002\nTCP \u4ece\u7ad9\u6a21\u5f0f\u4e0d\u8981\u8c03 `modbus_connect()`\uff0c\u800c\u662f `modbus_tcp_listen(ctx, 1)` + `modbus_tcp_accept(ctx, &amp;socket)`\u3002\n\n\u6700\u5e38\u89c1\u7684\u9519\u8bef\uff1a\u5199 TCP \u4ece\u7ad9\u7684\u65f6\u5019\u4e60\u60ef\u6027\u8c03\u4e86 `modbus_connect()`\uff0c\u7136\u540e\u53d1\u73b0\u600e\u4e48\u90fd\u6536\u4e0d\u5230\u4e3b\u7ad9\u7684\u8bf7\u6c42\u3002\u56e0\u4e3a `connect()` \u662f\u53bb\u8fde\u522b\u4eba\uff0c\u4e0d\u662f\u7b49\u522b\u4eba\u6765\u8fde\u4f60\u3002\n\n\u53e6\u5916\u4e00\u4e2a\u5751\uff1a`modbus_free(ctx)` \u4e4b\u540e `ctx` \u6307\u9488\u8fd8\u5728\u3002\u5982\u679c\u4f60\u8981\u5728\u5faa\u73af\u91cc\u91cd\u8fde\uff08\u6bd4\u5982\u7f51\u7edc\u65ad\u4e86\u53c8\u6062\u590d\uff09\uff0c\u5fc5\u987b\u5148 `ctx = NULL` \u518d `modbus_new_tcp()`\uff0c\u5426\u5219\u6709\u6982\u7387\u8bbf\u95ee\u5df2\u91ca\u653e\u7684\u5185\u5b58\u3002Wireshark \u6293\u5305\u4f1a\u770b\u5230 TCP SYN \u75af\u72c2\u91cd\u53d1\u51e0\u4e07\u6b21\u2014\u2014\u90a3\u662f `modbus_connect()` \u5728\u8bbf\u95ee\u91ce\u6307\u9488\u3002\n\n**\u7b2c\u4e09\u5751\uff1apymodbus \u540c\u6b65 vs \u5f02\u6b65\u6a21\u5f0f\u6df7\u7528**\n\npymodbus 3.x \u6709\u4e24\u5957\u5ba2\u6237\u7aef API\uff1a\u540c\u6b65\u7684 `ModbusSerialClient` \/ `ModbusTcpClient`\uff0c\u5f02\u6b65\u7684 `AsyncModbusSerialClient` \/ `AsyncModbusTcpClient`\u3002\n\n\u5982\u679c\u4f60\u5728\u4e00\u4e2a\u5df2\u7ecf\u6709 asyncio \u4e8b\u4ef6\u5faa\u73af\u7684\u8fdb\u7a0b\u91cc\u7528\u540c\u6b65\u5ba2\u6237\u7aef\uff0c\u5e95\u5c42\u7684 socket I\/O \u4f1a\u963b\u585e\u4e8b\u4ef6\u5faa\u73af\uff0c\u5bfc\u81f4\u6240\u6709\u5f02\u6b65\u4efb\u52a1\u6682\u505c\u3002\u53cd\u8fc7\u6765\uff0c\u5728\u7eaf\u540c\u6b65\u811a\u672c\u91cc\u7528\u5f02\u6b65\u5ba2\u6237\u7aef\uff0c`await` \u8bed\u6cd5\u4f1a\u62a5\u9519\u3002\n\n\u89c4\u5219\u5f88\u7b80\u5355\uff1a\u8981\u4e48\u5168\u540c\u6b65\uff0c\u8981\u4e48\u5168\u5f02\u6b65\u3002\u6d4b\u8bd5\u811a\u672c\u4e00\u822c\u7528\u540c\u6b65\u5c31\u591f\u4e86\u3002\u751f\u4ea7\u73af\u5883\u5982\u679c\u662f\u4e00\u4e2a\u8fdb\u7a0b\u8981\u540c\u65f6\u8fde\u51e0\u5341\u53f0\u8bbe\u5907\uff0c\u5fc5\u987b\u7528\u5f02\u6b65\u6a21\u5f0f\uff0c\u4e0d\u7136\u4e00\u4e2a\u8bbe\u5907\u8d85\u65f6\u62d6\u7740\u5176\u4ed6 49 \u4e2a\u4e00\u8d77\u7b49\u3002\n\n**\u7b2c\u56db\u5751\uff1a\u5b57\u8282\u5e8f\u95ee\u9898\u2014\u2014\u4e0d\u662f\u5e93\u7684\u9505\uff0c\u4f46\u6bcf\u6b21\u90fd\u662f\u5751**\n\nModbus \u534f\u8bae\u672c\u8eab\u53ea\u5b9a\u4e49\u4e86 16 \u4f4d\u5bc4\u5b58\u5668\u7684\u4f20\u8f93\u683c\u5f0f\u2014\u2014\u5927\u7aef\uff08Big-Endian\uff09\uff0c\u9ad8\u5b57\u8282\u5728\u524d\u3002\u4f46\u5f53\u4f60\u7528\u4e24\u4e2a\u5bc4\u5b58\u5668\u4f20\u4e00\u4e2a 32 \u4f4d\u6d6e\u70b9\u6570\u65f6\uff0c\u8c01\u5728\u524d\u8c01\u5728\u540e\uff0c\u534f\u8bae\u6ca1\u8bf4\u3002\u4e0d\u540c\u5382\u5546\u7684\u5904\u7406\u65b9\u5f0f\u4e0d\u4e00\u6837\uff1a\n\n- \u65bd\u8010\u5fb7 PLC \u7528\u5927\u7aef\u53cc\u5b57\uff08ABCD\uff09\uff1a\u5bc4\u5b58\u5668 N \u5b58\u9ad8 16 \u4f4d\uff0cN+1 \u5b58\u4f4e 16 \u4f4d\n- \u897f\u95e8\u5b50 S7-1200 \u7528\u5b57\u8282\u4ea4\u6362\u540e\u7684\u683c\u5f0f\uff08CDAB \u6216 BADC\uff09\n- \u6709\u4e9b\u56fd\u4ea7\u4eea\u8868\u7528\u7eaf\u5c0f\u7aef\uff08DCBA\uff09\n\nlibmodbus \u63d0\u4f9b\u4e86 `modbus_set_float()` \u548c\u56db\u79cd\u5b57\u8282\u5e8f\u5e38\u91cf\uff0cpymodbus \u6709 `BinaryPayloadDecoder` \u53ef\u4ee5\u6307\u5b9a\u5b57\u8282\u5e8f\uff0cFreeModbus \u4ec0\u4e48\u90fd\u6ca1\u6709\u2014\u2014\u81ea\u5df1\u7528 `union` \u6216\u8005 `memcpy` \u62fc\u3002\n\n\u8840\u7684\u6559\u8bad\uff1a\u8c03\u4e86\u4e24\u5929\u53d1\u73b0\u6e29\u5ea6\u8bfb\u6570\u662f\u4e2a\u5929\u6587\u6570\u5b57\uff0c\u6700\u540e\u662f\u5b57\u8282\u5e8f\u53cd\u4e86\u3002\u5148\u786e\u8ba4\u5bf9\u65b9\u8bbe\u5907\u7684\u624b\u518c\u4e0a\u6709\u6ca1\u6709\u5199 Float \u7684\u5b58\u653e\u683c\u5f0f\u3002\u5982\u679c\u6ca1\u5199\uff0c\u8bfb\u4e24\u4e2a\u5bc4\u5b58\u5668\u81ea\u5df1\u62fc\uff0c\u6362\u56db\u79cd\u6392\u5217\u603b\u6709\u4e00\u4e2a\u662f\u5bf9\u7684\u3002\n\n**\u7b2c\u4e94\u5751\uff1a\u5e7f\u64ad\u5730\u5740 0 \u7684\u5751**\n\nModbus \u89c4\u5b9a\u5730\u5740 0 \u662f\u5e7f\u64ad\u5730\u5740\uff0c\u4e3b\u7ad9\u53d1\u5e7f\u64ad\u5e27\uff0c\u6240\u6709\u4ece\u7ad9\u6267\u884c\u4f46\u4e0d\u56de\u590d\u3002\u4f46\u5b9e\u9645\u4e0a\u5f88\u591a\u4ece\u7ad9\u8bbe\u5907\u6839\u672c\u4e0d\u652f\u6301\u5e7f\u64ad\uff0c\u53d1\u5730\u5740 0 \u8fc7\u53bb\u76f4\u63a5\u6ca1\u53cd\u5e94\u3002\u8fd8\u6709\u7684\u8bbe\u5907\u867d\u7136\u652f\u6301\u5e7f\u64ad\u4f46\u4e0d\u5168\u652f\u6301\u2014\u201406\uff08\u5199\u5355\u4e2a\u5bc4\u5b58\u5668\uff09\u5e7f\u64ad\u80fd\u6267\u884c\uff0c16\uff08\u5199\u591a\u4e2a\u5bc4\u5b58\u5668\uff09\u5e7f\u64ad\u5c31\u5ffd\u7565\u3002\n\n\u5982\u679c\u4f60\u5728\u7528 `libmodbus_set_slave(ctx, 0)` \u53d1\u5e7f\u64ad\uff0c\u522b\u6307\u671b\u6709\u56de\u590d\u3002`modbus_read_registers()` \u5728\u5e7f\u64ad\u6a21\u5f0f\u4e0b\u7684\u884c\u4e3a\u662f\u672a\u5b9a\u4e49\u7684\u3002\n\n## \u9009\u578b\u51b3\u7b56\u901f\u67e5\n\n\u5982\u679c\u4f60\u4e0d\u60f3\u770b\u4e0a\u9762\u6d0b\u6d0b\u6d12\u6d12\u51e0\u5343\u5b57\uff0c\u8fd9\u91cc\u6709\u4e2a\u51b3\u7b56\u6811\uff1a\n\n1. \u76ee\u6807\u5e73\u53f0\u662f MCU \u88f8\u673a \u2192 FreeModbus\n2. \u76ee\u6807\u5e73\u53f0\u662f Linux \u2192 libmodbus\n3. \u4f60\u7528 Python \u2192 pymodbus\n4. \u4f60\u7528 C# \/ .NET \u2192 NModbus\n5. \u4f60\u7528 Qt \u2192 QtModbus\uff08TCP \u573a\u666f\uff09\u6216 libmodbus\uff08RTU \u573a\u666f\uff09\n6. \u4f60\u7528 Java \u65b0\u9879\u76ee \u2192 j2mod\uff0c\u522b\u78b0 jamod\n7. \u4f60\u53ea\u662f\u8981\u5feb\u901f\u642d\u4e2a\u6d4b\u8bd5 \u2192 modbus-tk\uff0c\u9a8c\u8bc1\u5b8c\u5207 pymodbus\n\n\u6240\u6709\u5e93\u6211\u90fd\u8d34\u4e86\u6700\u5c0f\u53ef\u8fd0\u884c\u793a\u4f8b\uff0c\u590d\u5236\u7c98\u8d34\u6539\u4e00\u4e0b\u8bbe\u5907\u5730\u5740\u5c31\u80fd\u8dd1\u3002\u901a\u4fe1\u8c03\u4e0d\u901a\u7684\u65f6\u5019\uff0c\u5148\u62ff Modbus Poll \u6216 pymodbus \u642d\u4e2a\u7eaf\u8f6f\u4ef6\u73af\u56de\u786e\u8ba4\u786c\u4ef6\u94fe\u8def\u6ca1\u95ee\u9898\uff0c\u518d\u6000\u7591\u534f\u8bae\u6808\u7684 bug\u3002\n\n\u6709\u95ee\u9898\u5230 modbus.cn \u8bba\u575b\u804a\u3002\n\n---\n*modbus.cn*\n"