單芯片解決方案,開啟全新體驗——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,其資源豐富,專為各種復(fù)雜工控場景設(shè)計。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復(fù)用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設(shè)資源,能夠輕松應(yīng)對工業(yè)控制中多樣化的連接需求,無論是與各類傳感器、執(zhí)行器的通信,還是對復(fù)雜工業(yè)協(xié)議的支持,都能游刃有余,成為復(fù)雜工控領(lǐng)域的理想選擇。同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網(wǎng)關(guān)模組等場景,軟件使用方法一致。更多信息和資料請進入http://www.w5500.com/網(wǎng)站或者私信獲取。
此外,本W(wǎng)55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應(yīng)用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網(wǎng)絡(luò)通信安全再添保障。
為助力開發(fā)者快速上手與深入開發(fā),基于W55MH32L這顆芯片,WIZnet精心打造了配套開發(fā)板。開發(fā)板集成WIZ-Link芯片,借助一根USB C口數(shù)據(jù)線,就能輕松實現(xiàn)調(diào)試、下載以及串口打印日志等功能。開發(fā)板將所有外設(shè)全部引出,拓展功能也大幅提升,便于開發(fā)者全面評估芯片性能。
若您想獲取芯片和開發(fā)板的更多詳細信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價格等,歡迎訪問官方網(wǎng)頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。

