基于Modbus/TCP的西门子1200PLC和STM32通信
1.前言
對于工控而言,有時候會需要和單片機(jī)進(jìn)行通信,最近就測試了一下市面上常見的西門子PLC和STM32F103VET6的單片機(jī)進(jìn)行通信。
2.硬件架構(gòu)
STM32+W5500+ModbusTCP+西門子1200PLC 中間需要交換機(jī)來互聯(lián)網(wǎng)口
首先通信是要基于協(xié)議的,對于單片機(jī)和PLC而言之間的通信協(xié)議可以有很多,串口232,485,ModbusRTU/TCP等等。現(xiàn)在工控都是組網(wǎng)時代了,ModbusTCP作為一款開源的協(xié)議資料也很多便于第三方移植。
PLC端現(xiàn)在大多數(shù)支持網(wǎng)口,西門子1200,1500系列PLC自帶網(wǎng)口,支持Modbus協(xié)議,通信起來也方便一些。
單片機(jī)端選擇需要帶網(wǎng)口,我用的是野火指南者開發(fā)板,本身自己沒有帶網(wǎng)口,但是現(xiàn)在以太網(wǎng)模塊很多,這里選擇W5500的以太網(wǎng)模塊來實現(xiàn)組網(wǎng)。W5500可以實現(xiàn)基于硬件的TCP/IP協(xié)議,可以避免解析復(fù)雜的TCP/IP協(xié)議,例程也多方便移植。其實本質(zhì)就是基于W5500模塊的ModbusTCP移植。這部分有很多參考資料,主要參考這篇文章,十分感謝https://blog.csdn.net/jordan20052009/article/details/46967451?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160744407419726891153872%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=160744407419726891153872&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-25-46967451.pc_search_result_cache&utm_term=freemodbus%20tcp
3.移植分析
需要理解Modbus協(xié)議的相關(guān)內(nèi)容,W5500的使用,PLC端主站的建立。
其實分3大塊:
1.Modbus協(xié)議源碼移植
2.W5500TCP/IP移植
3.PLC端主站代碼的編寫
熟悉PLC的朋友應(yīng)該知道,第3點其實不難,而且是在PLC里面寫跟單片機(jī)其實沒有太大關(guān)系,實際上在單片機(jī)跑通之后,就可以用Modbus scan32一類的工具去測試連接了,只要調(diào)試助手能讀取成功就證明單片機(jī)端代碼沒有問題。
那就只剩下第1,2點。我是這么做的,先單獨完成Modbus RTU的移植,這樣可以方便了解Modbus協(xié)議的工作原理,再單獨完成W5500TCP/IP的協(xié)議移植這樣可以理解W5500的使用方法,最后再兩者結(jié)合,就可以實現(xiàn)。不了解的同學(xué)可以嘗試分步實現(xiàn)。一定要理解Modbus 因為我們就是在W5500的函數(shù)基礎(chǔ)上添加Modbus內(nèi)容。TCP/IP實現(xiàn)底層的收發(fā),Modbus再對其進(jìn)行處理。
4.移植流程
1.W5500可以直接參考官方的例程,下面是main函數(shù)
這其實是官方的例程,Modbus是后添加的,while中的循環(huán)函數(shù)我也進(jìn)行了修改,是跟Modbus相關(guān)的。其實執(zhí)行到最后一條Prtinf語句后,W5500就已經(jīng)配置完成了,已經(jīng)可以ping通了,這就可以證明W5500運轉(zhuǎn)正常了,之后再去做下一步動作。官方的例程基本不需要修改,拿來直接用就可以,只是SPI部分的硬件接線要根據(jù)自己實際板子來修改部分代碼。關(guān)于W5500可以參考官網(wǎng)的教程和網(wǎng)絡(luò)資料也比較多,這里不多說。說一下IP地址
/*MAC地址首字節(jié)必須為偶數(shù)如果多塊w5500網(wǎng)絡(luò)適配板在同一現(xiàn)場工作,請使用不同的MAC地址 */ uint8 mac[6]={0x00,0x08,0xdc,0x11,0x11,0x11};/*定義默認(rèn)IP信息*/ uint8 local_ip[4] = {192,168,1,8}; // 定義w5500默認(rèn)IP地址 uint8 subnet[4] = {255,255,255,0}; // 定義w5500默認(rèn)子網(wǎng)掩碼 uint8 gateway[4] = {192,168,1,1}; // 定義w5500默認(rèn)網(wǎng)關(guān) uint8 dns_server[4] = {114,114,114,114}; // 定義w5500默認(rèn)DNSuint16 local_port = 502; // 定義本地端口注意單片機(jī)IP要和本地PLC在同一網(wǎng)段。端口號要和PLC端一致,常用502.
mac地址如果是多設(shè)備注意不要重復(fù)。下面是while中的函數(shù)。和RTU不同,TCP是一直處在監(jiān)聽狀態(tài),一旦建立了連接就會一直查詢,檢測到數(shù)據(jù)長度ucTCPRequestLen>0就開始接受數(shù)據(jù),接受到數(shù)據(jù)之后,再驅(qū)動empoll函數(shù)即可 進(jìn)入到Modbus的內(nèi)部處理流程,處理完了再通過send函數(shù)發(fā)送出去。Send和recv都是W5500的庫函數(shù)。
其實如果完全不了解Modbus協(xié)議的話,移植起來還是比較困難,建議一定要了解一些之后再移植,可以先做ModbusRTU的移植。
總結(jié)
以上是生活随笔為你收集整理的基于Modbus/TCP的西门子1200PLC和STM32通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: what is ssao
- 下一篇: ORACLE中数据类型