單芯片解決方案,開啟全新體驗——W55MH32 高性能以太網(wǎng)單片機
W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機,它為用戶帶來前所未有的集成化體驗。這顆芯片將強大的組件集于一身,具體來說,一顆W55MH32內(nèi)置高性能Arm? Cortex-M3核心,其主頻最高可達216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲與數(shù)據(jù)處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協(xié)議棧、內(nèi)置MAC以及PHY,擁有獨立的32KB以太網(wǎng)收發(fā)緩存,可供8個獨立硬件socket使用。如此配置,真正實現(xiàn)了All-in-One解決方案,為開發(fā)者提供極大便利。
在封裝規(guī)格上,W55MH32 提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復雜工控場景設計。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設資源,能夠輕松應對工業(yè)控制中多樣化的連接需求,無論是與各類傳感器、執(zhí)行器的通信,還是對復雜工業(yè)協(xié)議的支持,都能游刃有余,成為復雜工控領域的理想選擇。同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網(wǎng)關模組等場景,軟件使用方法一致。更多信息和資料請進入http://www.w5500.com/網(wǎng)站或者私信獲取。
此外,本W(wǎng)55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網(wǎng)絡通信安全再添保障。
為助力開發(fā)者快速上手與深入開發(fā),基于W55MH32L這顆芯片,WIZnet精心打造了配套開發(fā)板。開發(fā)板集成WIZ-Link芯片,借助一根USB C口數(shù)據(jù)線,就能輕松實現(xiàn)調(diào)試、下載以及串口打印日志等功能。開發(fā)板將所有外設全部引出,拓展功能也大幅提升,便于開發(fā)者全面評估芯片性能。
若您想獲取芯片和開發(fā)板的更多詳細信息,包括產(chǎn)品特性、技術參數(shù)以及價格等,歡迎訪問官方網(wǎng)頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。
第二十九章 W55MH32 Modbus_TCP_Server示例
本篇文章,我們將詳細介紹如何在W55MH32芯片上面實現(xiàn)Modbus TCP協(xié)議。并通過實戰(zhàn)例程,為大家講解如何在W55MH32上使用Modbus TCP作為服務器,監(jiān)聽端口,與客戶端進行通信。
該例程用到的其他網(wǎng)絡協(xié)議,如DHCP,請參考相關章節(jié)。有關 W55MH32 的初始化過程,請參考 Network Install章節(jié),這里將不再贅述。
1 Modbus TCP簡介
Modbus TCP是一種基于以太網(wǎng)的通信協(xié)議,它是經(jīng)典Modbus協(xié)議的擴展。Modbus協(xié)議最初由Modicon公司在1979年開發(fā),廣泛應用于工業(yè)自動化系統(tǒng),用于實現(xiàn)不同設備之間的數(shù)據(jù)通信。Modbus TCP結(jié)合了Modbus協(xié)議的簡單性和以太網(wǎng)的高效性,是一種開放、標準化且廣泛使用的工業(yè)通信協(xié)議。
2 Modbus TCP的基本原理
Modbus TCP使用TCP/IP協(xié)議棧進行通信,運行在OSI模型的傳輸層(TCP層)之上。設備之間通過以太網(wǎng)接口連接,數(shù)據(jù)通過TCP端口(通常是502端口)傳輸。
主從架構(gòu):
主機(Master):主動發(fā)起請求的設備(通常是PLC或工業(yè)PC)。
從機(Slave):響應主機請求的設備(如傳感器、執(zhí)行器、IO模塊)。
數(shù)據(jù)傳輸:主機向從機發(fā)送請求,從機解析后執(zhí)行相應操作,并返回結(jié)果。通信過程包括功能碼、地址、數(shù)據(jù)值和錯誤校驗等內(nèi)容。
3 Modbus TCP的優(yōu)勢
開放性: 不需要支付許可證費用,廣泛支持。
簡潔性: 數(shù)據(jù)格式簡單易懂,開發(fā)和維護成本低。
兼容性: 支持多種工業(yè)設備和系統(tǒng)。
實時性: 基于TCP/IP,通信速度快,延遲低。
可擴展性: 能夠集成到基于以太網(wǎng)的工業(yè)網(wǎng)絡中。
4注意事項
通信可靠性: TCP連接可能存在斷開或超時的情況,需要進行異常處理。
數(shù)據(jù)安全性: Modbus TCP本身不包含加密機制,可使用TLS等協(xié)議增加安全性。
設備地址: 每個從機需要唯一的單元標識符(Unit Identifier)。
網(wǎng)絡配置: 需正確設置IP地址、子網(wǎng)掩碼和網(wǎng)關。
Modbus TCP因其高效性和兼容性,已成為工業(yè)物聯(lián)網(wǎng)(IIoT)和工業(yè)4.0中不可或缺的一部分。
5應用場景
接下來,我們了解下在W55MH32上,可以使用Modbus TCP協(xié)議完成哪些操作及應用呢?
1.工業(yè)自動化控制系統(tǒng)(PLC、SCADA等):通過與PLC和SCADA系統(tǒng)集成,W55MH32可以實現(xiàn)設備的實時監(jiān)控與控制,支持生產(chǎn)線的參數(shù)調(diào)整、啟動和停止等操作,同時能夠采集傳感器數(shù)據(jù)并上傳至控制系統(tǒng),用于分布式管理和優(yōu)化工業(yè)流程。
2.智能樓宇自動化(HVAC系統(tǒng)、能源管理):W55MH32可連接樓宇的HVAC設備,支持遠程調(diào)節(jié)空調(diào)和通風系統(tǒng),并采集電力、水、氣等能耗數(shù)據(jù),上傳至能源管理系統(tǒng),幫助優(yōu)化樓宇能效。此外,還可集成智能照明和安防傳感器,實現(xiàn)更智能的樓宇管理。
3.數(shù)據(jù)采集與監(jiān)控(遠程I/O模塊、傳感器網(wǎng)絡):通過遠程I/O模塊,W55MH32能夠采集溫度、壓力、濕度等多種傳感器數(shù)據(jù),并實現(xiàn)遠程監(jiān)控與報警功能。采集的數(shù)據(jù)還能用于設備健康狀態(tài)分析,支持預測性維護,提升設備可靠性。
4.工業(yè)設備互聯(lián)(變頻器、伺服驅(qū)動器):W55MH32可與變頻器、伺服驅(qū)動器等設備通信,實現(xiàn)參數(shù)調(diào)節(jié)和運行狀態(tài)監(jiān)控,支持高精度的運動控制和狀態(tài)反饋。同時,作為中轉(zhuǎn)站,它還能實現(xiàn)不同設備之間的互聯(lián)互通,構(gòu)建開放的工業(yè)互聯(lián)生態(tài)。
6 Modbus TCP報文結(jié)構(gòu)
Modbus TCP報文由以下幾個部分組成:
事務處理標識符(2字節(jié)):用于標識請求與響應之間的配對。主機在請求中設置一個唯一的標識符,從機在響應中回傳相同的值,方便主機識別對應的響應。
協(xié)議標識符(2字節(jié)):通常為0x0000,表示該報文使用的是Modbus協(xié)議。
長度字段(2字節(jié)):表示后續(xù)數(shù)據(jù)的字節(jié)數(shù)(不包括事務處理標識符和協(xié)議標識符)。
單元標識符(1字節(jié)):標識目標從機設備的地址。在Modbus TCP中,該字段通常用于區(qū)分邏輯設備。
功能碼(1字節(jié)):定義當前操作的類型(如讀寫寄存器等)。
數(shù)據(jù)部分(可變長度):包含具體的操作數(shù)據(jù),例如寄存器地址、要讀取或?qū)懭氲闹档取?/p>
7 Modbus TCP常用功能碼
功能碼 0x01:讀取線圈狀態(tài),用于讀取從機設備中的一組線圈狀態(tài)(0或1)。
功能碼 0x02:讀取離散輸入,用于讀取從機設備中的一組離散輸入狀態(tài)(只讀,0或1)。
功能碼 0x03:讀取保持寄存器,用于讀取從機設備中的一組保持寄存器值(通常是可讀寫的數(shù)值)。
功能碼 0x04:讀取輸入寄存器,用于讀取從機設備中的一組輸入寄存器值(只讀數(shù)據(jù))。
功能碼 0x05:寫單個線圈,用于寫入從機設備中的一個線圈狀態(tài)(設置為0或1)。
功能碼 0x06:寫單個寄存器,用于向從機設備中的一個保持寄存器寫入數(shù)據(jù)。
功能碼 0x0F:寫多個線圈,用于同時寫入從機設備中的多個線圈狀態(tài)。
功能碼 0x10:寫多個寄存器,用于同時向從機設備中的多個保持寄存器寫入數(shù)據(jù)。
8實現(xiàn)過程
接下來,我們在W55MH32上實現(xiàn)Modbus TCP協(xié)議服務器模式:
注意:測試實例需要PC端和W55MH32處于同一網(wǎng)段。
步驟一:初始化并注冊LED相關函數(shù)
1. user_led_init(); 2. 3. user_led_control_init(get_user_led_status, set_user_led_status); 4.
在程序初始化部分添加LED所使用的GPIO外設初始化和注冊設置、獲取LED狀態(tài)的函數(shù),用于在接收到特定的Modbus TCP數(shù)據(jù)時進行狀態(tài)的顯示。
user_led_control_init()函數(shù)如下:
1. void user_led_control_init(int(*get_fun)(void),void(*set_fun)(uint32_t)) 2. { 3. if(get_fun!= NULL&& set_fun!= NULL) 4. { 5. getUserLED_cb= get_fun; 6. setUserLED_cb= set_fun; 7. } 8. }
user_led_control_init()為LED控制初始化函數(shù),允許用戶注冊兩個回調(diào)函數(shù):一個用于獲取LED狀態(tài),另一個用于設置LED狀態(tài)。這些回調(diào)函數(shù)將在get_led_status()和set_led_status()函數(shù)中被調(diào)用。函數(shù)如下:
1. int get_led_status(void) 2. { 3. return getUserLED_cb(); 4. } 5. void set_led_status(int32_t val) 6. { 7. setUserLED_cb(val); 8. }
get_led_status()和set_led_status()為獲取和設置LED狀態(tài)的函數(shù),get_led_status()函數(shù)調(diào)用注冊的獲取LED狀態(tài)的回調(diào)函數(shù),并返回其返回值。set_led_status()函數(shù)調(diào)用注冊的設置LED狀態(tài)的回調(diào)函數(shù),并傳入新的狀態(tài)值。
步驟二:主循環(huán)調(diào)用do_Modbus()函數(shù)
1. while(1) 2. { 3. do_Modbus(SOCKET_ID); 4. }
在循環(huán)中不斷執(zhí)行do_Modbus()函數(shù)的操作,用于處理Modbus TCP通信,根據(jù)套接字的不同狀態(tài)執(zhí)行相應的操作,包括監(jiān)聽連接請求、處理連接建立事件、接收和處理數(shù)據(jù)以及關閉連接等。
步驟三:進入do_Modbus()函數(shù),處理接收的報文
1. void do_Modbus(uint8_t sn) 2. { 3. uint8_t state=0; 4. uint16_t len; 5. getSIPR(lip); 6. state= getSn_SR(sn); 7. switch(state) 8. { 9. case SOCK_SYNSENT: 10. break; 11. case SOCK_INIT: 12. listen(sn); 13. if(!b_listening_printed) 14. { 15. b_listening_printed=1; 16. printf("Listening on %d.%d.%d.%d:%drn", 17. lip[0], lip[1], lip[2], lip[3], local_port); 18. } 19. break; 20. case SOCK_LISTEN: 21. break; 22. case SOCK_ESTABLISHED: 23. if(getSn_IR(sn)&Sn_IR_CON) 24. { 25. setSn_IR(sn,Sn_IR_CON); 26. printf("Connectedrn"); 27. getSn_DIPR(sn, rip); 28. port= getSn_DPORT(sn); 29. printf("RemoteIP:%d.%d.%d.%d Port:%drn", rip[0], rip[1], rip[2], rip[3], port); 30. 31. if(b_listening_printed) 32. b_listening_printed=0; 33. } 34. len= getSn_RX_RSR(sn); 35. if(len>0) 36. { 37. mbTCPtoEVB(sn); 38. } 39. break; 40. case SOCK_CLOSE_WAIT: 41. disconnect(sn); 42. break; 43. case SOCK_CLOSED: 44. case SOCK_FIN_WAIT: 45. close(sn); 46. socket(sn,Sn_MR_TCP, local_port,Sn_MR_ND);// Sn_MR_ND 47. break; 48. default: 49. break; 50. } 51.
首先,程序會獲取本地IP地址和指定socket的狀態(tài),根據(jù)socket的狀態(tài),執(zhí)行相應的操作。例如,如果socket處于監(jiān)聽狀態(tài),則開始監(jiān)聽;如果處于已建立連接狀態(tài),則處理接收到的數(shù)據(jù)。在處理已建立連接狀態(tài)時,檢查是否有新的連接請求,并打印連接信息(包括遠程IP地址和端口號)。如果有接收到的數(shù)據(jù),則調(diào)用mbTCPtoEVB()函數(shù)檢查Modbus TCP數(shù)據(jù)并執(zhí)行對應操作。mbTCPtoEVB()函數(shù)內(nèi)容如下:
1. void mbTCPtoEVB(uint8_t sn) 2. { 3. if(MBtcp2evbFrame()!=0) // Frame received complete 4. { 5. if(pucASCIIBufferCur[0]==0x01) // Check whether the device address is 0x01 6. { 7. if((uint8_t)pucASCIIBufferCur[1]==0x05)// Write to a single device 8. { 9. if((uint8_t)pucASCIIBufferCur[4]==0xff) 10. { 11. set_led_status(0); 12. printf("LED ONrn"); 13. } 14. elseif((uint8_t)pucASCIIBufferCur[4]==0x00) 15. { 16. set_led_status(1); 17. printf("LED OFFrn"); 18. } 19. send(sn, recv_data, recv_len); 20. } 21. elseif((uint8_t)pucASCIIBufferCur[1]==0x01)// Read Write to a single device 22. { 23. if(recv_data[recv_len-1]!=0x01) 24. { 25. printf("len error!%xrn", recv_data[recv_len-1]); 26. } 27. else 28. { 29. printf("Read OK!rn"); 30. send_data[0]= recv_data[0]; 31. send_data[1]= recv_data[1]; 32. send_data[2]= recv_data[2]; 33. send_data[3]= recv_data[3]; 34. send_data[4]=0x00; 35. send_data[5]=0x04; 36. send_data[6]=0x01; 37. send_data[7]=0x01; 38. send_data[8]=0x01; 39. send_data[9]=~get_led_status(); 40. send_len =10; 41. send(sn, send_data, send_len); 42. memset(send_data,0, send_len); 43. } 44. } 45. else 46. { 47. printf("error code!rn"); 48. } 49. } 50. else 51. { 52. printf("address error!rn"); 53. } 54. } 55. } 56.
mbTCPtoEVB()函數(shù)用于處理從Modbus TCP接收到的數(shù)據(jù),根據(jù)數(shù)據(jù)內(nèi)容執(zhí)行相應的操作,包括寫單個設備和讀單個設備操作,并根據(jù)操作結(jié)果發(fā)送響應數(shù)據(jù)。比如在接收到一段Modbus TCP數(shù)據(jù)之后,首先會進行檢查、比對,符合預設的值時,對LED進行開或關的狀態(tài)設置,并打印相應的信息,再調(diào)用send()函數(shù)將接收到的數(shù)據(jù)原樣發(fā)送回去。如果接收到的數(shù)據(jù)不符合預期,會打印相應的錯誤信息。
9運行結(jié)果
燒錄例程運行后,首先可以看到進行了PHY鏈路檢測,然后打印了設置的網(wǎng)絡地址信息,然后開始監(jiān)聽地址和端口號,信息如下圖所示:
我們使用網(wǎng)絡調(diào)試助手進行連接:
然后發(fā)送“00 01 00 00 00 06 01 01 00 00 00 01”報文后回復“0 01 00 00 00 04 01 01 01 FE”如下圖所示:
接著我們發(fā)送“ 01 00 00 00 06 01 05 00 00 ff 00 00 00”令,LED就被打開了,且指令被進行了回傳:
發(fā)送“0 01 00 00 00 06 01 05 00 00 00 00 00 00”可以關閉LED:
10總結(jié)
本文講解了如何在 W55MH32芯片上實現(xiàn) Modbus TCP協(xié)議的服務器模式,通過實戰(zhàn)例程展示了從初始化 LED相關函數(shù)、主循環(huán)調(diào)用處理函數(shù)到解析處理接收到的報文的完整過程。文章詳細介紹了 Modbus TCP的概念、基本原理、優(yōu)勢、注意事項、應用場景、報文結(jié)構(gòu)和常用功能碼,幫助讀者理解其在工業(yè)通信中的實際應用價值。
下一篇文章將講解在 W55MH32芯片上實現(xiàn) HTTP_Server與 NetBIOS功能,解析如何通過 NetBIOS名稱訪問 HTTP服務器的網(wǎng)頁內(nèi)容,同時通過實戰(zhàn)例程講解具體實現(xiàn)步驟與要點,敬請期待!
WIZnet是一家無晶圓廠半導體公司,成立于 1998年。產(chǎn)品包括互聯(lián)網(wǎng)處理器 iMCU?,它采用 TOE(TCP/IP卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU?面向各種應用中的嵌入式互聯(lián)網(wǎng)設備。
WIZnet在全球擁有 70多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產(chǎn)品營銷。
香港辦事處管理的區(qū)域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
嵌入式
+關注
關注
5154文章
19708瀏覽量
318095 -
以太網(wǎng)
+關注
關注
41文章
5684瀏覽量
176252 -
MODBUS
+關注
關注
28文章
2146瀏覽量
79706
發(fā)布評論請先 登錄
第三十章 W55MH32 HTTP_Server&NetBIOS示例

第二十七章 W55MH32?Interrupt示例

第二十六章 W55MH32?上位機搜索和配置示例

第二十五章 W55MH32 TCP_Server_Multi_Socket示例

第二十四章 W55MH32TCP_Client_Multi_Socket示例

第二十三章 W55MH32 MQTT_OneNET示例

第二十二章 W55MH32 MQTT&Aliyun示例

第二十一章 W55MH32 PHY配置示例

第十九章 W55MH32 FTP_Client示例

第十八章 W55MH32 FTP_Server示例

第十五章 W55MH32 SNMP示例

第九章 W55MH32 HTTP Server示例

第三章 W55MH32 TCP Client示例

第二章 W55MH32 DHCP示例

第二十九章 讀寫內(nèi)部FLASH

評論