第二十九章 W55MH32 Modbus_TCP_Server示例
本篇文章,我們將詳細介紹如何在W55MH32芯片上面實現(xiàn)Modbus TCP協(xié)議。并通過實戰(zhàn)例程,為大家講解如何在W55MH32上使用Modbus TCP作為服務(wù)器,監(jiān)聽端口,與客戶端進行通信。
該例程用到的其他網(wǎng)絡(luò)協(xié)議,如DHCP,請參考相關(guān)章節(jié)。有關(guān) W55MH32 的初始化過程,請參考 Network Install章節(jié),這里將不再贅述。
1 Modbus TCP簡介
Modbus TCP是一種基于以太網(wǎng)的通信協(xié)議,它是經(jīng)典Modbus協(xié)議的擴展。Modbus協(xié)議最初由Modicon公司在1979年開發(fā),廣泛應(yīng)用于工業(yè)自動化系統(tǒng),用于實現(xiàn)不同設(shè)備之間的數(shù)據(jù)通信。Modbus TCP結(jié)合了Modbus協(xié)議的簡單性和以太網(wǎng)的高效性,是一種開放、標(biāo)準(zhǔn)化且廣泛使用的工業(yè)通信協(xié)議。
2 Modbus TCP的基本原理
Modbus TCP使用TCP/IP協(xié)議棧進行通信,運行在OSI模型的傳輸層(TCP層)之上。設(shè)備之間通過以太網(wǎng)接口連接,數(shù)據(jù)通過TCP端口(通常是502端口)傳輸。
主從架構(gòu):
主機(Master):主動發(fā)起請求的設(shè)備(通常是PLC或工業(yè)PC)。
從機(Slave):響應(yīng)主機請求的設(shè)備(如傳感器、執(zhí)行器、IO模塊)。
數(shù)據(jù)傳輸:主機向從機發(fā)送請求,從機解析后執(zhí)行相應(yīng)操作,并返回結(jié)果。通信過程包括功能碼、地址、數(shù)據(jù)值和錯誤校驗等內(nèi)容。
3 Modbus TCP的優(yōu)勢
開放性: 不需要支付許可證費用,廣泛支持。
簡潔性: 數(shù)據(jù)格式簡單易懂,開發(fā)和維護成本低。
兼容性: 支持多種工業(yè)設(shè)備和系統(tǒng)。
實時性: 基于TCP/IP,通信速度快,延遲低。
可擴展性: 能夠集成到基于以太網(wǎng)的工業(yè)網(wǎng)絡(luò)中。
4注意事項
通信可靠性: TCP連接可能存在斷開或超時的情況,需要進行異常處理。
數(shù)據(jù)安全性: Modbus TCP本身不包含加密機制,可使用TLS等協(xié)議增加安全性。
設(shè)備地址: 每個從機需要唯一的單元標(biāo)識符(Unit Identifier)。
網(wǎng)絡(luò)配置: 需正確設(shè)置IP地址、子網(wǎng)掩碼和網(wǎng)關(guān)。
Modbus TCP因其高效性和兼容性,已成為工業(yè)物聯(lián)網(wǎng)(IIoT)和工業(yè)4.0中不可或缺的一部分。
5應(yīng)用場景
接下來,我們了解下在W55MH32上,可以使用Modbus TCP協(xié)議完成哪些操作及應(yīng)用呢?
1.工業(yè)自動化控制系統(tǒng)(PLC、SCADA等):通過與PLC和SCADA系統(tǒng)集成,W55MH32可以實現(xiàn)設(shè)備的實時監(jiān)控與控制,支持生產(chǎn)線的參數(shù)調(diào)整、啟動和停止等操作,同時能夠采集傳感器數(shù)據(jù)并上傳至控制系統(tǒng),用于分布式管理和優(yōu)化工業(yè)流程。
2.智能樓宇自動化(HVAC系統(tǒng)、能源管理):W55MH32可連接樓宇的HVAC設(shè)備,支持遠程調(diào)節(jié)空調(diào)和通風(fēng)系統(tǒng),并采集電力、水、氣等能耗數(shù)據(jù),上傳至能源管理系統(tǒng),幫助優(yōu)化樓宇能效。此外,還可集成智能照明和安防傳感器,實現(xiàn)更智能的樓宇管理。
3.數(shù)據(jù)采集與監(jiān)控(遠程I/O模塊、傳感器網(wǎng)絡(luò)):通過遠程I/O模塊,W55MH32能夠采集溫度、壓力、濕度等多種傳感器數(shù)據(jù),并實現(xiàn)遠程監(jiān)控與報警功能。采集的數(shù)據(jù)還能用于設(shè)備健康狀態(tài)分析,支持預(yù)測性維護,提升設(shè)備可靠性。
4.工業(yè)設(shè)備互聯(lián)(變頻器、伺服驅(qū)動器):W55MH32可與變頻器、伺服驅(qū)動器等設(shè)備通信,實現(xiàn)參數(shù)調(diào)節(jié)和運行狀態(tài)監(jiān)控,支持高精度的運動控制和狀態(tài)反饋。同時,作為中轉(zhuǎn)站,它還能實現(xiàn)不同設(shè)備之間的互聯(lián)互通,構(gòu)建開放的工業(yè)互聯(lián)生態(tài)。
6 Modbus TCP報文結(jié)構(gòu)
Modbus TCP報文由以下幾個部分組成:
事務(wù)處理標(biāo)識符(2字節(jié)):用于標(biāo)識請求與響應(yīng)之間的配對。主機在請求中設(shè)置一個唯一的標(biāo)識符,從機在響應(yīng)中回傳相同的值,方便主機識別對應(yīng)的響應(yīng)。
協(xié)議標(biāo)識符(2字節(jié)):通常為0x0000,表示該報文使用的是Modbus協(xié)議。
長度字段(2字節(jié)):表示后續(xù)數(shù)據(jù)的字節(jié)數(shù)(不包括事務(wù)處理標(biāo)識符和協(xié)議標(biāo)識符)。
單元標(biāo)識符(1字節(jié)):標(biāo)識目標(biāo)從機設(shè)備的地址。在Modbus TCP中,該字段通常用于區(qū)分邏輯設(shè)備。
功能碼(1字節(jié)):定義當(dāng)前操作的類型(如讀寫寄存器等)。
數(shù)據(jù)部分(可變長度):包含具體的操作數(shù)據(jù),例如寄存器地址、要讀取或?qū)懭氲闹档取?/p>
7 Modbus TCP常用功能碼
功能碼 0x01:讀取線圈狀態(tài),用于讀取從機設(shè)備中的一組線圈狀態(tài)(0或1)。
功能碼 0x02:讀取離散輸入,用于讀取從機設(shè)備中的一組離散輸入狀態(tài)(只讀,0或1)。
功能碼 0x03:讀取保持寄存器,用于讀取從機設(shè)備中的一組保持寄存器值(通常是可讀寫的數(shù)值)。
功能碼 0x04:讀取輸入寄存器,用于讀取從機設(shè)備中的一組輸入寄存器值(只讀數(shù)據(jù))。
功能碼 0x05:寫單個線圈,用于寫入從機設(shè)備中的一個線圈狀態(tài)(設(shè)置為0或1)。
功能碼 0x06:寫單個寄存器,用于向從機設(shè)備中的一個保持寄存器寫入數(shù)據(jù)。
功能碼 0x0F:寫多個線圈,用于同時寫入從機設(shè)備中的多個線圈狀態(tài)。
功能碼 0x10:寫多個寄存器,用于同時向從機設(shè)備中的多個保持寄存器寫入數(shù)據(jù)。
8實現(xiàn)過程
接下來,我們在W55MH32上實現(xiàn)Modbus TCP協(xié)議服務(wù)器模式:
注意:測試實例需要PC端和W55MH32處于同一網(wǎng)段。
步驟一:初始化并注冊LED相關(guān)函數(shù)
1. user_led_init(); 2. 3. user_led_control_init(get_user_led_status, set_user_led_status); 4.
在程序初始化部分添加LED所使用的GPIO外設(shè)初始化和注冊設(shè)置、獲取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),另一個用于設(shè)置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()為獲取和設(shè)置LED狀態(tài)的函數(shù),get_led_status()函數(shù)調(diào)用注冊的獲取LED狀態(tài)的回調(diào)函數(shù),并返回其返回值。set_led_status()函數(shù)調(diào)用注冊的設(shè)置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í)行相應(yīng)的操作,包括監(jiān)聽連接請求、處理連接建立事件、接收和處理數(shù)據(jù)以及關(guān)閉連接等。
步驟三:進入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í)行相應(yīng)的操作。例如,如果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í)行對應(yīng)操作。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í)行相應(yīng)的操作,包括寫單個設(shè)備和讀單個設(shè)備操作,并根據(jù)操作結(jié)果發(fā)送響應(yīng)數(shù)據(jù)。比如在接收到一段Modbus TCP數(shù)據(jù)之后,首先會進行檢查、比對,符合預(yù)設(shè)的值時,對LED進行開或關(guān)的狀態(tài)設(shè)置,并打印相應(yīng)的信息,再調(diào)用send()函數(shù)將接收到的數(shù)據(jù)原樣發(fā)送回去。如果接收到的數(shù)據(jù)不符合預(yù)期,會打印相應(yīng)的錯誤信息。
9運行結(jié)果
燒錄例程運行后,首先可以看到進行了PHY鏈路檢測,然后打印了設(shè)置的網(wǎng)絡(luò)地址信息,然后開始監(jiān)聽地址和端口號,信息如下圖所示:

