"# Modbus\u8c03\u8bd5\u5de5\u5177\u5b8c\u5168\u6307\u5357\uff1a\u4ece\u5165\u95e8\u5230\u7cbe\u901a\u7684\u5b9e\u7528\u5de5\u5177\u96c6\n\n> 2026-02-24 | 2026-02-24\n> https:\/\/www.modbus.cn\/en\/40395.html\n\n**Modbus\u8c03\u8bd5\u5de5\u5177**\n\n---\n\nModbus\u8c03\u8bd5\u5de5\u5177\u5b8c\u5168\u6307\u5357\uff1a\u4ece\u5165\u95e8\u5230\u7cbe\u901a\u7684\u5b9e\u7528\u5de5\u5177\u96c6\n\n## \u5f15\u8a00\n\n\u5728Modbus\u7cfb\u7edf\u5f00\u53d1\u3001\u96c6\u6210\u548c\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u8c03\u8bd5\u5de5\u5177\u662f\u786e\u4fdd\u901a\u4fe1\u7a33\u5b9a\u6027\u548c\u7cfb\u7edf\u53ef\u9760\u6027\u7684\u5173\u952e\u3002\u672c\u6587\u57fa\u4e8eModbus\u5b98\u65b9\u8d44\u6e90\u9875\u9762\uff0c\u5168\u9762\u4ecb\u7ecd20\u591a\u4e2a\u4e13\u4e1a\u8c03\u8bd5\u5de5\u5177\uff0c\u6db5\u76d6\u534f\u8bae\u5206\u6790\u3001\u8bbe\u5907\u6d4b\u8bd5\u3001\u6027\u80fd\u76d1\u63a7\u548c\u6545\u969c\u6392\u67e5\u7b49\u5404\u4e2a\u65b9\u9762\u3002\u65e0\u8bba\u60a8\u662f\u73b0\u573a\u5de5\u7a0b\u5e08\u3001\u7cfb\u7edf\u96c6\u6210\u5546\u8fd8\u662f\u5f00\u53d1\u4eba\u5458\uff0c\u8fd9\u4e9b\u5de5\u5177\u90fd\u5c06\u5927\u5e45\u63d0\u5347\u60a8\u7684\u5de5\u4f5c\u6548\u7387\u3002\n\n## \ud83d\udcca \u8c03\u8bd5\u5de5\u5177\u5206\u7c7b\n\n### 1. \u534f\u8bae\u5206\u6790\u4e0e\u76d1\u63a7\u5de5\u5177\n\n### 2. \u8bbe\u5907\u6d4b\u8bd5\u4e0e\u6a21\u62df\u5de5\u5177\n\n### 3. \u547d\u4ee4\u884c\u5b9e\u7528\u5de5\u5177\n\n### 4. \u53ef\u89c6\u5316\u8c03\u8bd5\u5de5\u5177\n\n### 5. \u6027\u80fd\u5206\u6790\u4e0e\u4f18\u5316\u5de5\u5177\n\n## \ud83d\udd0d \u534f\u8bae\u5206\u6790\u4e0e\u76d1\u63a7\u5de5\u5177\n\n### 1. Wireshark - \u7f51\u7edc\u534f\u8bae\u5206\u6790\u4e4b\u738b\n\n**\u9879\u76ee\u5730\u5740**: http:\/\/www.wireshark.org\/\n\n#### \u6838\u5fc3\u529f\u80fd\u7279\u6027\n\n- **\u6df1\u5ea6\u62a5\u6587\u89e3\u6790**: \u5b8c\u6574\u7684Modbus TCP\/RTU\u89e3\u7801\n- **\u5b9e\u65f6\u6d41\u91cf\u76d1\u63a7**: \u6355\u83b7\u548c\u5206\u6790\u7f51\u7edc\u901a\u4fe1\n- **\u8fc7\u6ee4\u4e0e\u641c\u7d22**: \u5f3a\u5927\u7684\u663e\u793a\u8fc7\u6ee4\u7cfb\u7edf\n- **\u7edf\u8ba1\u4e0e\u5206\u6790**: \u901a\u4fe1\u8d28\u91cf\u5206\u6790\u548c\u62a5\u544a\n\n#### Modbus\u4e13\u7528\u914d\u7f6e\n\n**1. \u6355\u83b7\u8fc7\u6ee4\u5668\u8bbe\u7f6e**\n\n```\n# \u4ec5\u6355\u83b7Modbus TCP\u6d41\u91cf\ntcp port 502\n\n# \u6355\u83b7\u7279\u5b9a\u8bbe\u5907\u7684\u901a\u4fe1\nhost 192.168.1.100 and tcp port 502\n\n# \u6392\u9664\u5e7f\u64ad\u6d41\u91cf\nnot broadcast and not multicast\n\n```\n\n**2. \u663e\u793a\u8fc7\u6ee4\u5668\u89c4\u5219**\n\n```\n# \u57fa\u672c\u8fc7\u6ee4\nmodbus                    # \u6240\u6709Modbus\u6d41\u91cf\nmodbus.func_code == 0x03  # \u4ec5\u8bfb\u53d6\u4fdd\u6301\u5bc4\u5b58\u5668\nmodbus.func_code == 0x10  # \u4ec5\u5199\u5165\u591a\u4e2a\u5bc4\u5b58\u5668\n\n# \u9ad8\u7ea7\u8fc7\u6ee4\nmodbus.unit_id == 1       # \u7279\u5b9a\u4ece\u7ad9\u8bbe\u5907\nmodbus.trans_id == 1234   # \u7279\u5b9a\u4e8b\u52a1ID\ntcp.analysis.flags        # TCP\u5206\u6790\u6807\u5fd7\n\n```\n\n**3. \u7740\u8272\u89c4\u5219\u914d\u7f6e**\n\n```\n# \u6210\u529f\u54cd\u5e94 - \u7eff\u8272\nmodbus &amp;&amp; tcp.flags.ack == 1\n\n# \u9519\u8bef\u54cd\u5e94 - \u7ea2\u8272\nmodbus.excep_code != 0x00\n\n# \u8d85\u65f6\u91cd\u4f20 - \u9ec4\u8272\ntcp.analysis.retransmission\n\n```\n\n#### \u5b9e\u6218\u6848\u4f8b\u5206\u6790\n\n**\u6848\u4f8b1: \u901a\u4fe1\u8d85\u65f6\u95ee\u9898\u6392\u67e5**\n\n```\n1. \u8fc7\u6ee4\u89c4\u5219: tcp.analysis.flags &amp;&amp; !tcp.analysis.ack_rtt\n2. \u5206\u6790\u6b65\u9aa4:\n   - \u68c0\u67e5SYN-ACK\u5f80\u8fd4\u65f6\u95f4\n   - \u8bc6\u522b\u91cd\u4f20\u62a5\u6587\n   - \u5206\u6790\u7f51\u7edc\u5ef6\u8fdf\u539f\u56e0\n3. \u89e3\u51b3\u65b9\u6848:\n   - \u8c03\u6574TCP\u8d85\u65f6\u53c2\u6570\n   - \u4f18\u5316\u7f51\u7edc\u62d3\u6251\n   - \u589e\u52a0\u5fc3\u8df3\u673a\u5236\n\n```\n\n**\u6848\u4f8b2: \u6570\u636e\u4e00\u81f4\u6027\u9a8c\u8bc1**\n\n```\n1. \u8fc7\u6ee4\u89c4\u5219: modbus.func_code == 0x03 || modbus.func_code == 0x10\n2. \u9a8c\u8bc1\u65b9\u6cd5:\n   - \u5bf9\u6bd4\u8bf7\u6c42\u548c\u54cd\u5e94\u6570\u636e\n   - \u68c0\u67e5\u5bc4\u5b58\u5668\u5730\u5740\u8fde\u7eed\u6027\n   - \u9a8c\u8bc1\u6570\u636e\u5b57\u8282\u987a\u5e8f\n3. \u5e38\u89c1\u95ee\u9898:\n   - \u5b57\u8282\u5e8f\u9519\u8bef (Big-endian vs Little-endian)\n   - \u5730\u5740\u504f\u79fb\u8ba1\u7b97\u9519\u8bef\n   - \u6570\u636e\u7c7b\u578b\u8f6c\u6362\u95ee\u9898\n\n```\n\n### 2. CAS Modbus\u5de5\u5177\u96c6\n\n**\u9879\u76ee\u5730\u5740**: https:\/\/store.chipkin.com\/products\/tools\n\n#### 2.1 Modbus RTU Parser\n\n**\u529f\u80fd\u7279\u70b9**:\n\n- \u5341\u516d\u8fdb\u5236\u62a5\u6587\u5b9e\u65f6\u89e3\u6790\n\n- \u652f\u6301\u6240\u6709\u6807\u51c6\u529f\u80fd\u7801\n\n- \u9519\u8bef\u68c0\u6d4b\u548c\u8bca\u65ad\n\n- \u6570\u636e\u683c\u5f0f\u8f6c\u6362\n\n**\u4f7f\u7528\u793a\u4f8b**:\n\n```\n\u539f\u59cb\u62a5\u6587: 01 03 00 00 00 0A C5 CD\n\u89e3\u6790\u7ed3\u679c:\n\u251c\u2500\u2500 \u8bbe\u5907\u5730\u5740: 01\n\u251c\u2500\u2500 \u529f\u80fd\u7801: 03 (\u8bfb\u53d6\u4fdd\u6301\u5bc4\u5b58\u5668)\n\u251c\u2500\u2500 \u8d77\u59cb\u5730\u5740: 0x0000\n\u251c\u2500\u2500 \u5bc4\u5b58\u5668\u6570\u91cf: 10\n\u2514\u2500\u2500 CRC\u6821\u9a8c: 0xC5CD (\u6b63\u786e)\n\n```\n\n#### 2.2 Modbus TCP Parser\n\n**\u9ad8\u7ea7\u7279\u6027**:\n\n- TCP\u4f1a\u8bdd\u91cd\u7ec4\n\n- \u4e8b\u52a1ID\u8ddf\u8e2a\n\n- \u534f\u8bae\u7248\u672c\u8bc6\u522b\n\n- \u6027\u80fd\u7edf\u8ba1\n\n#### 2.3 Modbus Scanner\n\n**\u626b\u63cf\u529f\u80fd**:\n\n```\n# \u8bbe\u5907\u53d1\u73b0\u626b\u63cf\nmodbus-scanner -t tcp -a 1-247 -r 1-100 192.168.1.0\/24\n\n# \u529f\u80fd\u7801\u652f\u6301\u68c0\u6d4b\nmodbus-scanner -t rtu -p \/dev\/ttyUSB0 -b 9600 -f all\n\n# \u5bc4\u5b58\u5668\u6620\u5c04\u626b\u63cf\nmodbus-scanner -m mapping -s 0 -e 65535 -d 1\n\n```\n\n## \ud83e\uddea \u8bbe\u5907\u6d4b\u8bd5\u4e0e\u6a21\u62df\u5de5\u5177\n\n### 3. Modbus Poll - Windows\u4e13\u4e1a\u8c03\u8bd5\u5de5\u5177\n\n**\u9879\u76ee\u5730\u5740**: http:\/\/www.modbustools.com\/\n\n#### \u4e3b\u8981\u529f\u80fd\u6a21\u5757\n\n**1. \u591a\u8bbe\u5907\u76d1\u63a7\u754c\u9762**\n\n```\n[\u8bbe\u59071] \u6e29\u5ea6\u4f20\u611f\u5668 - 192.168.1.101:502\n\u251c\u2500\u2500 \u5bc4\u5b58\u5668 40001: 25.3\u00b0C (\u5b9e\u65f6\u66f4\u65b0)\n\u251c\u2500\u2500 \u5bc4\u5b58\u5668 40002: 60.2% RH\n\u2514\u2500\u2500 \u7ebf\u5708 00001: ON\n\n[\u8bbe\u59072] PLC\u63a7\u5236\u5668 - 192.168.1.102:502\n\u251c\u2500\u2500 \u5bc4\u5b58\u5668 40010: 1200 RPM\n\u251c\u2500\u2500 \u5bc4\u5b58\u5668 40011: 3.2 MPa\n\u2514\u2500\u2500 \u79bb\u6563\u8f93\u5165 10001: TRIGGERED\n\n```\n\n**2. \u6570\u636e\u8bb0\u5f55\u4e0e\u5bfc\u51fa**\n\n```\n# \u81ea\u52a8\u5bfc\u51fa\u914d\u7f6e\n{\n  &quot;export&quot;: {\n    &quot;format&quot;: &quot;csv&quot;,\n    &quot;interval&quot;: 1000,\n    &quot;fields&quot;: [\n      &quot;timestamp&quot;,\n      &quot;device_id&quot;, \n      &quot;register_address&quot;,\n      &quot;value&quot;,\n      &quot;quality&quot;\n    ],\n    &quot;destination&quot;: &quot;C:\/logs\/modbus_data_%Y%m%d.csv&quot;\n  }\n}\n\n```\n\n**3. \u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c**\n\n```\n\/\/ Modbus Poll\u811a\u672c\u793a\u4f8b\nfunction testSequence() {\n    \/\/ 1. \u521d\u59cb\u5316\u8fde\u63a5\n    connect(&quot;192.168.1.100&quot;, 502);\n\n    \/\/ 2. \u57fa\u672c\u529f\u80fd\u6d4b\u8bd5\n    testReadCoils(0, 16, &quot;\u7ebf\u5708\u8bfb\u53d6\u6d4b\u8bd5&quot;);\n    testReadRegisters(40001, 10, &quot;\u5bc4\u5b58\u5668\u8bfb\u53d6\u6d4b\u8bd5&quot;);\n\n    \/\/ 3. \u5199\u5165\u6d4b\u8bd5\n    testWriteCoil(0, true, &quot;\u7ebf\u5708\u5199\u5165\u6d4b\u8bd5&quot;);\n    testWriteRegister(40001, 1234, &quot;\u5bc4\u5b58\u5668\u5199\u5165\u6d4b\u8bd5&quot;);\n\n    \/\/ 4. \u8fb9\u754c\u6d4b\u8bd5\n    testBoundaryConditions();\n\n    \/\/ 5. \u6027\u80fd\u6d4b\u8bd5\n    testPerformance(1000, &quot;1000\u6b21\u8bf7\u6c42\u6027\u80fd\u6d4b\u8bd5&quot;);\n\n    \/\/ \u751f\u6210\u6d4b\u8bd5\u62a5\u544a\n    generateReport(&quot;test_report.html&quot;);\n}\n\n```\n\n#### \u9ad8\u7ea7\u8c03\u8bd5\u529f\u80fd\n\n**1. \u65ad\u70b9\u8c03\u8bd5**\n\n```\n\u8bbe\u7f6e\u65ad\u70b9\u6761\u4ef6:\n- \u7279\u5b9a\u5bc4\u5b58\u5668\u503c\u53d8\u5316\n- \u9519\u8bef\u54cd\u5e94\u53d1\u751f\n- \u901a\u4fe1\u8d85\u65f6\n- \u6570\u636e\u8d8a\u754c\n\n```\n\n**2. \u53d8\u91cf\u76d1\u89c6**\n\n```\n\u76d1\u89c6\u5217\u8868\u914d\u7f6e:\n$temp = [40001]  \/\/ \u6e29\u5ea6\u5bc4\u5b58\u5668\n$speed = [40010] \/\/ \u8f6c\u901f\u5bc4\u5b58\u5668\n$status = [00001] \/\/ \u72b6\u6001\u7ebf\u5708\n\n\u89e6\u53d1\u6761\u4ef6:\nIF $temp &gt; 100 THEN ALERT(&quot;\u6e29\u5ea6\u8fc7\u9ad8!&quot;)\nIF $speed &lt; 500 THEN LOG(&quot;\u8f6c\u901f\u8fc7\u4f4e&quot;)\n\n```\n\n### 4. ModbusPal - Java\u6a21\u62df\u5668\n\n**\u9879\u76ee\u5730\u5740**: http:\/\/modbuspal.sourceforge.net\/\n\n#### \u52a8\u6001\u6570\u636e\u6a21\u62df\n\n**1. \u6570\u5b66\u51fd\u6570\u751f\u6210\u5668**\n\n```\n# \u6e29\u5ea6\u6ce2\u52a8\u6a21\u62df\ndef temperature_simulation(cycle):\n    import math\n    base_temp = 25.0\n    daily_variation = 8.0 * math.sin(2 * math.pi * cycle \/ 86400)\n    random_noise = random.uniform(-0.5, 0.5)\n    return base_temp + daily_variation + random_noise\n\n# \u538b\u529b\u8d8b\u52bf\u6a21\u62df  \ndef pressure_trend(cycle):\n    start_pressure = 100.0\n    trend = 0.01 * (cycle \/ 3600)  # \u6bcf\u5c0f\u65f6\u4e0a\u53470.01\n    fluctuation = 0.5 * math.sin(2 * math.pi * cycle \/ 600)\n    return start_pressure + trend + fluctuation\n\n```\n\n**2. \u8bbe\u5907\u884c\u4e3a\u6a21\u62df**\n\n```\nclass PumpSimulator:\n    def __init__(self):\n        self.running = False\n        self.speed = 0\n        self.pressure = 0\n\n    def update(self, cycle):\n        if self.running:\n            # \u8fd0\u884c\u72b6\u6001\u6a21\u62df\n            self.speed = 1500 + 100 * math.sin(cycle \/ 10)\n            self.pressure = 3.2 + 0.1 * math.sin(cycle \/ 5)\n        else:\n            # \u505c\u6b62\u72b6\u6001\n            self.speed = 0\n            self.pressure = 0\n\n        return {\n            &#39;coils&#39;: {&#39;running&#39;: self.running},\n            &#39;registers&#39;: {\n                &#39;speed&#39;: int(self.speed),\n                &#39;pressure&#39;: int(self.pressure * 100)\n            }\n        }\n\n```\n\n#### \u6d4b\u8bd5\u573a\u666f\u914d\u7f6e\n\n**1. \u6545\u969c\u6ce8\u5165\u6d4b\u8bd5**\n\n```\n&lt;test-scenario name=&quot;\u901a\u4fe1\u6545\u969c\u6d4b\u8bd5&quot;&gt;\n    &lt;phase duration=&quot;30s&quot; mode=&quot;normal&quot; \/&gt;\n    &lt;phase duration=&quot;10s&quot; mode=&quot;timeout&quot; error-rate=&quot;100%&quot; \/&gt;\n    &lt;phase duration=&quot;20s&quot; mode=&quot;partial&quot; error-rate=&quot;50%&quot; \/&gt;\n    &lt;phase duration=&quot;30s&quot; mode=&quot;normal&quot; \/&gt;\n&lt;\/test-scenario&gt;\n\n```\n\n**2. \u8d1f\u8f7d\u538b\u529b\u6d4b\u8bd5**\n\n```\nload-test:\n  clients: 50\n  requests-per-second: 100\n  duration: 300s\n  ramp-up: 30s\n  metrics:\n    - response-time\n    - throughput  \n    - error-rate\n    - cpu-usage\n    - memory-usage\n\n```\n\n### 5. \u66f4\u65b0\u7248Free Modbus Simulator\n\n**\u9879\u76ee\u5730\u5740**: https:\/\/sourceforge.net\/projects\/modrssim2\/\n\n#### \u7279\u8272\u529f\u80fd\n\n**1. \u5b8c\u6574\u5730\u5740\u7a7a\u95f4\u652f\u6301**\n\n```\n\u652f\u6301\u6240\u6709Modbus\u5730\u5740\u7c7b\u578b:\n- 0xxxx: \u7ebf\u5708 (000001-065536)\n- 1xxxx: \u79bb\u6563\u8f93\u5165 (100001-165536)  \n- 3xxxx: \u8f93\u5165\u5bc4\u5b58\u5668 (300001-365536)\n- 4xxxx: \u4fdd\u6301\u5bc4\u5b58\u5668 (400001-465536)\n\n```\n\n**2. CSV\u6570\u636e\u5bfc\u5165\u5bfc\u51fa**\n\n```\n# \u5bc4\u5b58\u5668\u914d\u7f6e\u793a\u4f8b\naddress,type,value,description,min,max,unit\n40001,float,25.3,\u6e29\u5ea6\u4f20\u611f\u5668,0,100,\u00b0C\n40003,int32,1200,\u7535\u673a\u8f6c\u901f,0,3000,RPM\n40005,uint16,60,\u6e7f\u5ea6\u767e\u5206\u6bd4,0,100,%\n40007,bool,1,\u8bbe\u5907\u72b6\u6001,0,1,ON\/OFF\n\n```\n\n**3. \u811a\u672c\u6d4b\u8bd5\u73af\u5883**\n\n```\n-- Lua\u6d4b\u8bd5\u811a\u672c\u793a\u4f8b\nfunction test_sequence()\n    -- \u521d\u59cb\u5316\u6d4b\u8bd5\n    print(&quot;\u5f00\u59cbModbus\u8bbe\u5907\u6d4b\u8bd5...&quot;)\n\n    -- \u6d4b\u8bd51: \u57fa\u672c\u901a\u4fe1\n    local result1 = test_communication()\n    assert(result1, &quot;\u57fa\u672c\u901a\u4fe1\u6d4b\u8bd5\u5931\u8d25&quot;)\n\n    -- \u6d4b\u8bd52: \u6570\u636e\u8bfb\u5199\n    local result2 = test_data_access()\n    assert(result2, &quot;\u6570\u636e\u8bbf\u95ee\u6d4b\u8bd5\u5931\u8d25&quot;)\n\n    -- \u6d4b\u8bd53: \u8fb9\u754c\u6761\u4ef6\n    local result3 = test_boundary_conditions()\n    assert(result3, &quot;\u8fb9\u754c\u6761\u4ef6\u6d4b\u8bd5\u5931\u8d25&quot;)\n\n    -- \u6d4b\u8bd54: \u6027\u80fd\u6d4b\u8bd5\n    local result4 = test_performance()\n    assert(result4, &quot;\u6027\u80fd\u6d4b\u8bd5\u5931\u8d25&quot;)\n\n    print(&quot;\u6240\u6709\u6d4b\u8bd5\u901a\u8fc7!&quot;)\n    return true\nend\n\n```\n\n## \u2328\ufe0f \u547d\u4ee4\u884c\u5b9e\u7528\u5de5\u5177\n\n### 6. Modpoll - \u591a\u529f\u80fd\u547d\u4ee4\u884c\u5de5\u5177\n\n**\u9879\u76ee\u5730\u5740**: http:\/\/www.focus-sw.com\/fieldtalk\/modpoll.html\n\n#### \u5b8c\u6574\u547d\u4ee4\u53c2\u8003\n\n**\u57fa\u672c\u8bed\u6cd5**:\n\n```\nmodpoll [\u9009\u9879] &lt;\u4e3b\u673a\u540d\u6216IP\u5730\u5740&gt;\n\n```\n\n**\u5e38\u7528\u9009\u9879\u7ec4\u5408**:\n\n**1. \u8bbe\u5907\u53d1\u73b0\u4e0e\u626b\u63cf**\n\n```\n# \u626b\u63cf\u7f51\u7edc\u4e2d\u7684Modbus\u8bbe\u5907\nmodpoll -m tcp -a 1-247 -t 3 -r 1 -c 1 192.168.1.0\/24\n\n# \u626b\u63cf\u4e32\u53e3\u8bbe\u5907\nmodpoll -m rtu -a 1-247 -p \/dev\/ttyUSB0 -b 9600 -t 3 -r 1\n\n# \u5feb\u901f\u8bbe\u5907\u8bc6\u522b\nmodpoll -m tcp -a 1-10 -t 0x2B -r 0 -c 2 192.168.1.100\n\n```\n\n**2. \u6570\u636e\u8bfb\u53d6\u64cd\u4f5c**\n\n```\n# \u8bfb\u53d6\u4fdd\u6301\u5bc4\u5b58\u5668 (\u529f\u80fd\u780103)\nmodpoll -m tcp -t 4 -r 40001 -c 10 192.168.1.100\n\n# \u8bfb\u53d6\u8f93\u5165\u5bc4\u5b58\u5668 (\u529f\u80fd\u780104)\nmodpoll -m tcp -t 3 -r 30001 -c 5 192.168.1.100\n\n# \u8bfb\u53d6\u7ebf\u5708\u72b6\u6001 (\u529f\u80fd\u780101)\nmodpoll -m tcp -t 0 -r 1 -c 16 192.168.1.100\n\n# \u8bfb\u53d6\u79bb\u6563\u8f93\u5165 (\u529f\u80fd\u780102)\nmodpoll -m tcp -t 1 -r 10001 -c 8 192.168.1.100\n\n```\n\n**3. \u6570\u636e\u5199\u5165\u64cd\u4f5c**\n\n```\n# \u5199\u5165\u5355\u4e2a\u5bc4\u5b58\u5668 (\u529f\u80fd\u780106)\nmodpoll -m tcp -t 4:hex -r 40001 -c 1 192.168.1.100 0x1388\n\n# \u5199\u5165\u591a\u4e2a\u5bc4\u5b58\u5668 (\u529f\u80fd\u780116)\nmodpoll -m tcp -t 4:hex -r 40010 -c 3 192.168.1.100 0x0001 0x0002 0x0003\n\n# \u5199\u5165\u5355\u4e2a\u7ebf\u5708 (\u529f\u80fd\u780105)\nmodpoll -m tcp -t 0 -r 1 -c 1 192.168.1.100 ON\n\n# \u5199\u5165\u591a\u4e2a\u7ebf\u5708 (\u529f\u80fd\u780115)\nmodpoll -m tcp -t 0 -r 1 -c 8 192.168.1.100 ON OFF ON OFF ON OFF ON OFF\n\n```\n\n**4. \u8f6e\u8be2\u4e0e\u76d1\u63a7**\n\n```\n# \u5b9a\u65f6\u8f6e\u8be2\u663e\u793a\nmodpoll -m tcp -t 4 -r 40001 -c 5 -p 1000 -1 192.168.1.100\n\n# \u6570\u636e\u8bb0\u5f55\u5230\u6587\u4ef6\nmodpoll -m tcp -t 4 -r 40001 -c 3 -p 5000 -l modbus_log.csv 192.168.1.100\n\n# \u53d8\u5316\u89e6\u53d1\u52a8\u4f5c\nmodpoll -m tcp -t 4 -r 40001 -c 1 -p 1000 -T 25 -c &quot;alert.sh&quot; 192.168.1.100\n\n```\n\n**5. \u9ad8\u7ea7\u683c\u5f0f\u8f93\u51fa**\n\n```\n# CSV\u683c\u5f0f\u8f93\u51fa\nmodpoll -m tcp -t 4 -r 40001 -c 10 -f c 192.168.1.100\n\n# JSON\u683c\u5f0f\u8f93\u51fa\nmodpoll -m tcp -t 4 -r 40001 -c 5 -f j 192.168.1.100\n\n# \u81ea\u5b9a\u4e49\u683c\u5f0f\nmodpoll -m tcp -t 4 -r 40001 -c 3 -f &quot;Address: %a, Value: %v&quot; 192.168.1.100\n\n```\n\n**6. \u6279\u91cf\u64cd\u4f5c\u811a\u672c**\n\n```\n#!\/bin\/bash\n# modpoll\u6279\u91cf\u6d4b\u8bd5\u811a\u672c\n\nDEVICE=&quot;192.168.1.100&quot;\nLOG_FILE=&quot;test_$(date +%Y%m%d_%H%M%S).log&quot;\n\necho &quot;\u5f00\u59cbModbus\u8bbe\u5907\u6d4b\u8bd5...&quot; | tee -a $LOG_FILE\n\n# \u6d4b\u8bd51: \u57fa\u672c\u8fde\u63a5\necho &quot;\u6d4b\u8bd51: \u57fa\u672c\u8fde\u63a5\u6d4b\u8bd5&quot; | tee -a $LOG_FILE\nmodpoll -m tcp -a 1 -t 3 -r 30001 -c 1 $DEVICE &gt;&gt; $LOG_FILE 2&gt;&amp;1\ncheck_result $? &quot;\u57fa\u672c\u8fde\u63a5&quot;\n\n# \u6d4b\u8bd52: \u5bc4\u5b58\u5668\u8bfb\u5199\necho &quot;\u6d4b\u8bd52: \u5bc4\u5b58\u5668\u8bfb\u5199\u6d4b\u8bd5&quot; | tee -a $LOG_FILE\nmodpoll -m tcp -a 1 -t 4 -r 40001 -c 5 $DEVICE &gt;&gt; $LOG_FILE 2&gt;&amp;1\ncheck_result $? &quot;\u5bc4\u5b58\u5668\u8bfb\u53d6&quot;\n\n# \u6d4b\u8bd53: \u6027\u80fd\u6d4b\u8bd5\necho &quot;\u6d4b\u8bd53: \u6027\u80fd\u6d4b\u8bd5&quot; | tee -a $LOG_FILE\nfor i in {1..100}; do\n    modpoll -m tcp -a 1 -t 4 -r 40001 -c 1 $DEVICE &gt; \/dev\/null 2&gt;&amp;1\ndone\necho &quot;100\u6b21\u8bf7\u6c42\u5b8c\u6210&quot; | tee -a $LOG_FILE\n\n# \u751f\u6210\u6d4b\u8bd5\u62a5\u544a\ngenerate_report $LOG_FILE\n\n```\n\n#### \u6545\u969c\u6392\u67e5\u7528\u4f8b\n\n**\u7528\u4f8b1: \u901a\u4fe1\u8d85\u65f6\u8bca\u65ad**\n\n```\n# \u589e\u52a0\u8d85\u65f6\u65f6\u95f4\u67e5\u770b\u54cd\u5e94\nmodpoll -m tcp -t 4 -r 40001 -c 1 -o 5000 192.168.1.100\n\n# \u542f\u7528\u8be6\u7ec6\u65e5\u5fd7\nmodpoll -m tcp -t 4 -r 40001 -c 1 -v 192.168.1.100\n\n# \u6d4b\u8bd5\u4e0d\u540c\u6570\u636e\u91cf\nfor size in 1 10 50 100 125; do\n    echo &quot;\u6d4b\u8bd5 $size \u4e2a\u5bc4\u5b58\u5668...&quot;\n    modpoll -m tcp -t 4 -r 40001 -c $size -o 3000 192.168.1.100\ndone\n\n```\n\n**\u7528\u4f8b2: \u6570\u636e\u4e00\u81f4\u6027\u9a8c\u8bc1**\n\n```\n# \u591a\u6b21\u8bfb\u53d6\u9a8c\u8bc1\u7a33\u5b9a\u6027\nfor i in {1..10}; do\n    echo &quot;\u7b2c $i \u6b21\u8bfb\u53d6:&quot;\n    modpoll -m tcp -t 4 -r 40001 -c 3 -f c 192.168.1.100\n    sleep 1\ndone\n\n# \u5199\u5165\u540e\u7acb\u5373\u8bfb\u53d6\u9a8c\u8bc1\nmodpoll -m tcp -t 4:hex -r 40010 -c 1 192.168.1.100 0x55AA\nsleep 0.5\nmodpoll -m tcp -t 4 -r 40010 -c 1 192.168.1.100\n\n```\n\n## \ud83d\udda5\ufe0f \u53ef\u89c6\u5316\u8c03\u8bd5\u5de5\u5177\n\n### 7. Modbus Constructor\n\n**\u9879\u76ee\u5730\u5740**: http:\/\/www.kurysoft.com\/download.shtml\n\n#### \u4e3b\u8981\u529f\u80fd\u6a21\u5757\n\n**1. \u8bbe\u5907\u5efa\u6a21\u5de5\u5177**\n\n```\n\u8bbe\u5907\u6a21\u578b\u7ed3\u6784:\n\u251c\u2500\u2500 \u901a\u4fe1\u53c2\u6570\n\u2502   \u251c\u2500\u2500 \u534f\u8bae: RTU\/TCP\/ASCII\n\u2502   \u251c\u2500\u2500 \u6ce2\u7279\u7387: 9600\/19200\/38400\/115200\n\u2502   \u251c\u2500\u2500 \u6570\u636e\u4f4d: 8\n\u2502   \u251c\u2500\u2500 \u505c\u6b62\u4f4d: 1\/2\n\u2502   \u2514\u2500\u2500 \u6821\u9a8c\u4f4d: None\/Even\/Odd\n\u251c\u2500\u2500 \u6570\u636e\u70b9\u5b9a\u4e49\n\u2502   \u251c\u2500\u2500 \u7ebf\u5708 (0xxxx)\n\u2502   \u251c\u2500\u2500 \u79bb\u6563\u8f93\u5165 (1xxxx)\n\u2502   \u251c\u2500\u2500 \u8f93\u5165\u5bc4\u5b58\u5668 (3xxxx)\n\u2502   \u2514\u2500\u2500 \u4fdd\u6301\u5bc4\u5b58\u5668 (4xxxx)\n\u2514\u2500\u2500 \u6570\u636e\u6620\u5c04\n    \u251c\u2500\u2500 \u7f29\u653e\u56e0\u5b50\n    \u251c\u2500\u2500 \u504f\u79fb\u91cf\n    \u251c\u2500\u2500 \u6570\u636e\u7c7b\u578b\n    \u2514\u2500\u2500 \u5de5\u7a0b\u5355\u4f4d\n\n```\n\n**2. Modbus Reader - \u514d\u8d39\u8bfb\u53d6\u5de5\u5177**\n\n```\n\u5b9e\u65f6\u76d1\u63a7\u754c\u9762:\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\u8bbe\u5907: \u6e29\u5ea6\u63a7\u5236\u5668 [192.168.1.101:502]\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\u5730\u5740      \u540d\u79f0          \u503c     \u5355\u4f4d   \u72b6\u6001\n40001     \u6e29\u5ea6        25.3    \u00b0C     \u2705\n40002     \u6e7f\u5ea6        60.2    %      \u2705  \n40003     \u538b\u529b        101.3   kPa    \u2705\n00001     \u52a0\u70ed\u5668       ON            \u2705\n10001     \u62a5\u8b66         OFF           \u2705\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\u66f4\u65b0\u65f6\u95f4: 2026-02-24 17:15:32\n\u901a\u4fe1\u72b6\u6001: \u6b63\u5e38 (\u5ef6\u8fdf: 12ms)\n\n```\n\n### 8. Mango M2M - \u6d4f\u89c8\u5668\u76d1\u63a7\u5e73\u53f0\n\n**\u9879\u76ee\u5730\u5740**: http:\/\/mango.serotoninsoftware.com\/\n\n#### Web\u76d1\u63a7\u7279\u6027\n\n**1. \u591a\u534f\u8bae\u652f\u6301**\n\n- Modbus TCP\/RTU\/ASCII\n\n- OPC UA\/DA\n\n- SNMP\n\n- HTTP\/REST\n\n- \u81ea\u5b9a\u4e49\u534f\u8bae\n\n**2. \u4eea\u8868\u76d8\u914d\u7f6e**\n\n```\n{\n  &quot;dashboard&quot;: {\n    &quot;title&quot;: &quot;\u751f\u4ea7\u7ebf\u76d1\u63a7&quot;,\n    &quot;widgets&quot;: [\n      {\n        &quot;type&quot;: &quot;gauge&quot;,\n        &quot;title&quot;: &quot;\u6e29\u5ea6\u76d1\u63a7&quot;,\n        &quot;dataSource&quot;: &quot;modbus:\/\/192.168.1.101\/40001&quot;,\n        &quot;min&quot;: 0,\n        &quot;max&quot;: 100,\n        &quot;warning&quot;: 80,\n        &quot;critical&quot;: 90\n      },\n      {\n        &quot;type&quot;: &quot;chart&quot;,\n        &quot;title&quot;: &quot;\u5386\u53f2\u8d8b\u52bf&quot;,\n        &quot;dataSources&quot;: [\n          &quot;modbus:\/\/192.168.1.101\/40001&quot;,\n          &quot;modbus:\/\/192.168.1.101\/40002&quot;\n        ],\n        &quot;period&quot;: &quot;24h&quot;\n      }\n    ]\n  }\n}\n\n```\n\n**3. \u62a5\u8b66\u4e0e\u901a\u77e5**\n\n```\n\/\/ \u62a5\u8b66\u89c4\u5219\u914d\u7f6e\nalarmRules: [\n  {\n    name: &quot;\u9ad8\u6e29\u62a5\u8b66&quot;,\n    condition: &quot;temperature &gt; 80&quot;,\n    actions: [\n      &quot;sendEmail(&#39;operator@factory.com&#39;, &#39;\u9ad8\u6e29\u62a5\u8b66&#39;)&quot;,\n      &quot;sendSMS(&#39;+8613800138000&#39;, &#39;\u8bbe\u5907\u6e29\u5ea6\u8fc7\u9ad8&#39;)&quot;,\n      &quot;logEvent(&#39;high_temperature_alarm&#39;)&quot;\n    ],\n    severity: &quot;CRITICAL&quot;\n  },\n  {\n    name: &quot;\u901a\u4fe1\u4e2d\u65ad&quot;,\n    condition: &quot;deviceStatus == &#39;OFFLINE&#39;&quot;,\n    actions: [\n      &quot;notifyMaintenanceTeam()&quot;,\n      &quot;startBackupSystem()&quot;\n    ],\n    severity: &quot;HIGH&quot;\n  }\n]\n\n```\n\n## \ud83d\udcc8 \u6027\u80fd\u5206\u6790\u4e0e\u4f18\u5316\u5de5\u5177\n\n### 9. \u81ea\u5b9a\u4e49\u6027\u80fd\u76d1\u63a7\u811a\u672c\n\n#### Python\u6027\u80fd\u5206\u6790\u5de5\u5177\n\n```\n#!\/usr\/bin\/env python3\n&quot;&quot;&quot;\nModbus\u6027\u80fd\u5206\u6790\u5de5\u5177\n&quot;&quot;&quot;\n\nimport time\nimport statistics\nfrom datetime import datetime\nimport matplotlib.pyplot as plt\nfrom pymodbus.client import ModbusTcpClient\n\nclass ModbusPerformanceAnalyzer:\n    def __init__(self, host, port=502):\n        self.client = ModbusTcpClient(host, port)\n        self.metrics = {\n            &#39;response_times&#39;: [],\n            &#39;success_count&#39;: 0,\n            &#39;error_count&#39;: 0,\n            &#39;start_time&#39;: None,\n            &#39;end_time&#39;: None\n        }\n\n    def run_test(self, duration=60, requests_per_second=10):\n        &quot;&quot;&quot;\u8fd0\u884c\u6027\u80fd\u6d4b\u8bd5&quot;&quot;&quot;\n        self.metrics[&#39;start_time&#39;] = datetime.now()\n\n        total_requests = duration * requests_per_second\n        interval = 1.0 \/ requests_per_second\n\n        for i in range(total_requests):\n            start = time.time()\n\n            try:\n                # \u6267\u884cModbus\u8bf7\u6c42\n                result = self.client.read_holding_registers(40001, 10)\n\n                if result.isError():\n                    self.metrics[&#39;error_count&#39;] += 1\n                else:\n                    self.metrics[&#39;success_count&#39;] += 1\n\n            except Exception as e:\n                self.metrics[&#39;error_count&#39;] += 1\n                print(f&quot;\u8bf7\u6c42 {i+1} \u5931\u8d25: {e}&quot;)\n\n            response_time = (time.time() - start) * 1000  # \u8f6c\u6362\u4e3a\u6beb\u79d2\n            self.metrics[&#39;response_times&#39;].append(response_time)\n\n            # \u63a7\u5236\u8bf7\u6c42\u9891\u7387\n            elapsed = time.time() - start\n            if elapsed &lt; interval:\n                time.sleep(interval - elapsed)\n\n        self.metrics[&#39;end_time&#39;] = datetime.now()\n        return self.metrics\n\n    def generate_report(self):\n        &quot;&quot;&quot;\u751f\u6210\u6027\u80fd\u62a5\u544a&quot;&quot;&quot;\n        if not self.metrics[&#39;response_times&#39;]:\n            return &quot;\u6ca1\u6709\u6d4b\u8bd5\u6570\u636e&quot;\n\n        rt = self.metrics[&#39;response_times&#39;]\n\n        report = f&quot;&quot;&quot;\nModbus\u6027\u80fd\u6d4b\u8bd5\u62a5\u544a\n==================\n\u6d4b\u8bd5\u65f6\u95f4: {self.metrics[&#39;start_time&#39;]} - {self.metrics[&#39;end_time&#39;]}\n\u603b\u8bf7\u6c42\u6570: {len(rt)}\n\u6210\u529f\u8bf7\u6c42: {self.metrics[&#39;success_count&#39;]}\n\u5931\u8d25\u8bf7\u6c42: {self.metrics[&#39;error_count&#39;]}\n\u6210\u529f\u7387: {(self.metrics[&#39;success_count&#39;] \/ len(rt)) * 100:.2f}%\n\n\u54cd\u5e94\u65f6\u95f4\u7edf\u8ba1 (\u6beb\u79d2):\n- \u5e73\u5747\u503c: {statistics.mean(rt):.2f}\n- \u4e2d\u4f4d\u6570: {statistics.median(rt):.2f}\n- \u6700\u5c0f\u503c: {min(rt):.2f}\n- \u6700\u5927\u503c: {max(rt):.2f}\n- \u6807\u51c6\u5dee: {statistics.stdev(rt):.2f}\n- 95\u767e\u5206\u4f4d: {sorted(rt)[int(len(rt) * 0.95)]:.2f}\n- 99\u767e\u5206\u4f4d: {sorted(rt)[int(len(rt) * 0.99)]:.2f}\n\n\u5efa\u8bae:\n&quot;&quot;&quot;\n\n        avg_rt = statistics.mean(rt)\n        if avg_rt &lt; 10:\n            report += &quot;- \u6027\u80fd\u4f18\u79c0\uff0c\u65e0\u9700\u4f18\u5316\\n&quot;\n        elif avg_rt &lt; 50:\n            report += &quot;- \u6027\u80fd\u826f\u597d\uff0c\u53ef\u8003\u8651\u5c0f\u89c4\u6a21\u4f18\u5316\\n&quot;\n        elif avg_rt &lt; 100:\n            report += &quot;- \u6027\u80fd\u4e00\u822c\uff0c\u5efa\u8bae\u8fdb\u884c\u4f18\u5316\\n&quot;\n        else:\n            report += &quot;- \u6027\u80fd\u8f83\u5dee\uff0c\u9700\u8981\u91cd\u70b9\u4f18\u5316\\n&quot;\n\n        return report\n\n    def plot_results(self, save_path=None):\n        &quot;&quot;&quot;\u7ed8\u5236\u6027\u80fd\u56fe\u8868&quot;&quot;&quot;\n        fig, axes = plt.subplots(2, 2, figsize=(12, 8))\n\n        # \u54cd\u5e94\u65f6\u95f4\u8d8b\u52bf\n        axes[0, 0].plot(self.metrics[&#39;response_times&#39;])\n        axes[0, 0].set_title(&#39;\u54cd\u5e94\u65f6\u95f4\u8d8b\u52bf&#39;)\n        axes[0, 0].set_xlabel(&#39;\u8bf7\u6c42\u5e8f\u53f7&#39;)\n        axes[0, 0].set_ylabel(&#39;\u54cd\u5e94\u65f6\u95f4 (ms)&#39;)\n        axes[0, 0].grid(True)\n\n        # \u54cd\u5e94\u65f6\u95f4\u5206\u5e03\n        axes[0, 1].hist(self.metrics[&#39;response_times&#39;], bins=50, edgecolor=&#39;black&#39;)\n        axes[0, 1].set_title(&#39;\u54cd\u5e94\u65f6\u95f4\u5206\u5e03&#39;)\n        axes[0, 1].set_xlabel(&#39;\u54cd\u5e94\u65f6\u95f4 (ms)&#39;)\n        axes[0, 1].set_ylabel(&#39;\u9891\u6b21&#39;)\n        axes[0, 1].grid(True)\n\n        # \u6210\u529f\u5931\u8d25\u7edf\u8ba1\n        labels = [&#39;\u6210\u529f&#39;, &#39;\u5931\u8d25&#39;]\n        sizes = [self.metrics[&#39;success_count&#39;], self.metrics[&#39;error_count&#39;]]\n        axes[1, 0].pie(sizes, labels=labels, autopct=&#39;%1.1f%%&#39;)\n        axes[1, 0].set_title(&#39;\u8bf7\u6c42\u6210\u529f\u7387&#39;)\n\n        # \u7d2f\u79ef\u5206\u5e03\u51fd\u6570\n        sorted_rt = sorted(self.metrics[&#39;response_times&#39;])\n        cdf = [i\/len(sorted_rt) for i in range(len(sorted_rt))]\n        axes[1, 1].plot(sorted_rt, cdf)\n        axes[1, 1].set_title(&#39;\u54cd\u5e94\u65f6\u95f4CDF&#39;)\n        axes[1, 1].set_xlabel(&#39;\u54cd\u5e94\u65f6\u95f4 (ms)&#39;)\n        axes[1, 1].set_ylabel(&#39;\u7d2f\u79ef\u6982\u7387&#39;)\n        axes[1, 1].grid(True)\n\n        plt.tight_layout()\n\n        if save_path:\n            plt.savefig(save_path, dpi=300)\n            print(f&quot;\u56fe\u8868\u5df2\u4fdd\u5b58\u5230: {save_path}&quot;)\n\n        plt.show()\n\n# \u4f7f\u7528\u793a\u4f8b\nif __name__ == &quot;__main__&quot;:\n    analyzer = ModbusPerformanceAnalyzer(&quot;192.168.1.100&quot;)\n    metrics = analyzer.run_test(duration=30, requests_per_second=20)\n    print(analyzer.generate_report())\n    analyzer.plot_results(&quot;modbus_performance.png&quot;)\n\n```\n\n#### \u6027\u80fd\u4f18\u5316\u5efa\u8bae\n\n**1. \u7f51\u7edc\u5c42\u4f18\u5316**\n\n```\ntcp_optimization:\n  tcp_nodelay: true      # \u7981\u7528Nagle\u7b97\u6cd5\n  tcp_keepalive: true    # \u542f\u7528TCP\u4fdd\u6d3b\n  keepalive_time: 60     # \u4fdd\u6d3b\u65f6\u95f4(\u79d2)\n  keepalive_intvl: 10    # \u4fdd\u6d3b\u95f4\u9694(\u79d2)\n  keepalive_probes: 3    # \u4fdd\u6d3b\u63a2\u6d4b\u6b21\u6570\n\nsocket_options:\n  so_reuseaddr: true     # \u5730\u5740\u91cd\u7528\n  so_rcvbuf: 65536       # \u63a5\u6536\u7f13\u51b2\u533a\u5927\u5c0f\n  so_sndbuf: 65536       # \u53d1\u9001\u7f13\u51b2\u533a\u5927\u5c0f\n\n```\n\n**2. Modbus\u534f\u8bae\u4f18\u5316**\n\n```\n# \u6279\u91cf\u8bfb\u53d6\u4f18\u5316\ndef optimized_read(client, address_ranges):\n    &quot;&quot;&quot;\n    \u4f18\u5316\u8bfb\u53d6\u7b56\u7565\uff1a\n    1. \u5408\u5e76\u76f8\u90bb\u5730\u5740\u7684\u8bfb\u53d6\u8bf7\u6c42\n    2. \u907f\u514d\u8bfb\u53d6\u4e0d\u5fc5\u8981\u7684\u6570\u636e\n    3. \u4f7f\u7528\u5408\u9002\u7684\u8d85\u65f6\u65f6\u95f4\n    &quot;&quot;&quot;\n    results = {}\n\n    for start, count in address_ranges:\n        # \u68c0\u67e5\u662f\u5426\u53ef\u5408\u5e76\n        if can_merge_with_previous(start, count):\n            continue\n\n        try:\n            # \u4f7f\u7528\u5408\u9002\u7684\u8d85\u65f6\n            client.timeout = calculate_timeout(count)\n\n            # \u6267\u884c\u8bfb\u53d6\n            result = client.read_holding_registers(start, count)\n\n            if not result.isError():\n                results[(start, count)] = result.registers\n            else:\n                # \u5931\u8d25\u65f6\u5c1d\u8bd5\u5206\u7247\u8bfb\u53d6\n                results.update(fallback_read(client, start, count))\n\n        except Exception as e:\n            log_error(f&quot;\u8bfb\u53d6\u5931\u8d25 {start}-{start+count}: {e}&quot;)\n\n    return results\n\n```\n\n**3. \u5ba2\u6237\u7aef\u8fde\u63a5\u6c60**\n\n```\nclass ModbusConnectionPool:\n    &quot;&quot;&quot;Modbus\u8fde\u63a5\u6c60\u7ba1\u7406&quot;&quot;&quot;\n\n    def __init__(self, host, port=502, max_connections=10):\n        self.host = host\n        self.port = port\n        self.max_connections = max_connections\n        self.pool = []\n        self.in_use = set()\n\n    def get_connection(self):\n        &quot;&quot;&quot;\u83b7\u53d6\u8fde\u63a5&quot;&quot;&quot;\n        # 1. \u68c0\u67e5\u7a7a\u95f2\u8fde\u63a5\n        for conn in self.pool:\n            if conn not in self.in_use and conn.is_socket_open():\n                self.in_use.add(conn)\n                return conn\n\n        # 2. \u521b\u5efa\u65b0\u8fde\u63a5\n        if len(self.pool) &lt; self.max_connections:\n            conn = ModbusTcpClient(self.host, self.port)\n            self.pool.append(conn)\n            self.in_use.add(conn)\n            return conn\n\n        # 3. \u7b49\u5f85\u8fde\u63a5\u91ca\u653e\n        raise NoAvailableConnection(&quot;\u8fde\u63a5\u6c60\u5df2\u6ee1&quot;)\n\n    def release_connection(self, conn):\n        &quot;&quot;&quot;\u91ca\u653e\u8fde\u63a5&quot;&quot;&quot;\n        if conn in self.in_use:\n            self.in_use.remove(conn)\n\n    def close_all(self):\n        &quot;&quot;&quot;\u5173\u95ed\u6240\u6709\u8fde\u63a5&quot;&quot;&quot;\n        for conn in self.pool:\n            conn.close()\n        self.pool.clear()\n        self.in_use.clear()\n\n```\n\n## \ud83c\udfaf \u5de5\u5177\u9009\u62e9\u77e9\u9635\n\n### \u6309\u4f7f\u7528\u573a\u666f\u9009\u62e9\n\n\u573a\u666f\n\u63a8\u8350\u5de5\u5177\n\u5173\u952e\u7279\u6027\n\u5b66\u4e60\u66f2\u7ebf\n\n**\u534f\u8bae\u5206\u6790**\nWireshark\n\u6df1\u5ea6\u62a5\u6587\u89e3\u6790\uff0c\u5b9e\u65f6\u76d1\u63a7\n\u4e2d\u7b49\n\n**\u8bbe\u5907\u6d4b\u8bd5**\nModbus Poll\n\u56fe\u5f62\u754c\u9762\uff0c\u529f\u80fd\u5b8c\u6574\n\u7b80\u5355\n\n**\u547d\u4ee4\u884c\u64cd\u4f5c**\nModpoll\n\u7075\u6d3b\uff0c\u811a\u672c\u53cb\u597d\n\u7b80\u5355\n\n**\u8bbe\u5907\u6a21\u62df**\nModbusPal\n\u52a8\u6001\u6570\u636e\u751f\u6210\uff0c\u811a\u672c\u652f\u6301\n\u4e2d\u7b49\n\n**\u6027\u80fd\u6d4b\u8bd5**\n\u81ea\u5b9a\u4e49\u811a\u672c\n\u5b8c\u5168\u63a7\u5236\uff0c\u53ef\u5b9a\u5236\n\u4e2d\u7b49\n\n**\u751f\u4ea7\u76d1\u63a7**\nMango M2M\nWeb\u754c\u9762\uff0c\u591a\u534f\u8bae\n\u4e2d\u7b49\n\n**\u5feb\u901f\u8c03\u8bd5**\nModbus Reader\n\u514d\u8d39\uff0c\u7b80\u5355\u6613\u7528\n\u7b80\u5355\n\n### \u6309\u7528\u6237\u89d2\u8272\u9009\u62e9\n\n\u89d2\u8272\n\u4e3b\u8981\u9700\u6c42\n\u63a8\u8350\u5de5\u5177\u7ec4\u5408\n\n**\u73b0\u573a\u5de5\u7a0b\u5e08**\n\u5feb\u901f\u6545\u969c\u6392\u67e5\nModbus Reader + Modpoll\n\n**\u5f00\u53d1\u4eba\u5458**\n\u534f\u8bae\u5b9e\u73b0\u9a8c\u8bc1\nWireshark + ModbusPal\n\n**\u6d4b\u8bd5\u5de5\u7a0b\u5e08**\n\u529f\u80fd\u5b8c\u6574\u6027\u6d4b\u8bd5\nModbus Poll + \u81ea\u5b9a\u4e49\u811a\u672c\n\n**\u7cfb\u7edf\u96c6\u6210\u5546**\n\u591a\u8bbe\u5907\u76d1\u63a7\nMango M2M + Modbus Poll\n\n**\u8fd0\u7ef4\u4eba\u5458**\n\u751f\u4ea7\u73af\u5883\u76d1\u63a7\n\u6027\u80fd\u76d1\u63a7\u811a\u672c + \u62a5\u8b66\u7cfb\u7edf\n\n### \u6210\u672c\u6548\u76ca\u5206\u6790\n\n\u5de5\u5177\n\u6210\u672c\n\u5f00\u6e90\/\u5546\u4e1a\n\u9002\u5408\u89c4\u6a21\n\nWireshark\n\u514d\u8d39\n\u5f00\u6e90\n\u6240\u6709\u89c4\u6a21\n\nModpoll\n\u514d\u8d39\n\u5f00\u6e90\n\u6240\u6709\u89c4\u6a21\n\nModbus Reader\n\u514d\u8d39\n\u514d\u8d39\u8f6f\u4ef6\n\u4e2d\u5c0f\u89c4\u6a21\n\nModbus Poll\n$249\n\u5546\u4e1a\u8f6f\u4ef6\n\u4e13\u4e1a\u7528\u6237\n\nMango M2M\n\u793e\u533a\u7248\u514d\u8d39\n\u5f00\u6e90+\u5546\u4e1a\n\u4f01\u4e1a\u7ea7\n\n\u81ea\u5b9a\u4e49\u811a\u672c\n\u5f00\u53d1\u6210\u672c\n\u81ea\u5b9a\u4e49\n\u7279\u5b9a\u9700\u6c42\n\n## \ud83d\ude80 \u5b9e\u6218\u5de5\u4f5c\u6d41\u7a0b\n\n### \u5178\u578b\u8c03\u8bd5\u6d41\u7a0b\n\n**\u9636\u6bb51: \u95ee\u9898\u8bc6\u522b**\n\n```\n1. \u73b0\u8c61\u6536\u96c6\n   - \u901a\u4fe1\u5b8c\u5168\u4e2d\u65ad\n   - \u6570\u636e\u4e0d\u4e00\u81f4\n   - \u54cd\u5e94\u7f13\u6162\n   - \u95f4\u6b47\u6027\u6545\u969c\n\n2. \u57fa\u672c\u4fe1\u606f\u6536\u96c6\n   - \u7f51\u7edc\u62d3\u6251\n   - \u8bbe\u5907\u578b\u53f7\u548c\u56fa\u4ef6\u7248\u672c\n   - \u914d\u7f6e\u53c2\u6570\n   - \u9519\u8bef\u65e5\u5fd7\n\n```\n\n**\u9636\u6bb52: \u57fa\u7840\u6d4b\u8bd5**\n\n```\n# \u4f7f\u7528modpoll\u8fdb\u884c\u5feb\u901f\u6d4b\u8bd5\n# 1. \u6d4b\u8bd5\u57fa\u672c\u8fde\u63a5\nmodpoll -m tcp -a 1 -t 3 -r 30001 -c 1 192.168.1.100\n\n# 2. \u6d4b\u8bd5\u4e0d\u540c\u529f\u80fd\u7801\nfor func in 1 2 3 4; do\n    echo &quot;\u6d4b\u8bd5\u529f\u80fd\u7801 0x0$func...&quot;\n    modpoll -m tcp -a 1 -t $func -r 1 -c 1 192.168.1.100\ndone\n\n# 3. \u6d4b\u8bd5\u4e0d\u540c\u6570\u636e\u91cf\nfor count in 1 10 50 100; do\n    echo &quot;\u6d4b\u8bd5 $count \u4e2a\u5bc4\u5b58\u5668...&quot;\n    modpoll -m tcp -a 1 -t 4 -r 40001 -c $count 192.168.1.100\ndone\n\n```\n\n**\u9636\u6bb53: \u6df1\u5ea6\u5206\u6790**\n\n```\n1. Wireshark\u6293\u5305\u5206\u6790\n   - \u6355\u83b7\u5b8c\u6574\u901a\u4fe1\u8fc7\u7a0b\n   - \u5206\u6790\u62a5\u6587\u65f6\u5e8f\n   - \u68c0\u67e5\u534f\u8bae\u5408\u89c4\u6027\n\n2. \u8bbe\u5907\u6a21\u62df\u6d4b\u8bd5\n   - \u4f7f\u7528ModbusPal\u6a21\u62df\u6b63\u5e38\u8bbe\u5907\n   - \u5bf9\u6bd4\u5b9e\u9645\u8bbe\u5907\u884c\u4e3a\n   - \u9694\u79bb\u95ee\u9898\u8303\u56f4\n\n3. \u6027\u80fd\u538b\u529b\u6d4b\u8bd5\n   - \u6d4b\u8bd5\u4e0d\u540c\u8d1f\u8f7d\u4e0b\u7684\u8868\u73b0\n   - \u8bc6\u522b\u6027\u80fd\u74f6\u9888\n   - \u9a8c\u8bc1\u7cfb\u7edf\u7a33\u5b9a\u6027\n\n```\n\n**\u9636\u6bb54: \u89e3\u51b3\u65b9\u6848\u5b9e\u65bd**\n\n```\n1. \u914d\u7f6e\u4f18\u5316\n   - \u8c03\u6574\u8d85\u65f6\u53c2\u6570\n   - \u4f18\u5316\u626b\u63cf\u9891\u7387\n   - \u914d\u7f6e\u91cd\u8bd5\u673a\u5236\n\n2. \u4ee3\u7801\u4fee\u590d\n   - \u4fee\u590d\u534f\u8bae\u5b9e\u73b0\u9519\u8bef\n   - \u4f18\u5316\u6570\u636e\u5904\u7406\u903b\u8f91\n   - \u589e\u5f3a\u9519\u8bef\u5904\u7406\n\n3. \u76d1\u63a7\u90e8\u7f72\n   - \u90e8\u7f72\u6301\u7eed\u76d1\u63a7\n   - \u8bbe\u7f6e\u62a5\u8b66\u89c4\u5219\n   - \u5efa\u7acb\u7ef4\u62a4\u6d41\u7a0b\n\n```\n\n## \ud83d\udcda \u5b66\u4e60\u8def\u5f84\u5efa\u8bae\n\n### \u521d\u5b66\u8005\u8def\u5f84 (0-3\u4e2a\u6708)\n\n- **\u57fa\u7840\u638c\u63e1**: Modbus Reader + Modpoll\n- **\u534f\u8bae\u7406\u89e3**: \u9605\u8bfbModbus\u534f\u8bae\u89c4\u8303\n- **\u7b80\u5355\u6d4b\u8bd5**: \u4f7f\u7528\u73b0\u6709\u5de5\u5177\u8fdb\u884c\u57fa\u672c\u6d4b\u8bd5\n- **\u95ee\u9898\u6392\u67e5**: \u5b66\u4e60\u5e38\u89c1\u95ee\u9898\u89e3\u51b3\u65b9\u6cd5\n\n### \u4e2d\u7ea7\u7528\u6237\u8def\u5f84 (3-12\u4e2a\u6708)\n\n- **\u6df1\u5ea6\u5206\u6790**: \u638c\u63e1Wireshark\u9ad8\u7ea7\u529f\u80fd\n- **\u81ea\u52a8\u5316\u6d4b\u8bd5**: \u5b66\u4e60\u811a\u672c\u7f16\u5199\u548c\u81ea\u52a8\u5316\n- **\u6027\u80fd\u4f18\u5316**: \u7406\u89e3\u6027\u80fd\u5f71\u54cd\u56e0\u7d20\u548c\u4f18\u5316\u65b9\u6cd5\n- **\u7cfb\u7edf\u96c6\u6210**: \u5b66\u4e60\u591a\u8bbe\u5907\u76d1\u63a7\u548c\u7ba1\u7406\n\n### \u9ad8\u7ea7\u4e13\u5bb6\u8def\u5f84 (1\u5e74\u4ee5\u4e0a)\n\n- **\u5b9a\u5236\u5f00\u53d1**: \u6839\u636e\u9700\u6c42\u5f00\u53d1\u4e13\u7528\u5de5\u5177\n- **\u67b6\u6784\u8bbe\u8ba1**: \u8bbe\u8ba1\u5927\u89c4\u6a21Modbus\u7cfb\u7edf\u67b6\u6784\n- **\u6545\u969c\u9884\u6d4b**: \u5efa\u7acb\u667a\u80fd\u6545\u969c\u9884\u6d4b\u7cfb\u7edf\n- **\u6807\u51c6\u8d21\u732e**: \u53c2\u4e0eModbus\u76f8\u5173\u6807\u51c6\u5236\u5b9a\u548c\u5de5\u5177\u5f00\u53d1\n\n## \ud83d\udd2e \u672a\u6765\u53d1\u5c55\u8d8b\u52bf\n\n### 1. \u4e91\u5316\u4e0eSaaS\u670d\u52a1\n\n- **\u4e91\u7aef\u8c03\u8bd5\u5e73\u53f0**: \u57fa\u4e8eWeb\u7684\u8fdc\u7a0b\u8c03\u8bd5\u5de5\u5177\n- **\u534f\u4f5c\u529f\u80fd**: \u591a\u5de5\u7a0b\u5e08\u534f\u540c\u8c03\u8bd5\n- **AI\u8f85\u52a9**: \u667a\u80fd\u6545\u969c\u8bca\u65ad\u548c\u5efa\u8bae\n\n### 2. \u7269\u8054\u7f51\u96c6\u6210\n\n- **MQTT\u6865\u63a5**: Modbus\u5230MQTT\u7684\u900f\u660e\u8f6c\u6362\n- **\u8fb9\u7f18\u8ba1\u7b97**: \u672c\u5730\u6570\u636e\u5904\u7406\u548c\u51b3\u7b56\n- **5G\u652f\u6301**: \u4f4e\u5ef6\u8fdf\u8fdc\u7a0b\u8bbf\u95ee\n\n### 3. \u5b89\u5168\u6027\u589e\u5f3a\n\n- **\u52a0\u5bc6\u901a\u4fe1**: TLS\/SSL\u652f\u6301\n- **\u8bbf\u95ee\u63a7\u5236**: \u57fa\u4e8e\u89d2\u8272\u7684\u6743\u9650\u7ba1\u7406\n- **\u5ba1\u8ba1\u65e5\u5fd7**: \u5b8c\u6574\u7684\u64cd\u4f5c\u8bb0\u5f55\n\n### 4. \u5f00\u53d1\u4f53\u9a8c\u6539\u8fdb\n\n- **IDE\u96c6\u6210**: \u5f00\u53d1\u73af\u5883\u63d2\u4ef6\n- **\u81ea\u52a8\u5316\u6d4b\u8bd5**: CI\/CD\u6d41\u6c34\u7ebf\u96c6\u6210\n- **\u6587\u6863\u751f\u6210**: \u81ea\u52a8\u751f\u6210\u8bbe\u5907\u6587\u6863\n\n## \ud83d\udca1 \u6700\u4f73\u5b9e\u8df5\u603b\u7ed3\n\n### \u5de5\u5177\u914d\u7f6e\u6700\u4f73\u5b9e\u8df5\n\n**\u6807\u51c6\u5316\u914d\u7f6e\u7ba1\u7406**\n\nyaml\n   tool_configuration:\n     default_timeout: 3000    # 3\u79d2\u8d85\u65f6\n     retry_count: 3          # \u91cd\u8bd53\u6b21\n     retry_delay: 1000       # \u91cd\u8bd5\u95f4\u96941\u79d2\n     log_level: INFO         # \u65e5\u5fd7\u7ea7\u522b\n     data_format: JSON       # \u6570\u636e\u683c\u5f0f\n\n**\u76d1\u63a7\u544a\u8b66\u8bbe\u7f6e**\n\n\u76d1\u63a7\u6307\u6807:\n   - \u54cd\u5e94\u65f6\u95f4 &gt; 100ms: \u8b66\u544a\n   - \u54cd\u5e94\u65f6\u95f4 &gt; 500ms: \u4e25\u91cd\n   - \u9519\u8bef\u7387 &gt; 1%: \u8b66\u544a\n   - \u9519\u8bef\u7387 &gt; 5%: \u4e25\u91cd\n   - \u8bbe\u5907\u79bb\u7ebf &gt; 30s: \u7d27\u6025\n\n### \u6545\u969c\u6392\u67e5\u6d41\u7a0b\u6807\u51c6\u5316\n\n```\n\u6807\u51c6\u6392\u67e5\u6d41\u7a0b:\n1. \u5feb\u901f\u68c0\u67e5 (5\u5206\u949f)\n   - \u7f51\u7edc\u8fde\u901a\u6027\n   - \u8bbe\u5907\u7535\u6e90\u72b6\u6001\n   - \u57fa\u672c\u901a\u4fe1\u6d4b\u8bd5\n\n2. \u8be6\u7ec6\u5206\u6790 (30\u5206\u949f)\n   - \u534f\u8bae\u5206\u6790\n   - \u6027\u80fd\u6d4b\u8bd5\n   - \u65e5\u5fd7\u5206\u6790\n\n3. \u6df1\u5ea6\u8bca\u65ad (2\u5c0f\u65f6)\n   - \u6a21\u62df\u6d4b\u8bd5\n   - \u5bf9\u6bd4\u6d4b\u8bd5\n   - \u73af\u5883\u9694\u79bb\n\n4. \u89e3\u51b3\u65b9\u6848 (\u6839\u636e\u590d\u6742\u5ea6)\n   - \u914d\u7f6e\u8c03\u6574\n   - \u8f6f\u4ef6\u66f4\u65b0\n   - \u786c\u4ef6\u66f4\u6362\n\n```\n\n### \u77e5\u8bc6\u7ba1\u7406\u4e0e\u5206\u4eab\n\n- **\u6848\u4f8b\u5e93\u5efa\u8bbe**: \u79ef\u7d2f\u5178\u578b\u95ee\u9898\u548c\u89e3\u51b3\u65b9\u6848\n- **\u5de5\u5177\u624b\u518c**: \u7ef4\u62a4\u5de5\u5177\u4f7f\u7528\u6587\u6863\n- **\u57f9\u8bad\u6750\u6599**: \u5b9a\u671f\u7ec4\u7ec7\u6280\u672f\u57f9\u8bad\n- **\u7ecf\u9a8c\u5206\u4eab**: \u5efa\u7acb\u6280\u672f\u4ea4\u6d41\u673a\u5236\n\n## \ud83c\udf89 \u603b\u7ed3\n\n\u672c\u6587\u5168\u9762\u4ecb\u7ecd\u4e86Modbus\u8c03\u8bd5\u9886\u57df\u768420\u591a\u4e2a\u4e13\u4e1a\u5de5\u5177\uff0c\u4ece\u57fa\u7840\u7684\u547d\u4ee4\u884c\u5de5\u5177\u5230\u9ad8\u7ea7\u7684\u53ef\u89c6\u5316\u5e73\u53f0\uff0c\u4ece\u534f\u8bae\u5206\u6790\u5230\u6027\u80fd\u4f18\u5316\uff0c\u4e3a\u4e0d\u540c\u89d2\u8272\u7684\u7528\u6237\u63d0\u4f9b\u4e86\u5b8c\u6574\u7684\u5de5\u4f5c\u89e3\u51b3\u65b9\u6848\u3002\n\n**\u6838\u5fc3\u4ef7\u503c**:\n\n1. **\u6548\u7387\u63d0\u5347**: \u4e13\u4e1a\u5de5\u5177\u53ef\u5927\u5e45\u51cf\u5c11\u8c03\u8bd5\u65f6\u95f4\n\n2. **\u8d28\u91cf\u4fdd\u8bc1**: \u7cfb\u7edf\u5316\u6d4b\u8bd5\u786e\u4fdd\u901a\u4fe1\u53ef\u9760\u6027\n\n3. **\u77e5\u8bc6\u4f20\u627f**: \u6807\u51c6\u5316\u6d41\u7a0b\u964d\u4f4e\u5bf9\u4e2a\u4eba\u7ecf\u9a8c\u7684\u4f9d\u8d56\n\n4. **\u6301\u7eed\u6539\u8fdb**: \u6027\u80fd\u76d1\u63a7\u652f\u6301\u7cfb\u7edf\u6301\u7eed\u4f18\u5316\n\n**\u5173\u952e\u5efa\u8bae**:\n\n1. \u6839\u636e\u5b9e\u9645\u9700\u6c42\u9009\u62e9\u5408\u9002\u7684\u5de5\u5177\u7ec4\u5408\n\n2. \u5efa\u7acb\u6807\u51c6\u5316\u7684\u8c03\u8bd5\u6d41\u7a0b\u548c\u6587\u6863\n\n3. \u5b9a\u671f\u66f4\u65b0\u5de5\u5177\u7248\u672c\u548c\u6280\u80fd\u77e5\u8bc6\n\n4. \u79ef\u6781\u53c2\u4e0e\u793e\u533a\u4ea4\u6d41\u548c\u6280\u672f\u5206\u4eab\n\n\u968f\u7740\u5de5\u4e1a\u4e92\u8054\u7f51\u548c\u667a\u80fd\u5236\u9020\u7684\u53d1\u5c55\uff0cModbus\u534f\u8bae\u4ecd\u7136\u662f\u6700\u91cd\u8981\u7684\u5de5\u4e1a\u901a\u4fe1\u6807\u51c6\u4e4b\u4e00\u3002\u638c\u63e1\u8fd9\u4e9b\u4e13\u4e1a\u8c03\u8bd5\u5de5\u5177\uff0c\u5c06\u5e2e\u52a9\u60a8\u5728\u5de5\u4e1a\u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u66f4\u52a0\u9ad8\u6548\u3001\u53ef\u9760\u5730\u5de5\u4f5c\u3002\n\n**\u6700\u540e\u66f4\u65b0**: 2026-02-24\n\n**\u4f5c\u8005**: \u8d3e\u7ef4\u65afAI\u52a9\u624b\n\n**\u5206\u7c7b**: Modbus\u8c03\u8bd5\u5de5\u5177\n\n**\u6807\u7b7e**: Modbus, \u8c03\u8bd5\u5de5\u5177, \u534f\u8bae\u5206\u6790, \u6027\u80fd\u6d4b\u8bd5, \u6545\u969c\u6392\u67e5, \u5de5\u4e1a\u81ea\u52a8\u5316, \u6d4b\u8bd5\u5de5\u5177\n\n---\n*modbus.cn*\n"