一、w5500
D-W5500 EVB以太網模塊是一款基于WIZnet W5500芯片的以太網模塊,且性價比高的以太網模塊,W5500是一款全硬體TCP/IP嵌入式以太網控制器,為嵌入式系統提供了更加建議的互聯網連接方案,
W5500固化了TCP/IP協議堆疊,10/100Mbps以太網資料鏈路層(MAC)及物理層(PHY),使得用戶使用單芯片就能夠在他們的應用中拓展網路連接,內嵌32K位元組片上快取以供以太網處理,并且可以同時使用8個硬體Socket獨立通訊;SPI(外設船型介面)從而能夠更加容易與外設MCU整合,并且W5500使用了高效SPI協議支持80MHz,從而實作高速網路通訊,
模塊還支持3.3V或者5V電源供電,當5V供電時還可以輸出3.3V的電壓,方便用戶在不同的單片機系統中使用,
二、modbus通信
1.Modbus三種通訊方式
Modbus有下列三種通信方式:
(1)、以太網:對應的通信模式是Modbus TCP/IP
(2)、異步串行傳輸(各種介質如有線RS-232-/422/485/;光纖、無線等):對應的通信模式是Modbus RTU或Modbus ASCII
(3)、高速令牌傳遞網路:對應的通信模式是Modbus PLUS
Modbus RTU和Modbus ASCII協議應用于串口鏈接(RS232、RS485、RS422),Modbus tcp/ip協議應用于以太網鏈接,
2.在Modbus網路上傳輸
標準的Modbus口是使用RS-232C兼容串行介面,它定義了連介面的針腳、電纜、信號位、傳輸波特率、奇偶校驗,控制器能直接或經由Modem組網,
控制器通信使用主/從技術,即僅一設備(主設備)能初始化傳輸(查詢),其它設備(從設備)根據主設備查詢提供的資料作出相應反應,
典型的主設備:主機和可編程儀表,
典型的從設備:可編程控制器,
主設備可單獨和從設備通信,也能以廣播方式和所有從設備通信,如果單獨通信,從設備回傳一訊息作為回應,如果是以廣播方式查詢的,則不作任何回應,
Modbus協議建立了主設備查詢的格式:設備(或廣播)地址、功能代碼、所有要發送的資料、一錯誤檢測域,
從設備回應訊息也由Modbus協議構成,包括確認要行動的域、任何要回傳的資料、和一錯誤檢測域,如果在訊息接收程序中發生一錯誤,或從設備不能執行其命令,從設備將建立一錯誤訊息并把它作為回應發送出去,
3.以太網(modbus tcp/ip)
對于Modbus TCP而言,主站通常稱為Client,從站稱為Server;而對于Modbus RTU和Modbus ASCII來說,主站是Master,從站是Slave,
ModbusTCP的資料幀可分為兩部分:ADU=MBAP+PDU = MBAP + 功能碼 + 資料域,MBAP 7byte,功能碼1byte,資料域不確定,由具體功能決定,
三、代碼實作
(一)初始化從機網路
void Load_Net_Parameters(void)
{
Gateway_IP[0] = 192;//加載網關引數
Gateway_IP[1] = 168;
Gateway_IP[2] = 1;
Gateway_IP[3] = 1;
Sub_Mask[0]=255;//加載子網掩碼
Sub_Mask[1]=255;
Sub_Mask[2]=255;
Sub_Mask[3]=0;
Phy_Addr[0]=0x0c;//加載物理地址
Phy_Addr[1]=0x29;
Phy_Addr[2]=0xab;
Phy_Addr[3]=0x7c;
Phy_Addr[4]=0x00;
Phy_Addr[5]=0x01;
IP_Addr[0]=192;//加載本機IP地址
IP_Addr[1]=168;
IP_Addr[2]=1;
IP_Addr[3]=199;
S0_Port[0] = 0x13;//加載埠0的埠號5000
S0_Port[1] = 0x88;
S0_Mode=TCP_SERVER;//加載埠0的作業模式,TCP服務端模式
(二)回應函式
void Process_Socket_Data(SOCKET s)
{
int len;
unsigned char msg[11]={0x00,0x00,0x00 ,0x00, 0x00, 0x05, 0x01, 0x03, 0x02, 0x00, 0x70};
len=sizeof(msg);
unsigned short size;
size=Read_SOCK_Data_Buffer(s, Rx_Buffer);
memcpy(Tx_Buffer, Rx_Buffer, size);
//列印查詢報文
for (int j=0;j<size;j++){
printf("0x%02X ",Tx_Buffer[j]);
}
//寫回應報文
//檢驗碼
msg[0]=Tx_Buffer[0];
msg[1]=Tx_Buffer[1];
//協議
msg[2]=0x00;
msg[3]=0x00;
//資料包長度
msg[4]=0x00;
msg[5]=0x05;
//設備編號
msg[6]=Tx_Buffer[6];
//功能碼
msg[7]=Tx_Buffer[7];
//資料長度
msg[8]=0x02;
//低八位
msg[10]=data&0XFF;
//高八位
msg[9]=data>>8;
memcpy(Tx_Buffer, msg, len);
//發送回應報文
Write_SOCK_Data_Buffer(0, Tx_Buffer, len);
data++;
}
(三)main函式回圈等待連接
while (1)
{
W5500_Socket_Set();//W5500埠初始化配置
W5500_Interrupt_Process();//W5500中斷處理程式框架
if((S0_Data & S_RECEIVE) == S_RECEIVE)//如果Socket0接收到資料
{
S0_Data&=~S_RECEIVE;
Process_Socket_Data(0);//W5500接收并發送接收到的資料
}
//從機狀態標志
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
}
四、結果



五、總結
本次實驗用了Mudbus協議堆疊實作了簡單的TCP通信,
六、參考資料
W5500+STM32F103C8T6進行TCP通信(modbus)_junseven164的博客-CSDN博客
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/397608.html
標籤:其他
上一篇:NAT網路地址習題
