亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Modbus TCP Server源碼解析:從寄存器模型到并發(fā)與排錯實戰(zhàn)

Modbus TCP Server源碼解析:從寄存器模型到并發(fā)與排錯實戰(zhàn) 簡介這是一份基于C實現(xiàn)的MODBUS TCP服務器源碼主要面向工業(yè)自動化領域的開發(fā)者用于快速搭建支持MODBUS TCP通信的服務端程序。源碼實現(xiàn)了MODBUS協(xié)議中常用的功能碼03讀取輸入寄存器/離散輸入與功能碼16寫多個保持寄存器覆蓋請求解析、應答構造和常見錯誤處理流程可作為理解協(xié)議棧、學習TCP/IP網(wǎng)絡編程及進行二次開發(fā)的基礎框架同時幫助理解MODBUS協(xié)議規(guī)范與報文交互機制。資源壓縮包共22個文件、約152KB以7個h頭文件與5個cpp源文件為主附帶Visual Studio工程配置sln、vcxproj、rc等整體結構清晰便于在Windows環(huán)境下直接編譯調試。目前已有2173人學習/下載。通過研讀源碼開發(fā)者可以掌握從報文接收到響應返回的完整實現(xiàn)思路并據(jù)此便捷地擴展線圈讀寫等更多功能碼適配智能能源管理、環(huán)境監(jiān)測、自動化產(chǎn)線等不同工業(yè)控制場景提升設備互聯(lián)與遠程控制的開發(fā)效率。1. 為什么 MODBUS TCP SERVER 源碼值得翻現(xiàn)場最常見的尷尬是用現(xiàn)成的 Modbus 從站模擬器主站數(shù)據(jù)讀得干干凈凈等換成一版自己寫的服務端連接能建立、報文也發(fā)了寄存器卻永遠返回零或者偶爾飄成亂碼。你面前只有一個黑匣子轉向現(xiàn)有工具又復現(xiàn)不了最后只能硬著頭皮把服務端源碼從頭到尾查一遍。這正是 MODBUS TCP SERVER 源碼的價值所在它不是拿來到處復制粘貼的模板而是你處理現(xiàn)場問題的最后一本底賬。這篇文章會從一份最小可運行的服務端源碼講起把 Modbus TCP 的報文結構、寄存器模型、并發(fā)處理和事務標識拆清楚再把我在幾個設備聯(lián)網(wǎng)項目里遇到過的坑按“現(xiàn)象—原因—解決”寫成排查清單。適合兩類人一類是要把 Modbus TCP Server 集成到采集網(wǎng)關、邊緣盒子或上位機里的開發(fā)工程師另一類是天天跟 PLC、HMI、組態(tài)軟件對點表被未知從站行為反復折磨的調試工程師。讀完你至少能帶走兩樣東西一套可以直接抄作業(yè)的源碼骨架一份按圖索驥的排錯手冊。至于最后要不要用開源庫、要不要自己維護看完第三四章你自己就能拍板。2. 從協(xié)議到源碼MODBUS TCP SERVER 的最小骨架2.1 先看 7 字節(jié)頭事務、單元和長度怎么對齊寫服務端之前腦子里必須有一張固定的幀結構圖否則后面所有字節(jié)偏移都會算錯。Modbus TCP 的請求由 MBAP Header 和 PDU 組成。MBAP 固定 7 字節(jié)事務標識符占 2 字節(jié)協(xié)議標識符占 2 字節(jié)長度字段占 2 字節(jié)單元標識符占 1 字節(jié)。事務標識符用在同一個連接里把請求和響應配對協(xié)議標識符必須為 0表示這是 Modbus 協(xié)議長度字段表示單元標識符加 PDU 一共還有多少字節(jié)單元標識符在串口透傳網(wǎng)關里代表從站地址純 TCP 場景通常填 0 或 1。服務端最容易翻車的不是總字節(jié)數(shù)而是長度字段的計算口徑。請求頭里的 length 是“單元標識符 1 字節(jié) PDU 長度”。也就是說服務端讀完 7 字節(jié)頭之后還要繼續(xù)讀 length-1 個字節(jié)才是完整的 PDU。很多新人直接把后續(xù)所有可讀字節(jié)當成一幀收完在連續(xù)請求的場景下會把下一個請求的頭也吞進去表現(xiàn)就是第一幀正常第二幀開始全部錯位。下面這張表列出四個最常用功能碼的請求響應格式實現(xiàn)的邊界判斷基本都圍繞它展開。功能碼含義請求 PDU響應 PDU0x03讀保持寄存器起始地址(2B) 寄存器數(shù)量(2B)字節(jié)數(shù)(1B) 寄存器值(NB)0x04讀輸入寄存器起始地址(2B) 寄存器數(shù)量(2B)字節(jié)數(shù)(1B) 寄存器值(NB)0x06寫單個寄存器地址(2B) 值(2B)地址(2B) 值(2B)0x10寫多個寄存器起始地址(2B) 數(shù)量(2B) 字節(jié)數(shù)(1B) 值(NB)起始地址(2B) 數(shù)量(2B)注意 Modbus 協(xié)議里的寄存器地址從 0 開始而組態(tài)軟件界面上往往顯示成 40001、40002這個 1 的偏移是上位機顯示層的事源碼里別跟著加。我在項目里見過服務端收到起始地址 0 卻去讀數(shù)組下標 1最后每個點位都差一位。2.2 寄存器模型的取舍用哪種內(nèi)存結構支撐讀寫Modbus 的 PDU 不關心數(shù)據(jù)來自數(shù)組、數(shù)據(jù)庫還是某個硬件寄存器服務端源碼真正的分水嶺在寄存器模型的組織方式。最直接的做法是把每種寄存器區(qū)域做成一個數(shù)組。保持寄存器用 16 位無符號整數(shù)地址連續(xù)讀寫都靠下標索引。先初始化一塊長 100 的列表寫單個寄存器就更新第 n 個元素讀就按切片返回。這個模型跑通協(xié)議已經(jīng)足夠但它有個明顯缺點當點位數(shù)量和業(yè)務邏輯變多每個功能碼分支都要復制一遍邊界判斷代碼很快會變得沒法維護。我建議的順序是先用簡單數(shù)組把服務端跑通再做數(shù)據(jù)訪問層抽象。不要一開始就上配置文件、多區(qū)域映射那會讓問題疊加。真實項目里常見的做法是維護一個點表配置每個條目包含起始地址、數(shù)量、讀寫權限和數(shù)據(jù)來源服務端在收到請求后根據(jù)配置動態(tài)查表。這個會在最后一章展開。選型方面還有另一條路直接用現(xiàn)成開源庫比如某開發(fā)者常用的 Python Modbus 庫它內(nèi)置了 Datablock 和協(xié)議解析上位機工具類項目用它非常省事。我當時堅持自己寫一遍是因為內(nèi)核要移植到一個很小的實時系統(tǒng)里第三方庫依賴太重不如一套純 socket 代碼容易裁剪。這個選擇沒有標準答案關鍵看你的運行環(huán)境是否允許引入外部依賴。2.3 最小源碼不依賴第三方庫的 Python server下面給出一份我裁剪過的最小實現(xiàn)只覆蓋讀保持寄存器和寫單個寄存器以及異常回包。它能讓你在本地立刻看到一個可交互的 Modbus TCP Server。import socket import struct import threading # 保持寄存器表地址從 0 開始長度 100 REG_HOLDING [0] * 100 REG_LOCK threading.Lock() def build_response(tid, unit, pdu): # MBAP 中 length 單元標識(1) PDU 長度 length len(pdu) 1 return struct.pack(HHHB, tid, 0, length, unit) pdu def handle_client(conn): try: while True: mbap conn.recv(7) if not mbap: break tid, pid, length, unit struct.unpack(HHHB, mbap) if pid ! 0: break # 還需要讀取 length-1 字節(jié)的 PDU pdu b remain length - 1 while remain 0: chunk conn.recv(remain) if not chunk: return pdu chunk remain - len(chunk) func pdu[0] if func 0x03: # 讀保持寄存器 start, count struct.unpack(HH, pdu[1:5]) # 單次最多讀 125 個寄存器 if count 0 or count 125 or start count len(REG_HOLDING): resp build_response(tid, unit, bytes([0x83, 0x02])) else: with REG_LOCK: values REG_HOLDING[start:start count] payload bytes([count * 2]) for v in values: payload struct.pack(H, v) resp build_response(tid, unit, bytes([0x03]) payload) elif func 0x06: # 寫單個保持寄存器 addr, value struct.unpack(HH, pdu[1:5]) if addr len(REG_HOLDING): resp build_response(tid, unit, bytes([0x86, 0x02])) else: with REG_LOCK: REG_HOLDING[addr] value resp build_response(tid, unit, bytes([0x06]) struct.pack(HH, addr, value)) else: # 非法功能碼 resp build_response(tid, unit, bytes([func | 0x80, 0x01])) conn.sendall(resp) finally: conn.close() def start_server(ip0.0.0.0, port502): srv socket.socket(socket.AF_INET, socket.SOCK_STREAM) srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) srv.bind((ip, port)) srv.listen(5) print(Modbus TCP Server listening on {}:{}.format(ip, port)) while True: conn, addr srv.accept() threading.Thread(targethandle_client, args(conn,), daemonTrue).start() if __name__ __main__: start_server()這段代碼有幾個值得圈出來的點。tid, pid, length, unit用HHHB一次拆出所有多字節(jié)字段都按網(wǎng)絡大端解析。build_response統(tǒng)一封裝 MBAP 頭每個分支不用各自拼長度從根上減少“響應長度算錯”的概率。REG_LOCK是必須加的因為多客戶端線程同時讀寫同一個列表不加鎖會出現(xiàn)數(shù)據(jù)交錯現(xiàn)場表現(xiàn)是寄存器值莫名其妙歸零或者變成舊值。功能碼 0x03 的響應里有“字節(jié)數(shù)”字段這是 01/02/03/04 共有的結構漏掉之后主站會一直等到超時。異?;匕仨毎压δ艽a最高位置 1例如 0x03 變 0x83同時帶異常碼 0x02 表示非法數(shù)據(jù)地址。主站看到高位為 1 才會按異常處理直接回普通功能碼會讓主站把后面的字節(jié)當成正常數(shù)據(jù)去解析必然錯亂。啟動后用 Modbus Poll 或其他主站工具連接 502 端口讀起始地址 0、數(shù)量 10如果返回的數(shù)據(jù)比你預期少或者讀到亂碼先看是不是字節(jié)數(shù)字段和實際返回長度不一致。這是最小實現(xiàn)最容易踩的第一個坑后面避坑章節(jié)還會繼續(xù)展開。3. 源碼不只是收發(fā)事務標識、并發(fā)和連接管理3.1 事務標識符(TID)并發(fā)請求配對的關鍵MBAP 頭第一個字段是事務標識英文縮寫 TID。在同一個 TCP 連接里客戶端可以連續(xù)發(fā)送多個請求并不嚴格要求一問一答。服務端必須原樣回顯請求中的 TID客戶端才能把響應和請求對應起來。如果服務端把 TID 改成了自增序列客戶端就會出現(xiàn)響應超時、請求錯位。有些簡單的上位機工具并不校驗 TID但不校驗不代表你可以隨便改。我用過的幾款主流組態(tài)軟件都會在協(xié)議棧里核對這個字段一旦發(fā)現(xiàn)對不上就把這條響應丟棄。所以源碼里最保守的做法是在handle_client入口保存?zhèn)魅氲?tidbuild_response原樣帶回。有一點容易被忽略Modbus TCP 標準允許在同一連接上多路復用事務但很多設備端從站只支持串行處理。如果你的客戶端是同一連接并發(fā)發(fā)請求而你的服務端是一個線程連續(xù)阻塞讀取響應自然是一個一個返回這時客戶端如果做了多事務 pending就會認為部分請求超時。服務端源碼要區(qū)分好“連接級并發(fā)”和“事務級并發(fā)”。最簡單的辦法是限制同一連接同一時刻只處理一個事務客戶端通常也會退化為串行。真正要支持事務級并發(fā)就得為每個連接維護一個 pending 字典按 TID 找到等待的 writer 再回包復雜度會明顯上升。3.2 多客戶端連接線程池與 asyncio 的取舍最小源碼用threading.Thread對每個客戶端起一個線程。這在客戶端數(shù)量少的時候沒有問題五六個主站輪詢完全扛得住。但現(xiàn)場往往是多臺主站同時連接每臺還會建立多條連接線程數(shù)一旦跑到幾十上百系統(tǒng)上下文切換開銷會非常明顯服務端響應延遲開始抖動。常見的替代方案有兩個。第一是線程池用ThreadPoolExecutor限制最大并發(fā)線程數(shù)。因為每個連接的處理函數(shù)是一個長循環(huán)會一直占住一個線程所以線程池大小嚴格意義上是“最大并發(fā)連接數(shù)”不是“每秒能處理的請求數(shù)”。超出的連接會在 listen 隊列里排隊如果 backlog 太小新連接會直接被內(nèi)核拒絕。配合線程池一定要做空閑超時比如 30 秒沒收到幀就關閉連接否則一個斷開的客戶端沒被發(fā)現(xiàn)線程池里就少了一個可用的線程。第二是 asyncio 單線程事件循環(huán)適合連接多、每連接流量小、寄存器響應快的場景。但 asyncio 有個致命禁忌業(yè)務代碼里不能出現(xiàn)任何阻塞調用比如time.sleep、同步數(shù)據(jù)庫查詢、文件鎖。一旦阻塞所有客戶端的請求一起卡住。用 asyncio 實現(xiàn) Modbus TCP Server 時讀取一幀的標準寫法是先讀 7 字節(jié)頭再根據(jù)長度字段用readexactly(length - 1)把剩余部分讀夠不要手動拼包因為 Modbus 幀邊界是自描述的長度字段就是最好的拆包依據(jù)。下面是 asyncio 服務端處理連接的核心骨架保留了 MPAB 讀取邏輯import asyncio import struct async def handle_connection(reader, writer): try: while True: mbap await reader.readexactly(7) tid, pid, length, unit struct.unpack(HHHB, mbap) if pid ! 0: break pdu await reader.readexactly(length - 1) # 按功能碼構造響應 pdu邏輯同第二章節(jié) resp build_response(tid, unit, pdu) writer.write(resp) await writer.drain() except (asyncio.IncompleteReadError, ConnectionResetError): pass finally: writer.close() await writer.wait_closed()這里的關鍵參數(shù)是readexactly它要么讀滿指定字節(jié)要么拋異常絕不會出現(xiàn)少讀半個數(shù)據(jù)包的情況。缺點是一旦客戶端發(fā)了一個不完整的頭服務端會一直等下去所以必須在asyncio.wait_for里包一層超時。不要小看這個超時真實網(wǎng)絡環(huán)境里丟包后客戶端重傳服務端如果沒有超時機制連接會一直掛著慢慢耗盡系統(tǒng)文件描述符。3.3 長連接 vs 短連接哪種現(xiàn)場更常見Modbus TCP 設計默認是長連接。真正的 PLC 主站會保持連接到從站周期性地輪詢寄存器斷線后還會自動重連。服務端如果處理完一次請求就關閉連接主站每個周期都要重新建連現(xiàn)場會出現(xiàn)“數(shù)據(jù)刷新慢、狀態(tài)經(jīng)常斷”的假象。短連接場景主要出現(xiàn)在 Web 后臺測試、臨時腳本或者需要快速釋放端口的工具中。做服務端源碼時要兩種都支持但不要主動關閉長連接。如果你確實需要回收空閑資源把空閑超時設置得盡量長至少 60 秒以上如果主站輪詢周期本身就長要考慮把這個超時再放大。還有一個常被忽略的點半開連接?,F(xiàn)場網(wǎng)絡抖動之后客戶端已經(jīng)不在但服務端的recv還一直在阻塞它根本不知道對方已經(jīng)消失。解決方法是給每個連接設置 socket 超時conn.settimeout(60)超時后關閉連接并記錄日志。這一步是 demo 代碼和生產(chǎn)級代碼真正的分界線。某些系統(tǒng)里還需要配合 TCP keepalive讓內(nèi)核層探測對端是否存活但 keepalive 默認探測周期很長不能替代應用層超時。4. 參數(shù)與配置讓 MODBUS TCP SERVER 源碼跑得穩(wěn)4.1 必調參數(shù)超時、緩沖區(qū)、地址范圍與端口把源碼從“能跑”推向“能扛現(xiàn)場”無非是把下面這幾個參數(shù)調成符合業(yè)務的數(shù)值。參數(shù)推薦值作用調大/調小的影響socket 超時30-60s檢測半開連接太小會讓慢周期主站誤認為斷線太大浪費連接資源recv 緩沖區(qū)2-8KB接收多幀時緩存Modbus 單幀小于 260B太大并不會提升性能監(jiān)聽 backlog5-10未 accept 的連接隊列太小高并發(fā)會丟連接太大占用系統(tǒng)內(nèi)存寄存器區(qū)長度按點表實際越界返回異常碼設成 65536 沒有任何收益反而放寬了越界風險最大連接數(shù)按設備性能保護服務不被打爆超過可以拒絕新連接返回日志字節(jié)序big-endian寄存器默認大端改成小端會直接造成數(shù)據(jù)翻倍端口默認是 502Linux 下低于 1024 的端口需要 root 權限很多開發(fā)環(huán)境會先用 1502 調試上線再映射到 502。如果你用 Docker 部署容器內(nèi)的 502 可以映射到宿主機的 1502不影響協(xié)議本身。SO_REUSEADDR一定要在 bind 之前設置否則服務端程序重啟后會因為之前的 TIME_WAIT 狀態(tài)占用端口而失敗。這個選項不會像某些博客講的那樣“解決并發(fā)連接被 bind 拒絕”的問題它只是允許重用地址避免快速重啟時端口被占用。4.2 功能碼的邊界03/04/06/16 怎么實現(xiàn)與限制Modbus TCP 的 PDU 理論最大長度是 253 字節(jié)這一個數(shù)學約束決定了很多功能碼的數(shù)量上限。讀保持寄存器 0x03 和讀輸入寄存器 0x04 單次最多讀 125 個寄存器因為每個寄存器 2 字節(jié)125 個就是 250 字節(jié)加上功能碼和字節(jié)數(shù)正好 252卡在 253 以內(nèi)。寫多個寄存器 0x10 單次最多寫 123 個因為請求里還有起始地址和數(shù)量留給數(shù)據(jù)的空間更少。很多從站源碼沒有做這個限制收到 count200 的請求時直接越界訪問列表并拋異常連接直接斷掉。主站看到連接斷開通常會連續(xù)重試然后報告“從站無響應”。正確的做法是像第二章節(jié)代碼里那樣把邊界判斷放在任何數(shù)據(jù)處理之前如果 count 超過上限就返回異常碼 0x02 非法數(shù)據(jù)地址而不是讓程序崩潰。06 寫單個寄存器是最簡單的不存在批量上限問題但要處理地址越界。有些主站用 06 寫單個設置項時起始地址正好是點表末尾你如果只判斷addr len(REG_HOLDING)就沒有給“最后一個合法地址”留空間。常規(guī)寫法是addr len(REG_HOLDING)對應數(shù)組下標 0 到 len-1 合法。01 和 02 線圈/離散輸入功能碼在現(xiàn)場也很常見。線圈是 bit 存儲讀取 2000 個線圈需要 250 字節(jié)數(shù)據(jù)正好是 PDU 允許的極限。如果只實現(xiàn)了寄存器客戶端發(fā) 01 功能碼就會收到 0x01 異常。大多數(shù)設備端會同時實現(xiàn) 01/02/03/04因為組態(tài)軟件默認要把所有類型都讀一遍。4.3 錯誤處理異常碼返回與日志Modbus 異常碼總共就那么幾個0x01 非法功能碼、0x02 非法數(shù)據(jù)地址、0x03 非法數(shù)據(jù)值、0x04 從站設備故障。返回異常時必須把功能碼最高位置 1。比如 0x03 變成 0x830x06 變成 0x86。最高位沒有置 1 的響應會被主站按正常數(shù)據(jù)處理這是現(xiàn)場排查時最難發(fā)現(xiàn)的錯誤之一因為報文結構看起來完整實際內(nèi)容全是錯位數(shù)據(jù)。日志不要貪多。每個連接記錄 TID、功能碼、起始地址和數(shù)量就夠了寄存器內(nèi)容只有在異常時才打印。我見過有人把每個請求的完整十六進制都打進日志結果服務端跑一天日志文件幾個 GB真正想看關鍵信息的時候全被刷沒了。生產(chǎn)環(huán)境里建議加一個開關默認開“請求摘要日志”級別 INFO調試時開“詳細報文日志”級別 DEBUG。抓包工具能覆蓋一部分問題但服務端日志能看到“程序內(nèi)部認為哪里越界”這是 Wireshark 看不到的。5. 避坑MODBUS TCP SERVER 的常見故障排查5.1 現(xiàn)象請求一多寄存器值就被置零現(xiàn)象是單個連接單次請求都正常主站并發(fā)輪詢或者頻繁寫操作之后某個寄存器開始變成 0再過一會又恢復。原因通常是兩個一是多線程同時寫同一個寄存器數(shù)組沒有加鎖Python 里雖然 GIL 保證了單個字節(jié)碼指令的原子性但列表切片和賦值并不是整體原子操作兩個線程交錯時會讀到舊值二是服務端讀取 PDU 時沒有嚴格按 length 字段接收用了一次不完整的 recv導致下一幀的偏移量出錯寫入請求的地址亂套。解決方法是給寄存器數(shù)據(jù)加鎖并在解析幀時嚴格按“先讀 7 字節(jié)頭再循環(huán)讀夠 length-1 字節(jié)”來收包。第二章節(jié)代碼里的while remain 0就是這個目的。不要相信一次 recv 能拿到完整 PDU尤其在本地回環(huán)之外的以太網(wǎng)環(huán)境。5.2 現(xiàn)象連接不釋放導致端口耗盡現(xiàn)象是服務端運行一段時間后新的客戶端連接全部失敗用netstat能看到大量 TIME_WAIT 或者 ESTABLISHED 狀態(tài)的連接堆積程序日志里全是 bind 或 accept 相關的報錯。原因是對端異常斷開時服務端 recv 沒有返回一直阻塞或者客戶端主動關閉時服務端沒有進入 close 流程。每個堆積連接占一個文件描述符Linux 默認進程最大文件描述符是 1024很快就會被耗盡。解決方法是給每個連接設置超時時間conn.settimeout(60)在handle_client里把 socket 超時異常統(tǒng)一捕獲并關閉連接。同時可以在 accept 后設置 TCP keepalive但 keepalive 默認參數(shù)在 Linux 下是 2 小時不適合短周期檢測需要配合套接字選項調整探測時間。最穩(wěn)的還是應用層超時加線程回收。5.3 現(xiàn)象字節(jié)序反了明明是 1 讀出來是 256現(xiàn)象是寫一個寄存器值 1主站讀出來是 256寫 0x0102讀出來 0x0201。原因是 Modbus 寄存器默認大端高字節(jié)在前。如果用本地字節(jié)序的struct.pack(H, value)在 x86/ARM 小端環(huán)境里會把低字節(jié)放到內(nèi)存前面報文變成低字節(jié)在前主站按大端解析正好反了。解決方法是所有多字節(jié)字段統(tǒng)一用H、I不要用裸的H或I。Python 的struct默認用本地字節(jié)序機器不同行為不同最容易踩。排查時寫一個固定值 0x1234 到寄存器讀回來看字節(jié)排列能立刻確認是不是字節(jié)序問題。5.4 現(xiàn)象模擬器可以讀真實 PLC 請求超時現(xiàn)象是 Modbus Poll、模擬主機都能正常讀寫換成某品牌 PLC 做主站后服務端日志顯示收到了請求但主站一直報超時或者間歇性失敗。原因通常是真實 PLC 會一次性建立多個連接并在一個連接里連續(xù)發(fā)送多個請求還有可能是 PLC 發(fā)送了你沒有實現(xiàn)的功能碼比如 0x10 寫多個寄存器而服務端返回了非法的異常碼主站協(xié)議棧直接放棄重試。解決方法是先抓包看 PLC 實際發(fā)出來的請求是什么樣子。重點看三個字段TID 是否在同一個連接上遞增、功能碼是什么、起始地址和數(shù)量是多少。抓不到包時在服務端日志里打印收到的原始 PDU 十六進制哪怕不打完整報文也要打功能碼和長度。很多問題時隱性的主站只報超時不會告訴你它發(fā)送了什么。5.5 現(xiàn)象異步框架里用阻塞讀導致整個服務卡死現(xiàn)象是用 asyncio 實現(xiàn)的服務端在低并發(fā)時正??蛻舳诉B接一多整體響應延遲飆升甚至所有請求都沒反應。原因是在異步回調里用了同步的time.sleep、同步 socket 操作或者 CPU 密集型的大循環(huán)。asyncio 是單線程事件循環(huán)一個阻塞調用會停掉整個循環(huán)其他連接即使早就準備好了也無法被處理。解決方法是所有耗時操作放進線程池比如await asyncio.to_thread(do_heavy_work, data)讀取網(wǎng)絡數(shù)據(jù)必須用reader.readexactly不要用socket.recv。同時給每個請求的處理加上超時保護避免某個客戶端不發(fā)完數(shù)據(jù)時整個事件循環(huán)被readexactly永久占住。這個坑最容易在“把原來 thread 版改成 asyncio 版”的時候出現(xiàn)因為很多代碼只是換了個殼內(nèi)部還是一堆阻塞函數(shù)。6. 從源碼到交付寄存器映射、抓包驗證和壓測6.1 把寄存器表變成配置而不是把地址寫死在 if 里第二章節(jié)的源碼用的是一個固定長度列表適合跑通協(xié)議。真正到一個有幾十個點位、不同寄存器代表溫度、轉速、狀態(tài)的現(xiàn)場再在 if 分支里手寫地址就很痛苦了。我一般會把點表抽成一個配置結構每個數(shù)據(jù)區(qū)包含起始地址、長度、讀寫權限、當前值來源函數(shù)。比如溫度寄存器由傳感器線程更新設定值寄存器由 Modbus 寫請求更新。服務端收到請求后先按功能碼找到對應的數(shù)據(jù)區(qū)再做邊界判斷。這樣做的好處是現(xiàn)場點位調整時只改配置不重新編譯。點表結構可以用一個簡單的 Python 類來表示核心目的是讓“地址—數(shù)據(jù)來源”的映射一目了然。不要在這里過度設計第一個版本用 dict 加回調函數(shù)就足夠。6.2 抓包驗證是源碼調試的第一現(xiàn)場Wireshark 是排查 Modbus TCP Server 最直接的證據(jù)來源。過濾條件寫tcp.port 502逐幀展開 MBAP 和 PDU立刻能看到長度字段是不是正確的、功能碼有沒有回執(zhí)、異常碼高位有沒有置 1。我最常用的驗證套路是先寫一個寄存器值 0x0102再讀回來。如果抓包看到的值是 0x0102說明字節(jié)序和收發(fā)都正常如果看到 0x0201不用懷疑就是字節(jié)序問題。然后再測邊界讀起始地址 0、數(shù)量 125成功改成數(shù)量 126應返回 0x83 0x02。這個用例能同時驗證正常路徑和異常路徑。Wireshark 里如果看到 Malformed 標記基本是長度字段和實際數(shù)據(jù)長度不匹配。此時不要急著改程序先看這一幀的 Byte Count 和后續(xù)實際字節(jié)數(shù)差了幾個。常見原因是在響應里多寫了地址或者少算了 unit 標識符長度。6.3 給源碼加一個最小壓測腳本交付之前我會用一個幾十行的腳本做一次并發(fā)冒煙。下面是一個用 Python 線程池模擬多主站的簡單框架每一線程建立獨立連接連續(xù)執(zhí)行寫后讀統(tǒng)計成功率import socket import struct import threading def modbus_read(conn, start, count): # 構造 03 請求 tid 1 pdu struct.pack(BHH, 0x03, start, count) mbap struct.pack(HHHB, tid, 0, len(pdu) 1, 1) conn.sendall(mbap pdu) header conn.recv(7) tid2, pid, length, unit struct.unpack(HHHB, header) data b while len(data) length - 1: data conn.recv(length - 1 - len(data)) return data def worker(ip, port, errors): try: conn socket.create_connection((ip, port), timeout3) for i in range(100): resp modbus_read(conn, 0, 10) if len(resp) 22: # 1字節(jié)功能碼 1字節(jié)數(shù)量 20字節(jié)數(shù)據(jù) errors.append(short response) break conn.close() except Exception as e: errors.append(str(e)) threads [] errors [] for i in range(20): t threading.Thread(targetworker, args(127.0.0.1, 502, errors)) t.start() threads.append(t) for t in threads: t.join() print(errors:, len(errors))這個腳本不對響應內(nèi)容做過深校驗它主要看兩件事多連接并發(fā)時會不會崩、會不會出現(xiàn)短包。如果 errors 數(shù)量逐漸增長下一步就去查服務端 backlog 和線程數(shù)如果短包頻繁極大概率是響應長度字段寫錯。6.4 一個長期受用的交付習慣這套源碼骨架我在不同項目里打磨過很多輪真正讓它穩(wěn)定下來的不是代碼技巧而是“每跑一個用例都留證據(jù)”的習慣。本地能連通只是第一步邊界返回、異常碼、并發(fā)讀寫、抓包一致性這四個驗證點缺一不可?,F(xiàn)在每接到一個要集成 Modbus 從站的活我都會先花一小時把最小服務和壓測腳本搭起來再開始談業(yè)務點表。源碼的價值不在第一次運行通過而在后續(xù)任何一次故障里你都能翻開它快速定位到那幾行可疑的判斷。希望幫到你。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色情成人五月天| 色偷偷色偷偷欧美日韩| 97在线视频网站| 日韩99神马视频播放片在线播放| 精品无码久久久久久国产浪潮| 日本熟妇色熟妇在线视频播放| 自拍偷拍 日韩无码| 极品销魂美女一区二区 | 亚洲色系另类精品国产| 欧美AB在线| 粉嫩av一区二区三区四季| 五月婷婷丁香| 久久熟女人| 亚洲各类熟们中文字幕| 五月丁香啪啪| 91操操| 影音先锋日本乱伦| 操碰97| 操老熟女AV| 国产视频一区二区三区久久亚洲天堂| www.av在线观看| 亚洲精品自拍| 操国产逼| 男人的天堂2019| 99超碰网| 天啪| 操人妻视频| rivers-china.com| 色哟哟AV| 9Ⅰ老熟女| 精彩久久中文| 久久机热| 久久久女人| 欧美成人精品欧美一级乱黄一区二…| 色爱天堂| 天天综合青苹果| 久伊人网78| 亚洲在线综合| 600国产精品视频| 欧美亚洲综合999| 97超色| 久久99精品九九久久久婷婷| 丝袜无码a片| 97综合国产精品高潮久久| 翘臀vidoes| 精品久久久中文字幕不| 天天内射| 亚洲日本大香蕉1| 日韩精品啪啪啪| 少妇久久| 日本污ww视频网站| 日韩三级视频一区二区三区| 韩日男人的天堂| 国产视频一区二区三区久久亚洲天堂| 中文字幕精品亚洲熟女| 哈哈操电影| 黑人免费福利视频| 狠狠色狠狠色狠狠五月| 婷婷五月色| 婷婷五月天伊人| 亚洲一区二区麻豆影院| 伊人久久大香线综合无码| 中文字幕久久精视频久久大全| 超碰这里只有精品| 欧美图片校园春色| 天天操天天射天天日| 中国一级操逼视频| 天天做天天爱天天高潮| 日本一区99| 欧美日韩青操| 人妻熟女一区二区在线视频| 内射老妇BBWX0C0CK| 黄片免费视频2019| 牛黄色久午久| 久久久专区| 欧美熟妇色| 国产午夜福利专区综合| 99久久精品国产高潮| 五月综合激情网| 夜夜高潮夜夜爽| 国内外激情在线| 私人尤物在线精品不卡| 六月丁丁香| 天天舔天天日天天射| 欧美热图99| 国产精品一二三区18| 懂色av色欲av蜜臀av| 久久婷婷色| 久久久久久亚洲精品中文字幕人妻| 黑人与人妻| 欧洲精品二区| 六月婷婷综合| 校园春色 亚洲| 国产一区自拍欧美日韩| 东京热亚洲一区二区| 久草精品国产蜜臀| 粉嫩av一区二区三区天美传媒 | 混色激情av| 超碰97最新人妻| 免费视频97| 天天艹天天日| 激情欧美日韩女同久久| 国产一区二区三区视频在线看| 九九aV| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 欧美成人黄网色网站| 99热97| 夜夜嗨一区| 欧美成人四级在线播放| 欧美日韩电影一区二区| 亚洲av国产av综合av卡| 九九久久一区二区三区| 东京热男人天堂| AV污污污污| 刺激性视频黄页| 国产精品诱惑| 日本熟妇一区二区三区| 一级做受视频免费是看美女| 欧美人妻色| 呦呦一区| 久久超碰免费的| 99999亚洲| 综合久久婷婷| www国产精品| 日本亚洲熟女视频| 在线观看一级α片刺激高潮视频| 欧美 亚洲 制服 精品| 久久久一区二区三区麻豆| 天天色播亚洲综合网站| 精品熟妇视频一区二区| 婷婷丁香熟妇综合网| 97久久精品不卡| 国产强奸乱伦xd| 麻豆区99999| 视频国产成人精品日本亚洲18| 色色五月天激情| 国产AV天美传媒一区二区三区| 巨爆乳一区二区爆乳区| 国产精品久久久九九九| 精品一区二区成人动漫| 一区二区三区麻豆| 亚洲夜色在线| 中日韩一区二区三区欧美| 九九久久久九九| 免费国产电影一区二区| 欧美日日人人天天| 亚洲nv男人的天堂网| 久久啊啊啊| 91 丝袜在线| 国产乱伦一二三区| 国产精品久久久| 91在线限制级| 中国女人内射6XXXXX| 亚洲区小说| 啪啪一区| 亚洲黄片免费在线播放| 久9综合在线| 国产精品交换一区二区| 久久久久久亚洲Av无码| 天操天操夜操夜月月年年操操| 黄色视频特级毛片| 亚洲高清视频在线免费观看| 在线一区| 快点操死我| 综合操逼| 精品无码久久久久久久久果冻糖心 | 九九精品美女高溯喷水| 在线观看免费视频国产| 一本色道熟妇| 亚洲天堂日本| 96AV精品| 精品性爱无码在线播放| xxx0国产在线播放| 日本爽爽爽爽爽爽免费视频| 97久久久久久久久久| 五月丁香综合网| 秋霞网—男女啪啪亚洲免费体验区| 日日噜噜夜夜久久亚洲一区二区| 欧美丝袜激情| 亚洲欧美爆| 91干熟女| 乱伦3P视频| 东北女人无套内谢视频| 国产乱子伦久久精品综合一区二区三| 99这里只有精品| 久久有碼| 无码人妻一区二区一牛影视| 嫩草 人人网精品| 亚洲有码 视频一区| 欧美日韩国产中文精品字幕自在自线| 日韩成人无码| 亚洲色图欧美| 97超碰超| 东京热毛片177b2viP| 麻豆成人av| 日本伦理一区二区| 欧美九9 9 9| 激情小说五月天| 亚洲国产欧美中日韩成人综合视频| 日韩综合成人免费视频| 内射夫妻三片| 日韩精品色呦呦| 久久老女人| 插插综合网天天影视网| 欧美第五页| 欧美高潮| 亚洲图片视频小说| 国产又粗又长的视频| 欧美少妇色综合| 97综合日韩| 性爱动态120秒| 婷婷五月天成人| 综合熟女| 天无日色综合| 青娱乐大香蕉| julia中文字幕在线观看| 美日韩在线不卡人妻| 欧美熟妇精品黑人巨大一二三区| 一牛影视久久久一区二区三区| 婷婷综合视频| 欧美日韩夜夜| 亚洲精品天天影视综合网| 午夜福利久久久噜久噜久久综合| 无码一区二区三区四区五区六区七区八区九区十区视频 | 超碰2017| 亚洲欧美一区二区网址| 人人操人人操人人操人人操人人操人人人11.CM | 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | CCYY草草影院地址入口| 亚洲无码国产精品久久| 国人欧美精品一区二区| 精品性爱无码在线播放| 欧美性猛交美女自慰91| 欧美白嫩女HD| 亚洲情色无码一区二区三区| 精品免费囯产一区二区三区| 黄片视频观看| 激情五月丁香五月| 亚洲日产专区婷婷| 久久久偷拍| 国产精品美女视频诱惑| 免费人成?大片在线播放| 99操碰| 天堂av2019| 青青草视频导航官网| 97欧美色综合| 亚洲 欧美 日韩 国产一区二区| 26uuu欧美日韩| 久操网线| 九久9热| 中文一区在线日| 91精品国产91熟女| 日本成人电影资源网| 人人透人人操| 精品9区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 家庭乱伦性爱av| 色噜噜婷婷| 观看免费区二区三区二| 深夜激情| 欧美性爱无码一区二区三区| 欧美毛片在线网| 1024手机看片欧美日韩| 超碰在线一区| 亚洲一区日韩| 日本新免费二区三区| 久久内射| 中文字幕在线日亚州9| 欧美色图片91| 在线看的av| 97精品综合| 蜜桃视频一区二区三区| 人人妻碰人人免费| 俺去久久| 色九久| 中文字幕精品日韩中文字幕| 欧美超碰96| 欧美在线天堂| 久99热| 加勒比AV天堂| 黄色人人| 日本丝袜美腿人妻九九| 超碰97人妻免费在线| 色五月婷婷麻豆在| 熟妇人妻精品一区二区| 色五月婷婷色| 又黄又硬又粗又长国产视频| 国产一级作爱毛片| 嗯嗯啊好大| 久草尤物| 青苹果影院男人的天堂| 草草草视频在线免费看| 三级片大波波| 性夜影院爽黄A爽免费动漫| 久久99热这里只频精品6学生| 欧美中字不卡| 亚洲最大的综合性av| 欧美 日韩 另类 亚洲| 日本人妻丰满熟妇久久久久久| 超碰精品在线| 中文字幕一区二区无码成人| 五月丁香大香蕉| julia国产在线| 黄aaaaaaaaaaaaaaaaaa色网站| 日本最新免费韩国1区2区视频播放| 日韩性爱啪啪视频| 久久人爽| 久久久久久久国产视频| 蜜桃网熟妇| 精品国产久热在线观看| 99热在线播放| 亚洲熟女综合| 亚洲av综合色| 天操天操夜操夜月月年年操操| 久久久免费一级黄片| 少妇人妻在线| 嗯啊不要在线观看嗯啊| 在线观看一级α片刺激高潮视频| 91老熟女老女人国产老太| 日韩人妻 中文字幕| 后入福利视频| 亚洲色天堂日韩中| 欧美成熟性爱精品| 精品成人女人久久| 色色婷婷五月天| 久久 精品| 97综合国产精品高潮久久| 夜夜天天噜狠狠爱2021| 91操熟妇| 在线视频一区二区传媒| 97福利视频| 成人免费性爱视视| 色爽——AV| 99综合视频| 国产粉嫩蜜臀av一区二区三区| 久久久久久久久久久久黄色 | 亚洲av夫妻操穴网| 91九色在线| 欧美视频中文字幕区| 中文字幕乱碼在线| 高清不卡一二三区视频......| 成人情色综合网| http://qxhbdz.com| 不卡av在线中文字幕| 日日骚av| 鸥美插入视频| 天天干美少妇一区| 精品国产久热在线观看| 思思热在线视频免费| 亚洲精品国产av天美传媒| 亚洲色诱惑| 国产丝袜美女在线一区| 97欧美综合网| 天堂网 主播 亚洲| xxx亚洲午夜天堂| 欧美一区二区观看在线| 国产男女边吃边摸视频网站| 国产精品一区二区三区在线| 久久天堂网| 色月天AV导航| 亚洲。日韩。欧美| 激情开心五月天| 日韩综合无码色欲vv| 91美女在线| 国产AV人人夜夜澡人人爽麻豆| 97精品国产97久久久久久免费| 青娱乐国产精品| 亚洲天堂久久久久久粉红视频| 色五月激情AV在线| 欧美国产一区二区三区麻豆传媒 | 极品色社| 久久草大香蕉| 蜜桃视频精品一区二区| 色99在线| 六月丁香婷| 国产精品国产拍高清AV| 9久久精品| 四虎影院成年人片| 亚洲一区二区中文字幕| 亚洲一级性爱视频免费看| a片久久久久久久久久久久 | 乱伦日本中文自拍| 日韩电影在线观看网址| 黄片视频观看| 欧美综合国产精品久久丁香| 成人av福利在线观看| 97在线视频观看| 欧美日韩97| 97天天操| 天天日天天干天天操| 人妻久久| 草草草视频在线免费看| 天天射天天操天天干天天吃2018| 亚洲国产成人7777| 成人乱人伦一区二区| 俄罗斯一区二区视频在线观看| 精品无码一区二区三区| 午夜电影在线观看无码专区| 加勒比久久综合网高清| 五月婷婷激情综合| 欧美一级欧美三级在线观看| 福利一级版子| 三四中文字幕| 国产性爱强奸乱伦大全| 99在线无码精品秘 入口黑人| 日韩免费大片一级播放| 亚洲乱码尤物193YW| 97任你吞精| 91操人视频| 95人妻爽爽人人做人人澡 | av毛片aaaaa免费看| 国产精品久久久久久久久久梁医生| 三级日韩一区二区三区| 成人美女av| 婷婷在线视频| 天天日天天舔东京热| 天天色怡春院| 91性网| 亚洲国产精品久久AV| 1769国内精品视频| 五月婷婷五月天| 超碰 另类 欧美| 精彩久久中文| A 天堂| 亚洲少妇综合在线播放| 欧美最婬乱婬爆婬性视频 | 91色综合| AV无码久久久精品| 夜夜狼人妻| 亚洲图片偷拍欧美| 岛国福利在线精品播放| 日韩性爱播放| 久久久男人的天堂| 黄片www视频免费| 国产精品色片一区二区| 欧美爆操91| 男人天堂导航| 欧美色视频在线| 6080yy午夜理论三级一区二区三区无码| 东北老女人的激情视频| 青青草福利视频| 亚洲av影音先锋| 台湾肥佬网一区二区三区| 美女91网| 日韩成人精品视频自拍| 亚爽爽爽爽爽爽爽爽| 久久精品久久久久久久| 无码人妻丰满热妇又大又粗| 国产SV一线| 国产久久久| 亚洲中文字幕网| 无码人妻系列少妇| av在线播放国产一区| 久久超碰爱| 天天综合欧美黑人| 在线国产一区二区av| 操b网站亚洲无码| 热99这里有精品综合久久 | 欧美色偷拍 | 99天堂网| 久久精品28| 九九色精品| 青青草导航在线视频| 东北丰满熟女国产一区 | 精品亚洲一区在线观看| 九久久九精品视频| 午夜小电影在线插入淫高潮| 亚洲av在线免费观看| 2017,超碰| 色99视频| 精品欧美乱码久| 成人性爱电影网| 91综合天天看| 五月婷婷性爱| 国产精品噜噜噜日日日| 蜜桃久久综合视频| 成人羞羞视频国产| 大香蕉中文aV在线| 人人 操人人 操人人| 久久色一区二区| 久久美女国产| 啊啊啊啊啊舒服| 91精品无码人妻系列| 国产97在线播放| 午夜丁香| 日本精品五区| 日日干日日操五月天伦理视频| 欧美gv在线观看| 亚熟hd视频在线| blacked精品一区国产| 欧美色图在线视频少妇| 天天爽天天爽| 囯产精品久久久久久久久久梁医生 | 人妻少妇久久中文| 偷看洗澡一二三区美女| 欧美双插| 劲爆欧美人妖三区91| 欧美麻豆成人同性GⅤ在线| 婷婷性网| 97久久精品国产| 色久桃花影院在线观看| 麻豆天天躁天天揉揉AV| 久热色情精品| 全免费a敌肛交毛片免费| 超碰吊日色| 亚洲熟妇图片| aaaa少妇高潮大片| 超碰91在线| 超碰天天操你比| 亚洲AV免费在线| 搡老熟女免费视频| 激情内射| 人妻美腿丝袜制服诱惑综合天堂-| 天天日天天搞天天干| 欧美日韩系列| 秋霞男人网| 激情久久久| yaouchengrenav| 91在线丝袜| 用力操死我| 久久久国产成人一区二区三区在线| 国产精品久久久久久久久久久久久久吹 | 久久大香蕉97| 人妻少妇三级| 中文字幕一区 二区三四五 区日 日骚| 久草精品国产99| K8久久久久| 97精品国产手机| 97色冈| 国产成人久久久精品免费AV| 三级精品三级在线观看| 天天综合官网| 校园春色 亚洲| 亚洲精品久久一区二区三区蜜桃臀| 韩国久久97| 人人插人人搞人人操| 成人无码在线超碰网| 日韩情色一区二区| 骚鸭AV| 综合激情一一91| 人人澡综合涩| 欧美色66| 熟妇亚洲一区二区三区| 一本一道人妻久久一区二区三区 | 高清无码网址| 色婷婷九月| 大色综合网| 伦伦成年午夜免费视频| 久久欲| AVE乱伦| 色吧 综合| 亚洲色图欧美色图另类图片| 大香蕉淫人网| 人人妻人人玩人人澡人人爽| 91天堂网| 国产激情视频一区区三区| 成人国产二区三区在线,男女精品。| 青青草一区二区三区四| 久久6热精品99视频| 1000午夜黄色| 国产人妻精品一区二区三区秋霞| 亚洲宗合网| 98福利在线视频| 日韩人妻丝袜美腿中文| 欧洲一区二区三区四区在线观看| 劲爆欧美人妖三区91| 天天操天天7| 人妻少妇久久中文| 日韩91网| 欧美激情综合网| 国产成人在线观看网址| 欧美在线永久天堂| 岛国黄| 免费中文在线| 东京热亚洲一区二区| 欧美精品另类人妖xxxx| 你草精品在线视频| 国产精品午夜福利视频| 少妇色欲综合网2| 超碰美国| 亚洲日本激情| WWW黄片COM| 九九九九九九九精品视频| 狼人综合婷婷激情四射 | 淫妻综合网| 女人妻一区| 男人把坤坤插入女人的下体| 超碰 欧美| 91无遮挡| 亚洲成人久久一区二区| 国产av尤物| 啊啊啊啊啊啊啊好爽不要| 亚洲熟女乱色一区二区三区久久久 | 国产白丝网站| 国内毛片热久久思思热| 国产伦乱91| 91老司机在线视频免费观看 | 大香蕉中文| 亚洲国产尤物yw在线观看| 色情五月丁香| 自拍视频大全亚洲专媒视频/一区二区三区 | 91精品成人www| 伊人伊人LD| 91综合网站| 91人妻做a观看视频| 亚洲色图大香| 超碰久久网| 翔田千里AV无码秘 三区| 少妇高潮对白在线观看| 亚洲色堂免费视频| 婷婷丁香人妻 | 熟妇国产免费一区| av三级电影在线播放| 精品伊人久久久大香线蕉小说| 久久9精品视频| 夫妻AV网站| AV天堂国产| 青青草视频久久| 国产AV天美传媒一区二区三区| 家庭乱伦麻豆| 日本高清久久| 色69大色97香蕉| av强奸乱轮| 日本天天吊| 少妇贴图| 无码自拍SM| 成人一级二级| 免费的很黄很污的全部视频| AV一二区| 久久久久亚洲Av无码专区老牛影视| 日韩av在线播放不卡| 四虎国产成人精品免费一女五男| 亚洲色天| 天天综合91在线| 一本大道青青| www.色操逼| 亚洲综合草草| 91精品无码人妻系列| 大肉棒导航| 日韩欧美成人性爱在线| 人妻人人澡人人爽人人| 欧美一级AAAAAAA| 色哟哟国产精品免费网址| 久久啊啊| 久久久久久亚洲精品不卡人乳| 国内毛片四区| 九色PORNY9l原创自拍| 91色射| 人妻中文在线| 人妻第一页| 淫妻综合网| 日日超碰亚洲| 日韩精品高清资源在线| 国产亚洲深夜激情| 精品亚州18| www.99中文字幕| 亚洲高清在线se| 欧美日韩岛国大片在线观看| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 日本人妻伦在线中文字幕| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 久久色一区| 强奸抽插av| 欧美 熟女 日韩| 蜜乳AV一区二区三区四| 大香蕉99re| 加勒比无码一区二区三区| 加勒比伊人| 久久久久久中文版| 91成人在线免费视频| 99热在线只有精品| 欧美久久草熟女| 偷拍三区| 日本高清视频在线观看黄已三辽| 91五月天| 国产v片在线免费观看| 国产日韩欧美| 欧美躁死她一区二区| A级国产欧美激情在线| 和协影院中文字幕三区| 日本中文字幕在线视频| 亚洲情色综合| 欧美在线中M| 日本在线一二| 亚一综合久久久久久久久久| 校园春色AV天堂| 97免费视频网| 91久久婷婷| gogogo免费高清看中国国语| 青青久草| 国产精品suv一区| 五月天色图| wwwxxx日本爽| 九九九一二三| 北条麻妃性愛视频| 91亚洲黑人| 强奸乱伦大香蕉网| 欧美真人抽搐一进一出gif| 久久精品99久久久久久| 夜夜中出国产| 91人妻尻屄视频| 在线a亚洲视频播放在线| 国产精品色| 综合网久久| 青青草操逼逼视频| 国产强奸超碰AV| 国产精品国产亚洲区艳妇糸列| 色欧美色交综合| 日韩精品99久久久久久中文字幕| 婷婷五月花| 五月丁香社区婷婷日韩欧美精品影院 | 亚洲天天做日日做天天谢日日 | 国产免费久久久久| 日韩性爱人人爱人人操| 国产内射爽爽大片| 可乐操亚洲蜜911| 久久久噜噜噜久久人妻| 91性生活久久久| 91N欧美| 中文字幕成人| 一区二区三区精品视频| 无码操逼网| 国产精品久久久久久高清无码免费看| 人人操人人摸超碰| 好湿好紧视频| 99福利社| 97欧美久久久久久久| 男生女生啊啊啊啊| 欧美三级免费伊人| 人妻天天爽夜夜爽爽| 天天干天天干天天干| 自拍鲍鱼一区在线高清观看免费| 国产精品一级毛片不卡视| 一区二区精品日韩欧美在线观看 | 91 丝袜在线| 久久久久久性爱片| 国产精品情侣啪啪| 天天操天天射青青草| 亚洲91少妇| 久久超碰爱| 日韩精品区二区三区不卡| 91色婷婷综合久久中文字幕二区| 亚洲Av无码成人精品国产| 久久久亚洲欧美综合| 亚洲欧洲精品视频发布| 国产精品激情久久久久久久| 欧美少妇性爱网站| 日本人人操人人操| 亚洲国产一区二区三区四区国产| 久久久精品视频免费观看| 亚洲精品第一| 国产成人无码网站在线视频| 久久五月婷| 91色综| 啊好爽受不了无码| 亚州色图欧美| 天美麻豆黄色录像| 就去色综合| 精品国产乱码久久久久久网站入口| 欧美色视| 亚洲AV成人无码一二三久久| 欧美日韩亚洲一区二区在线观看| 久久av成人无码免费| 久操精品网| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | www.99在线| 五月久久HDAV| 99蜜桃臀久久久欧美精品网站| 美女91av| 欧美天天搞| 国产极品粉嫩馒头一线天av| 亚洲中文一区二区三区| 综合五月婷婷| 精品无吗久久| 丰满熟女人妻一区二区三五十一路| 久久久天堂| 一区二区三区免费视频入口| 操逼操网| 欧美精品人妻视频| 久久一区二区加油站| 久草这里只有精品 | 美女超碰978| 先锋音影AV| 欧美性性性| 国产精品久久久久久久AV大片| 插欧洲美女欧美精品| 亚洲天堂女优在线| 欧美瑟综合| 亚洲无码国产探花在线观看| 一区二区三区视频在线观看免费| 丝袜制服字幕在线| 91精品在线播放| 久久久久久久强迫| 日本韩欧美在线播放a| 人人操天天爽| 亚洲一区二区av| 高清国产成人无码| 色色色色色色色色色色色色色色综合 | 亚洲天堂电影网99999| 免费看片黄| 五月婷婷激情网| 熟妇国产免费一区| 翔田千里无码一区| 99免费视频| 天天天堂影视日韩亚洲91| 9久在线视频只有精品| 国产亚洲禁久一区二区| 国产青视频| 久久久久亚洲Av无码专区老牛影视 | 加勒比无码一区二区三区| 亚洲综合大片| www.yeyecao| 99re这里只有精品中心播放| 情色大香蕉| 操逼视频亚洲| 影音先锋一区二区在线资源| 欧美欧美啪啪视频| 天天综合91在线| 东京热91| 精品国产肉丝袜在线拍国语| 香蕉免费一区二区三区不读| 国产美女口爆吞精视频| 大稥蕉免费视频这里只有精品| 亚洲 中文 欧美 日韩 在线| 国产无马视频| 国产熟女二区| 黄色电影在线播放综合网站 | 久久久久久久九九九九九九| 精品国产网站| 久久伊人最新网址视频| 翘臀vidoes| 国产精品乱码久久久久| 久久伊人大香蕉| 强乱老妇中文字幕| 亚州综合色| 日韩av不卡在线观看| 伊人欧美大香蕉视频| 男人的天堂2000| 国产人妻精品久久久一区二区三区 | 天天舔天天 | 91狠狠综合久久| 97人人射| 丝袜 中出 制服 人妻 美腿 中文字幕| 18禁超污无遮挡无码免费网| 蜜桃精品视频一区二区三区| 国产综合永久精品日韩鬼片| 人人摸人人舔一区二区| 操逼逼无码| 九九九偷拍| 五月激情综合网| 五月丁香激情四射| 9 7超碰在线免费观看| 日韩免费高清大片在线| 中文字幕十五区| 午夜久久无码1000合集| 岛国天天午夜影院传媒网| 开心五月激情网| 美女久久久| 日韩传媒在线| 中国东北熟女老太婆内谢| 97精品视频在线播放| 屌逼传媒| 国产精品探花色| 天操天操夜操夜月月年年操操| 久久久精品成人国产| 男人的天堂久久久| 亚洲 欧美 小说| 精品一二三区久久AAA片| 国产农村妇女毛片精品久久| 久久久999网站| 亚洲精品人妻在线| 天天天干977| 久久最新视频免费观看| 亚洲欧美国产成人综合不卡| 色九久| 精品乱码久久久久| 天天日天天色| 无码人妻精品一区二区中文| 成年在线视频日本亚洲在线视频区精品江靖宇公司| 天天干美少妇一区| 天天草夜夜草高潮片| 丝袜美腿91| 久久曰曰| 亚洲va综合va国产va中文| 国产亚洲性生活视频播放| 一摸二插三插| 影音综合网| 在线观看综合精品亚洲| 在线日韩精品一区二区三区| 亚洲欧美91√| 欧美熟妇精品黑人巨大一二三区| 久久香蕉综合一本到3atv| 男人的天堂网页| 国偷自 一区| 欧美少妇一区二区三区| 在线观看综合精品亚洲| 黑人免费福利视频| 一本大道青青| 欧美 亚洲 另类 综合| 人妻啊啊人妻啊| α√在线| 国产一区二区成人av在线播放| 加勒比无码毛片| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 91热热色| 国产和美国毛片| 天天日日日射| 成人贴图日韩欧美| 大香蕉久| 深夜激情无码| 国产探花精品在线| 国产亚洲深夜激情| 亚洲色图欧美激情| 精品人妻久久久久一区二区三区| 天美欧美国产| 九九英色视频| 亚洲一二三精品久久网| 丁香五月影院| 任你爽视频| 日本韩欧美在线播放a| 在线观看亚洲专区| 亚洲第一精品在线视频| 国产美女口爆吞精视频| 91内射| 福利视频网站| 97综合国产| 九久精品| AV中亚| 欧美亚洲图片| 亚洲久久久久| 偷拍盗拍亚洲色图图片| 好涩综合| 麻豆成人影音在线| 色五月av| 精品人妻av区天天看片| 屁股久久久久久| 亚洲无 码A片在线观看麻豆| 91欧美亚洲| 久久精品国产Aⅴ| 91综合在线| 韩国三级一线观看久| 综合影院永久入口国产| 日韩欧洲操屄视频| 成人av影院在线观看| 淫荡熟女乱伦网| 丁香啪啪| 男人的天堂不卡一区二区| 99色综合| 久久久久骚| 国产久久日韩网站导航| 神马久久久久久久久久| 亚洲大色堂| 亚洲熟女偷拍在线观看| 欧美日韩精品久久久久东北老熟妇| 后入福利| 欧美亚洲中文字幕| 久久久96| 国产对白刺激视频| 在线中文字幕极品av| 国产成人无码网站在线视频| 色情成人五月天| 69精品在线| 日han少妇无码| 青青草日韩免费观看高清在线| 欧美日日人人天天| 女人综合网| 国产精品久久久无码aV去| 很黄很色的视频在线观看| 黄aaaaaaaaaaaaaaaaaa色网站| 激情五月天综合网| 少妇人妻无码| 亚洲在线综合| 性无码专区2020| 国产亚州高清国产拍精| 久久精品国产精品亚洲艾通辽熟妇 | 五月天婷婷久久| 九九热免费在线国产视频伊人五月| 久久伊人青青草| 校园春色美腿丝袜| 日韩免费av片高清无码| 男男H黄动漫啪啪无遮挡网站| 欧美亚洲日韩人妻在线观看| 成人日韩中文字幕| 欧美精品亚洲精品日韩传电影| 久久加勒比| 五月丁香拍拍激情综合三级| 丁香五月色情| 性性欧美| 啊啊啊啊好爽好舒服一区二区易域| 超碰精品国产无码| 丁香九月激情啪| 中文字幕片| 深喉吞精| 黄片色区软件| 伊人久久亚洲中文字幕| 青草伊人久久| 特级特黄一级毛片免费| 色色色综合网| 嗯~啊~快点 死我视频免费看网站| av天堂电影网| 一起草精品人妻| 乱码熟妇人妻久久久| 国产白丝AV| 国产AV毛片| 啊嗯好大视频在线观看| 97人人爱人人乐| 家庭乱伦性爱av| 亚洲综合113页| 欧美色图电影| 性爱1区| 日本熟妇色熟妇在线视频播放| 91色综合| 婷婷尹人大香蕉免费| 夜夜爽夜夜摸夜夜操免费视频| 超碰在线欧美性爱激情| 日本高清电影欧美色图| 天天影视综合色| h无码动漫在线观看| 禁十八久久| 少妇久久| 欧美78p| 欧美天天干| 成人看片网站| 强乱老妇中文字幕| 久久精品国产72国产精品福利| 骚熟女吞| 日韩欧美大力操| 75大香蕉| 欧美性爱第一页久久| 天天综合AV| 男人午夜天堂| 天天肏美女| 色姑娘综合网| 综合久草| 久操精品| 亚洲免费精品一区| 国产1024在线播放| 玖玖爱综合| 国产第12页| 成人精品一区二区三区| 精品无码不卡视频| 天天内射| 欧美另类综合久久| 伊人在线大香蕉视频久久| 国语精品内射在线观看| 国产一区二区精品在线视频| 欧美性爱中文字幕无线码| 色拍偷亚洲| 另类 日韩 熟女| 国产精品一二三| 五月天婷婷成人网| 大香蕉中文在线| 色精品极品| 午夜亚洲WWW湿好大| 午夜精品久久久99| 91社操逼| 亚洲做性| 能看的av| 91夜色| 日韩 欧美 校园一区| 国产av强奸美女| 18禁久久| 又大又白奶子| 91精品人妻偷情| 婷婷精品国产一区二区三区日韩| 欧美丰满少妇xx高潮| 风月影院男女十八禁| 探花精品视频| 九九碰九九爱97超| 99热导航| 动漫爆乳3D奶水一区在线观看| 欧美日韩亚洲少妇寂寞影院正在播放| 五月天综合网| 日本成熟少妇A∨网站| 欧美日韩亚洲五月天婷婷| 国产一区二区啪啪视频| 天天综合97| 色香在线| 伊人激情| 中文字幕人成乱码熟女香港| 黄色av播放免不| 欧美亚洲国内自拍| 台湾成人无码AV| 玖玖综合网| 蜜臀久久在线视频| 女人爽到高潮潮喷18禁网站| 大香蕉中文| 4虎在线视频| 亚洲精品久| 国产精品激情久久久久久久| 久久久91| 久偷拍欧美日韩三区| 丁香六月婷婷综合| 一区二区三区视频国产免费| 精品少妇99| 色婷婷淫色网| 玖玖97综合 | 日日干夜夜操视频h| 久久久夜夜嗨免费视频| 亚洲**2021在线观看| 日韩欧美麻豆 | 国产性感在线观看| 女人爽到高潮潮喷18禁网站| 黄片免费日韩| 国产一进一出视频网站| 国产白丝AV| 粉嫩久久久久| 人人操天天爽| 久99视频| 日本高清_区二区三区| 国产女同在线观看视频| 亚洲九九视频| 97频视在线| 嗯嗯啊啊亚欧精品| 欧美色图天堂在线| 久久精品色欧美aⅴ一区二区| 亚洲97成人在线观看| 人人妻人人澡人人爽久久av| 91处女在线视频| 最新精品久久蜜桃 | 日韩激情中文字幕有码| 国产精品一区二区亚洲人成毛片| 三及片网站| 久肏视频字幕| 天美传媒av一区二区| 天天做天天爱天天爽AV| 97国产色综合| 精品久久視頻在线| 色人久久| 天天躁日日躁AAA片李宗瑞| 国产91啪| 亚洲国产奇米影视久久| 国产成人精品必看| 国产亚洲精品A在线观看下载| 69麻豆天美| 97亚洲欧美| 91美女小视频| 啊啊啊啊好多水| 亚洲欧美清纯| 91熟女丨老女人| 蜜桃天美传媒AV一区二区三区| 无码人妻系列少妇| 亚洲精品不卡一二三区| 亚洲 欧美 另类 日韩 人妻一区 | 中文字幕av亚洲精品| 思思热国产高清| 亚洲天天操| 蜜臀一区二区三区在线| 亚洲色狠| 操屄日韩| 国产精品永久免费10000| 久久久久久亚洲Av无码| 另类TS人妖一区二区三区| 日韩精品在线视频在线观看| 中文字幕一区二区日韩网| 不卡av在线中文字幕| www.大香| 免费av大片| 色999亚洲人成色| 欧美亚洲综合色|