我們使用網(wǎng)絡(luò)調(diào)試助手進行連接:

然后發(fā)送“00 01 00 00 00 06 01 01 00 00 00 01”報文后回復(fù)“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”可以關(guān)閉LED:

10總結(jié)
本文講解了如何在 W55MH32芯片上實現(xiàn) Modbus TCP協(xié)議的服務(wù)器模式,通過實戰(zhàn)例程展示了從初始化 LED相關(guān)函數(shù)、主循環(huán)調(diào)用處理函數(shù)到解析處理接收到的報文的完整過程。文章詳細介紹了 Modbus TCP的概念、基本原理、優(yōu)勢、注意事項、應(yīng)用場景、報文結(jié)構(gòu)和常用功能碼,幫助讀者理解其在工業(yè)通信中的實際應(yīng)用價值。
下一篇文章將講解在 W55MH32芯片上實現(xiàn) HTTP_Server與 NetBIOS功能,解析如何通過 NetBIOS名稱訪問 HTTP服務(wù)器的網(wǎng)頁內(nèi)容,同時通過實戰(zhàn)例程講解具體實現(xiàn)步驟與要點,敬請期待!
WIZnet是一家無晶圓廠半導(dǎo)體公司,成立于 1998年。產(chǎn)品包括互聯(lián)網(wǎng)處理器 iMCU?,它采用 TOE(TCP/IP卸載引擎)技術(shù),基于獨特的專利全硬連線 TCP/IP。iMCU?面向各種應(yīng)用中的嵌入式互聯(lián)網(wǎng)設(shè)備。
WIZnet在全球擁有 70多家分銷商,在香港、韓國、美國設(shè)有辦事處,提供技術(shù)支持和產(chǎn)品營銷。
香港辦事處管理的區(qū)域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
嵌入式
+關(guān)注
關(guān)注
5186文章
20134瀏覽量
328483 -
以太網(wǎng)
+關(guān)注
關(guān)注
41文章
5919瀏覽量
179449 -
MODBUS
+關(guān)注
關(guān)注
28文章
2381瀏覽量
82201
發(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

第二十九章 W55MH32 Modbus_TCP_Server示例
評論