PLC走M(jìn)odbusTCP通訊實(shí)例詳解)
簡(jiǎn)介面向工業(yè)自動(dòng)化與PLC編程學(xué)習(xí)者圍繞多臺(tái)西門子1200PLC之間的以太網(wǎng)通信需求完整演示了ModbusTCP協(xié)議原理、網(wǎng)絡(luò)組態(tài)、通信功能塊調(diào)用以及錯(cuò)誤排查思路。壓縮包為ZIP格式包含55個(gè)文件以TIA Portal V14工程文件、PLC變量表配置、HMI界面圖片、現(xiàn)場(chǎng)設(shè)備描述文件與轉(zhuǎn)換日志樣式表等為主整體大小2.08MB目錄層級(jí)清楚便于按模塊查閱。方案覆蓋從IP地址規(guī)劃、服務(wù)器與客戶端角色分配、寄存器讀寫請(qǐng)求到數(shù)據(jù)長(zhǎng)度設(shè)置的完整鏈路核心工程可導(dǎo)入博途軟件讀者能對(duì)照理解通信功能塊的具體用法同時(shí)工程雖指向S7-1500但其通信庫(kù)應(yīng)用方式對(duì)S7-1200同樣具有參考價(jià)值。已有7746人學(xué)習(xí)適合需要從零搭建多PLC以太網(wǎng)通信或排查連接超時(shí)、響應(yīng)異常等問題的工程技術(shù)人員可結(jié)合包內(nèi)工程文件與日志記錄快速上手。 前陣子做了個(gè)裝配線的改造項(xiàng)目一條線上三臺(tái)西門子1200PLC各自管一段工序但物料流轉(zhuǎn)數(shù)據(jù)、設(shè)備狀態(tài)、產(chǎn)量計(jì)數(shù)都得實(shí)時(shí)打通。客戶點(diǎn)名要求用ModbusTCP因?yàn)樯衔粰C(jī)組態(tài)王、車間MES、還有幾臺(tái)第三方設(shè)備都要從這個(gè)網(wǎng)絡(luò)里取數(shù)S7協(xié)議雖然好使但出了西門子生態(tài)就玩不轉(zhuǎn)。整個(gè)調(diào)試下來踩了不少坑從指令參數(shù)、地址映射到輪詢機(jī)制、掉線重連都有值得記一筆的地方。這篇就把整個(gè)實(shí)例拆開講透給后面要做多臺(tái)1200走M(jìn)odbusTCP通訊的朋友做個(gè)完整參考。1. 方案選型多臺(tái)1200互聯(lián)為什么最終落在ModbusTCP上1.1 擺在面前的三條路S7-1200之間做通訊方案其實(shí)不止一種我當(dāng)時(shí)對(duì)比了三條路第一種S7協(xié)議PUT/GET。這是西門子自家的東西組態(tài)最簡(jiǎn)單在博途里勾一下允許來自遠(yuǎn)程對(duì)象的PUT/GET通信訪問然后調(diào)用PUT、GET指令就能讀寫對(duì)方DB塊。但有個(gè)硬傷只有西門子設(shè)備之間能這么玩。項(xiàng)目里還有組態(tài)王、掃碼槍、第三方控制器它們不認(rèn)S7協(xié)議這條路直接堵死。第二種Profinet IO。把其中一臺(tái)1200當(dāng)IO控制器其他當(dāng)智能設(shè)備通過共享IO或智能設(shè)備方式交換數(shù)據(jù)。這種方式實(shí)時(shí)性最好適合需要硬實(shí)時(shí)同步的場(chǎng)景。但配置復(fù)雜度高而且對(duì)第三方設(shè)備的開放性依然有限不適合作為統(tǒng)一的數(shù)據(jù)交互出口。第三種ModbusTCP。Modbus協(xié)議是工業(yè)以太網(wǎng)的事實(shí)標(biāo)準(zhǔn)組態(tài)王、Kepserver、AB變頻器、各種儀表全都支持。S7-1200從固件4.0開始內(nèi)置了MB_CLIENT和MB_SERVER指令不需要額外硬件。雖然實(shí)時(shí)性不如Profinet IO但做數(shù)據(jù)采集、狀態(tài)監(jiān)控、參數(shù)下發(fā)這類應(yīng)用完全夠用。最終就是它了。1.2 ModbusTCP的協(xié)議底子夠不夠用很多人一聽Modbus就覺得是老古董其實(shí)ModbusTCP在工業(yè)以太網(wǎng)層面的應(yīng)用非常成熟本質(zhì)就是Modbus RTU報(bào)文套了個(gè)TCP殼。報(bào)文結(jié)構(gòu)分兩部分MBAP報(bào)文頭7字節(jié)加PDU功能碼加數(shù)據(jù)。MBAP頭里有事務(wù)處理標(biāo)識(shí)符、協(xié)議標(biāo)識(shí)符固定為0、后續(xù)字節(jié)長(zhǎng)度、單元標(biāo)識(shí)符。這個(gè)單元標(biāo)識(shí)符挺關(guān)鍵它和RTU模式下的從站地址對(duì)應(yīng)。雖然TCP連接本身已經(jīng)確定了通信對(duì)象但單元ID可以用于穿過網(wǎng)關(guān)訪問底層串行設(shè)備或者在一臺(tái)服務(wù)器上做功能分區(qū)。實(shí)際操作中讀寫寄存器用到的功能碼就那幾個(gè)03讀保持寄存器、04讀輸入寄存器、06寫單個(gè)寄存器、16寫多個(gè)寄存器。1200PLC的MB_SERVER指令把保持寄存器區(qū)和輸入寄存器區(qū)都映射到了DB塊上所以只要把數(shù)據(jù)按字組織好外部設(shè)備用標(biāo)準(zhǔn)Modbus功能碼就能直接讀寫兼容性非常穩(wěn)。注意ModbusTCP走的是TCP 502端口做跨網(wǎng)段訪問或者經(jīng)過防火墻時(shí)一定要確認(rèn)502端口沒有被攔。2. 服務(wù)端配置1200如何把數(shù)據(jù)掛到網(wǎng)絡(luò)上2.1 MB_SERVER指令與數(shù)據(jù)區(qū)規(guī)劃多臺(tái)1200通訊首先要明確角色。當(dāng)時(shí)方案是每臺(tái)設(shè)備都做服務(wù)端上位機(jī)和主站PLC通過ModbusTCP去讀寫它們。這樣每臺(tái)1200只需要在自己的程序里調(diào)用一個(gè)MB_SERVER指令把需要共享的數(shù)據(jù)掛出來。MB_SERVER指令的調(diào)用有幾個(gè)關(guān)鍵點(diǎn)。背景DB必須獨(dú)立分配不能多個(gè)調(diào)用共用。接口參數(shù)里需要指定硬件接口1200只有一個(gè)Profinet口選PROFINET接口即可。MB_HOLD_REG指向保持寄存器數(shù)據(jù)區(qū)MB_HOLD_LEN定義寄存器數(shù)量這兩個(gè)參數(shù)決定了外部設(shè)備能讀到多大的數(shù)據(jù)區(qū)。我習(xí)慣的做法是單獨(dú)建一個(gè)共享數(shù)據(jù)DB比如DB100里面用數(shù)組或者結(jié)構(gòu)體定義所有需要對(duì)外交互的數(shù)據(jù)。保持寄存器數(shù)據(jù)區(qū)用Array[0..99] of Word這樣地址映射直觀。如果想讀BOOL量比如設(shè)備運(yùn)行狀態(tài)、故障標(biāo)志可以用MB_SERVER的功能碼01或02直接讀位但前提是把這些位集中到一個(gè)連續(xù)的Word數(shù)組里通過位操作賦值。實(shí)際操作中不建議把MB_HOLD_REG直接指向一個(gè)結(jié)構(gòu)體因?yàn)榻Y(jié)構(gòu)體內(nèi)部有數(shù)據(jù)類型對(duì)齊問題地址排布不直觀外部組態(tài)軟件做映射時(shí)會(huì)很痛苦。用純Word數(shù)組是最省心的每個(gè)字對(duì)應(yīng)一個(gè)Modbus寄存器地址想讀32位浮點(diǎn)數(shù)就連續(xù)占兩個(gè)字高低字順序自己在程序里處理好。2.2 地址映射里最容易踩的偏移坑Modbus地址偏移是新手最容易栽跟頭的地方也是組態(tài)王、Kepserver這類上位機(jī)讀不到數(shù)的頭號(hào)原因。Modbus協(xié)議里保持寄存器的地址是從40001開始編號(hào)的比如40001、40002、40003這樣。但PLC內(nèi)部和MB_SERVER指令的尋址卻是從0開始的。也就是說外部設(shè)備訪問的40001對(duì)應(yīng)的是MB_HOLD_REG指向區(qū)域里的第一個(gè)Word即寄存器地址偏移040002對(duì)應(yīng)偏移1以此類推。也就是說PLC側(cè)根本不需要去管40001這個(gè)4開頭的地址只要在MB_SERVER的地址映射表里把偏移理順就行。但在組態(tài)王里配置變量時(shí)寄存器地址必須寫40001、40002這種完整地址而且很多組態(tài)軟件還有地址偏移1的二次偏移設(shè)置各個(gè)軟件還不一樣這塊必須仔細(xì)看手冊(cè)。比如組態(tài)王里訪問1200模擬量數(shù)據(jù)如果PLC側(cè)數(shù)據(jù)存放在保持寄存器偏移10的位置組態(tài)王里寄存器地址應(yīng)該填40011。但如果勾選了寄存器地址偏移選項(xiàng)且偏移量為1那就要填40010。這個(gè)差異非常隱蔽我當(dāng)時(shí)就卡在這里半天后來用Modbus Poll逐地址掃描才定位到。提示聯(lián)調(diào)前先用Modbus Poll或ModScan這類調(diào)試工具直接掃一遍PLC的保持寄存器區(qū)確認(rèn)哪些偏移有數(shù)據(jù)、數(shù)值對(duì)不對(duì)。這一步能省下后面百分之八十的排查時(shí)間。3. 客戶端設(shè)計(jì)多臺(tái)設(shè)備輪詢的完整方案3.1 多實(shí)例并行連接還是單實(shí)例切換如果只有一臺(tái)PLC當(dāng)主站去讀其他PLC客戶端用MB_CLIENT指令。但MB_CLIENT每次只能維護(hù)一個(gè)TCP連接面對(duì)多臺(tái)從站時(shí)有兩種做法第一種單MB_CLIENT實(shí)例切換連接。一個(gè)MB_CLIENT通過修改CONNECT結(jié)構(gòu)體里的RemoteAddress來切換目標(biāo)IP每輪詢完一臺(tái)就斷開重連下一臺(tái)。優(yōu)點(diǎn)是只占一個(gè)連接資源、程序量小。缺點(diǎn)是每次切換都有TCP建連和斷連開銷而且重連期間數(shù)據(jù)是空窗期輪詢周期會(huì)被拉長(zhǎng)。實(shí)測(cè)下來3臺(tái)從站單實(shí)例輪詢完整周期要400毫秒以上而且連接不穩(wěn)定時(shí)還會(huì)翻倍。第二種多MB_CLIENT實(shí)例并行連接。每個(gè)從站配一個(gè)獨(dú)立的MB_CLIENT實(shí)例每個(gè)實(shí)例有自己獨(dú)立的背景DB和連接ID三個(gè)連接同時(shí)保持用定時(shí)器輪流觸發(fā)各自的REQ。優(yōu)點(diǎn)是連接保持不斷開輪詢周期能壓到100毫秒以內(nèi)數(shù)據(jù)新鮮度好。缺點(diǎn)是程序塊占用多但只要PLC存儲(chǔ)空間夠這不是問題。我當(dāng)時(shí)選的是第二種。三臺(tái)從站三個(gè)MB_CLIENT實(shí)例連接ID分別是1、2、3每個(gè)實(shí)例的CONNECT結(jié)構(gòu)體里填對(duì)應(yīng)對(duì)端IP和端口502。這樣做有一個(gè)額外好處單臺(tái)從站故障不會(huì)影響其他兩臺(tái)的數(shù)據(jù)刷新故障隔離性好。3.2 輪詢邏輯、超時(shí)與重連機(jī)制多實(shí)例并行連接確定后剩下就是輪詢邏輯怎么設(shè)計(jì)。很多人用MOVE指令把REQ引腳常置TRUE讓MB_CLIENT不停發(fā)請(qǐng)求。這在網(wǎng)絡(luò)穩(wěn)定時(shí)沒問題但一旦對(duì)端無(wú)響應(yīng)REQ一直為TRUE會(huì)導(dǎo)致指令內(nèi)部不斷重試狀態(tài)字被錯(cuò)誤碼占住后續(xù)請(qǐng)求全卡死。正確做法是用沿觸發(fā)。我習(xí)慣建立一個(gè)100ms的循環(huán)定時(shí)器每到一個(gè)周期依次對(duì)三臺(tái)從站的REQ發(fā)一個(gè)上升沿。然后監(jiān)控每臺(tái)從站的DONE和ERROR輸出DONE為TRUE說明本次請(qǐng)求完成可以更新數(shù)據(jù)有效標(biāo)志ERROR為TRUE說明通訊異常記錄錯(cuò)誤碼并啟動(dòng)重連邏輯。重連機(jī)制是另一個(gè)關(guān)鍵。TCP連接斷掉后MB_CLIENT不會(huì)自動(dòng)恢復(fù)必須把DISCONNECT引腳置TRUE主動(dòng)斷開等連接狀態(tài)寄存器歸零后再重新觸發(fā)連接。我在程序里做了個(gè)狀態(tài)機(jī)正常態(tài)、請(qǐng)求態(tài)、等待響應(yīng)態(tài)、錯(cuò)誤態(tài)、斷開重連態(tài)。錯(cuò)誤連續(xù)出現(xiàn)3次就進(jìn)入斷開重連態(tài)強(qiáng)制DISCONNECT等待2秒后重新置FALSE讓指令重新建連。另外MB_CLIENT的REQ觸發(fā)間隔不宜過快。如果從站PLC的掃描周期是10ms主站這邊100ms輪詢一次沒問題。但如果把間隔壓到20ms以下從站可能來不及處理請(qǐng)求反而觸發(fā)ERROR。穩(wěn)妥的做法是從100ms起步根據(jù)實(shí)際響應(yīng)時(shí)間逐步下調(diào)。3.3 關(guān)鍵參數(shù)怎么定MB_CLIENT指令的參數(shù)里有幾個(gè)值的設(shè)定直接影響通訊質(zhì)量。CONNECT結(jié)構(gòu)體里ConnectionType必須是16#0B代表TCP連接ActiveEstablished必須為TRUE因?yàn)?200做客戶端是主動(dòng)建連方。RemotePort填502RemoteAddress填對(duì)端IP。InterfaceId要跟硬件組態(tài)里的Profinet接口一致填64對(duì)應(yīng)CPU本體接口在這個(gè)場(chǎng)景下沒問題。TIME_OUT參數(shù)是響應(yīng)超時(shí)時(shí)間默認(rèn)值我記得是1000ms左右但實(shí)際使用中我設(shè)成500ms就夠用了。設(shè)太長(zhǎng)會(huì)讓錯(cuò)誤檢測(cè)變慢設(shè)太短網(wǎng)絡(luò)抖動(dòng)時(shí)容易誤報(bào)超時(shí)。如果鏈路經(jīng)過多級(jí)交換機(jī)可以適當(dāng)加大到800ms到1000ms。DATA_PTR指向的數(shù)據(jù)緩沖區(qū)大小要和你讀寫的數(shù)據(jù)量匹配。如果一次性讀10個(gè)字緩沖區(qū)就要分配至少20個(gè)字節(jié)。緩沖區(qū)太小會(huì)導(dǎo)致數(shù)據(jù)截?cái)喽疫@種錯(cuò)誤在調(diào)試工具里很難看出來因?yàn)橥ㄓ崰顟B(tài)一切正常只有數(shù)據(jù)是錯(cuò)的。4. 聯(lián)調(diào)階段最常見的問題與排查實(shí)錄4.1 組態(tài)王讀不到數(shù)據(jù)先查這四個(gè)地方項(xiàng)目里組態(tài)王一直讀不到其中一臺(tái)1200的數(shù)據(jù)其他兩臺(tái)的都正常。折騰了一上午最后定位到四個(gè)原因按排查順序列出來給遇到同樣問題的人參考。第一IP地址和端口確認(rèn)。從站PLC的Profinet口IP必須能和組態(tài)王所在電腦互通。這個(gè)看似基礎(chǔ)但現(xiàn)場(chǎng)改過IP后忘了重啟PLC的案例我見過太多次。第二寄存器地址偏移。組態(tài)王里的寄存器地址和PLC側(cè)保持寄存器偏移的對(duì)應(yīng)關(guān)系各家軟件有各自的地址體系一定要確認(rèn)地址填的是從40001開始還是從0開始。第三單元ID匹配。ModbusTCP報(bào)文里單元ID默認(rèn)是1但部分組態(tài)軟件配置里可以改。如果PLC側(cè)的MB_SERVER沒有對(duì)單元ID做特殊限制默認(rèn)接受全部那單元ID填255也認(rèn)但有些軟件會(huì)把這個(gè)值原樣發(fā)過去遇到嚴(yán)格校驗(yàn)的設(shè)備就通信失敗。第四數(shù)據(jù)長(zhǎng)度類型。組態(tài)王里定義變量時(shí)要選對(duì)數(shù)據(jù)類型比如PLC側(cè)是Word數(shù)組組態(tài)王里對(duì)應(yīng)無(wú)符號(hào)16位整數(shù)如果是32位浮點(diǎn)數(shù)組態(tài)王里要選Float還要注意高低字順序。很多情況下通訊正常但顯示數(shù)值完全不對(duì)就是數(shù)據(jù)類型或字節(jié)序沒有對(duì)上。4.2 通訊時(shí)斷時(shí)續(xù)、重啟才能連上一分鐘這個(gè)問題的描述很典型西門子TCP只有每次重啟的時(shí)候才能連上一分鐘然后徹底斷掉。我排查過類似案例最后定位到幾個(gè)核心原因第一客戶端不斷重連導(dǎo)致TCP連接堆積。有些上位機(jī)或主站PLC在通訊異常時(shí)會(huì)以極快的頻率反復(fù)發(fā)起連接TCP協(xié)議棧里殘留大量TIME_WAIT狀態(tài)的連接占滿連接表后新連接無(wú)法建立。處理辦法是在客戶端增加連接失敗后的退避延時(shí)比如第一次失敗等1秒第二次等2秒指數(shù)退避到最大30秒。第二MB_CLIENT的DISCONNECT沒有正確使用。如果通訊異常后客戶端沒有主動(dòng)置位DISCONNECT斷開舊連接TCP連接資源得不到釋放下一次建連時(shí)就會(huì)被協(xié)議棧拒絕。這也是為什么重啟PLC以后能恢復(fù)一段時(shí)間因?yàn)橹貑⑶蹇樟诉B接表。第三防火墻或殺毒軟件攔截。如果上位機(jī)是Windows系統(tǒng)Windows防火墻默認(rèn)會(huì)攔截來自PLC的主動(dòng)連接。解決方法是放行502端口或者直接把PLC的IP加入防火墻白名單。4.3 交換機(jī)和布線環(huán)節(jié)的隱性故障ModbusTCP本質(zhì)是TCP/IP通訊物理層的穩(wěn)定性和交換機(jī)配置直接影響通訊質(zhì)量。很多PLC通訊問題查到最后根子都在網(wǎng)絡(luò)基礎(chǔ)設(shè)施上。有一個(gè)案例設(shè)備用的是POE供電交換機(jī)PLC網(wǎng)口直接插上去通訊時(shí)好時(shí)壞。其實(shí)POE交換機(jī)的PSE檢測(cè)機(jī)制對(duì)非POE設(shè)備是兼容的不會(huì)給不帶POE的端口供電但有些質(zhì)量較差的POE交換機(jī)端口在檢測(cè)過程中會(huì)產(chǎn)生電平擾動(dòng)導(dǎo)致網(wǎng)絡(luò)閃斷。解決方法是把PLC和交換機(jī)之間的網(wǎng)線換成屏蔽雙絞線并確認(rèn)交換機(jī)端口強(qiáng)制為10/100M自適應(yīng)不要開節(jié)能以太網(wǎng)功能。另外網(wǎng)線長(zhǎng)度超過80米后信號(hào)衰減明顯現(xiàn)場(chǎng)布線如果不可避免要走遠(yuǎn)距離中間必須加工業(yè)級(jí)交換機(jī)做中繼。還有接地問題網(wǎng)線的屏蔽層在兩端都接地容易形成地環(huán)路電流工業(yè)現(xiàn)場(chǎng)建議單端接地。這些雖然看起來是弱電范疇但實(shí)際調(diào)試中影響非常大。5. 現(xiàn)場(chǎng)調(diào)試流程與一套穩(wěn)當(dāng)?shù)恼{(diào)試順序5.1 從Modbus Poll到組態(tài)王的分步驗(yàn)證調(diào)試這套系統(tǒng)我建議按下面的順序走可以最大限度減少排查難度第一步物理層確認(rèn)。ping通每臺(tái)PLC和上位機(jī)確認(rèn)網(wǎng)絡(luò)連通性。第二步服務(wù)端單獨(dú)驗(yàn)證。用Modbus Poll連接每臺(tái)從站1200手動(dòng)設(shè)置寄存器地址和讀取長(zhǎng)度逐個(gè)確認(rèn)數(shù)據(jù)區(qū)數(shù)值正確。這一步能確認(rèn)PLC側(cè)MB_SERVER配置和地址映射都沒問題。第三步主站PLC輪詢驗(yàn)證。在主站里下載MB_CLIENT程序用手持調(diào)試面板或上位機(jī)監(jiān)控MB_CLIENT的DONE、ERROR和讀取到的數(shù)據(jù)緩沖區(qū)確認(rèn)三臺(tái)從站的數(shù)據(jù)都能正常刷新。第四步組態(tài)王/Kepserver對(duì)接。把數(shù)據(jù)源指向主站PLC確認(rèn)變量地址和數(shù)據(jù)類型配置正確核對(duì)每一個(gè)點(diǎn)位。第五步整體壓力測(cè)試。連續(xù)運(yùn)行幾個(gè)小時(shí)觀察是否有閃斷、數(shù)據(jù)跳變、超時(shí)報(bào)警。期間最好錄一下通訊日志方便事后分析。這套順序的核心邏輯是先把底層通訊驗(yàn)證到百分之百可靠再往上疊加應(yīng)用層配置。跳步的后果就是問題發(fā)生時(shí)不知道是PLC配置的問題還是上位機(jī)配置的問題。5.2 給后來者的一些提醒整個(gè)項(xiàng)目落地后有幾個(gè)體會(huì)想分享。DB塊的數(shù)據(jù)區(qū)規(guī)劃要留余量。當(dāng)時(shí)規(guī)劃保持寄存器只用了60個(gè)字但數(shù)組開到了100個(gè)后來增加監(jiān)控點(diǎn)位時(shí)完全不用改從站程序只改上位機(jī)組態(tài)就行。做工業(yè)項(xiàng)目一定要想著未來的變更成本。每個(gè)從站的共享數(shù)據(jù)區(qū)里建議固定一個(gè)區(qū)域放心跳計(jì)數(shù)。主站每輪詢成功一次就加1從站可以監(jiān)控這個(gè)數(shù)值是否持續(xù)變化來判斷主站是否在線。這個(gè)機(jī)制在調(diào)試多臺(tái)通訊時(shí)非常有用能快速定位是哪一段鏈路出了問題。不同品牌設(shè)備混接時(shí)ModbusTCP的字節(jié)序處理是繞不開的坑。西門子PLC里默認(rèn)是大端模式但很多國(guó)產(chǎn)儀表、變頻器是小端模式。如果從站是第三方設(shè)備一定要先確認(rèn)它的寄存器字節(jié)序否則讀上來的數(shù)據(jù)會(huì)覺得所有數(shù)都不對(duì)其實(shí)只是高低字反了。最后組態(tài)軟件里的通訊失敗重試間隔別設(shè)太短。現(xiàn)場(chǎng)遇到過操作員頻繁切換畫面觸發(fā)組態(tài)王讀多個(gè)變量結(jié)果通訊阻塞導(dǎo)致畫面像死機(jī)一樣。這個(gè)參數(shù)要根據(jù)實(shí)際數(shù)據(jù)量和網(wǎng)絡(luò)狀況慢慢調(diào)找到一個(gè)穩(wěn)定區(qū)間。這次項(xiàng)目做下來最大的感受是ModbusTCP這套東西技術(shù)上不復(fù)雜真正考驗(yàn)人的是排錯(cuò)思路和對(duì)細(xì)節(jié)的把控。把地址偏移、連接管理、字節(jié)序、超時(shí)機(jī)制這些基礎(chǔ)問題吃透多臺(tái)PLC通訊就是個(gè)熟練活。希望能給正在做類似項(xiàng)目的朋友省點(diǎn)時(shí)間。本文還有配套的精品資源點(diǎn)擊獲取