單芯片解決方案,開(kāi)啟全新體驗(yàn)——W55MH32 高性能以太網(wǎng)單片機(jī)
W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機(jī),它為用戶(hù)帶來(lái)前所未有的集成化體驗(yàn)。這顆芯片將強(qiáng)大的組件集于一身,具體來(lái)說(shuō),一顆W55MH32內(nèi)置高性能Arm? Cortex-M3核心,其主頻最高可達(dá)216MHz;配備1024KB FLASH與96KB SRAM,滿(mǎn)足存儲(chǔ)與數(shù)據(jù)處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協(xié)議棧、內(nèi)置MAC以及PHY,擁有獨(dú)立的32KB以太網(wǎng)收發(fā)緩存,可供8個(gè)獨(dú)立硬件socket使用。如此配置,真正實(shí)現(xiàn)了All-in-One解決方案,為開(kāi)發(fā)者提供極大便利。
在封裝規(guī)格上,W55MH32 提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專(zhuān)為各種復(fù)雜工控場(chǎng)景設(shè)計(jì)。它擁有66個(gè)GPIO、3個(gè)ADC、12通道DMA、17個(gè)定時(shí)器、2個(gè)I2C、5個(gè)串口、2個(gè)SPI接口(其中1個(gè)帶I2S接口復(fù)用)、1個(gè)CAN、1個(gè)USB2.0以及1個(gè)SDIO接口。如此豐富的外設(shè)資源,能夠輕松應(yīng)對(duì)工業(yè)控制中多樣化的連接需求,無(wú)論是與各類(lèi)傳感器、執(zhí)行器的通信,還是對(duì)復(fù)雜工業(yè)協(xié)議的支持,都能游刃有余,成為復(fù)雜工控領(lǐng)域的理想選擇。同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網(wǎng)關(guān)模組等場(chǎng)景,軟件使用方法一致。更多信息和資料請(qǐng)進(jì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ò)通信安全再添保障。
為助力開(kāi)發(fā)者快速上手與深入開(kāi)發(fā),基于W55MH32L這顆芯片,WIZnet精心打造了配套開(kāi)發(fā)板。開(kāi)發(fā)板集成WIZ-Link芯片,借助一根USB C口數(shù)據(jù)線(xiàn),就能輕松實(shí)現(xiàn)調(diào)試、下載以及串口打印日志等功能。開(kāi)發(fā)板將所有外設(shè)全部引出,拓展功能也大幅提升,便于開(kāi)發(fā)者全面評(píng)估芯片性能。
若您想獲取芯片和開(kāi)發(fā)板的更多詳細(xì)信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價(jià)格等,歡迎訪(fǎng)問(wèn)官方網(wǎng)頁(yè):http://www.w5500.com/,我們期待與您共同探索W55MH32的無(wú)限可能。

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

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

然后發(fā)送“00 01 00 00 00 06 01 01 00 00 00 01”報(bào)文后回復(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就被打開(kāi)了,且指令被進(jìn)行了回傳:

發(fā)送“0 01 00 00 00 06 01 05 00 00 00 00 00 00”可以關(guān)閉LED:

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