文章目录
一、w5500简介
这个网络芯片通过硬件实现了TCP/IP协议栈,10/100M以太网数据链路层(MAC)及物理层(PHY);支持TCP、UDP、IPv4、ICMP、ARP、IGMP以及PPPoE。内嵌32K字节缓存。MCU通过SPI与其通讯来配置网络及进行网络通信,SPI速率达80MHz。
其上提供多达8个独立的socket(套接字),编号0-7,这个socket和平常所说的socket稍微有点差别。对于UDP,设置对应UDP后的操作和普通的socket差不多;但对于TCP,1个socket只能对应一条TCP链接,也就是说,比如你在一个端口上打开了监听TCP的如5000端口,然后使用两个TCP客户端去连接,结果是只有先连入的那个TCP链接能成功。为了在一个TCP端口上同时服务多个TCP链接,需要在多个socket上同时监听那个端口。
另稍微提一下,与W5500通讯的基本思想就是读写W5500的寄存器,来控制W5500的各种功能或读写数据,就好像我们在单片机上通过设置各个寄存器的值来操作各个模块,但因为它不是直接接在MCU的地址总线上的,所以要通过特定格式的SPI帧来间接实现操作寄存器。每次读写寄存器的时候先按固定格式指定起始地址,然后按序依次从MISO读取或从MOSI写入数据。同时还可能随带一些其他操作,比如可变数据长度模式下还需要在每次开始发送前拉低片选信号,发送结束后再拉高。(与可变数据长度模式对应的就是固定数据长度模式,这种模式下不需要频繁控制片选信号,但是在大量读写时就很蛋疼。现在版本的官方库中只支持可变数据长度模式,所以就不需要纠结这个事情了)
当然,这些细节操作官方的IO库已经都帮我们隐藏了,基本我们只需要调用库提供的api就行。
二、modbus通信
MODBUS协议是美国Modicon公司(现已被收购)首先推出的基于RS485总线的通信协议,有RS232/RS422/RS485接口标准。Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。
MODBUS协议是一种 主从式 串行异步 半双工 通信协议。
主从式 指通信设备中有一台主机和多台从机(最大约240个),主机可以和从站双向通信,可以和单独一个从站通信,或者所有从站同时通信(广播),这个时候不需要回应。而从站只能和主站通信,从站之间不能相互通信,从机也不会主动给主机发送信息,只会应答主机。
MODBUS主站同时只会发起一个事物处理,只会与一个从站通信
三、代码
- 关键代码,这里需要在开始定义一个全局变量data,每次调用都会使data++,而返回的数据就是把data置于数据位,值通过tcp回传回去,能在modbus poll里看到这个值
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++;
}
- Modbus Poll读取设置
- 这里是通过TCP连接,端口为5000
- 读取效果
四、总结
modbus tcp通信原理基本清楚。
五、参考链接
https://blog.csdn.net/qq_47281915/article/details/121927294?spm=1001.2014.3001.5501
https://link.csdn.net/?target=http%3A%2F%2Fwww.ad.siemens.com.cn%2Fproductportal%2FProds%2Fpublished%2FComm%2FComm_9.1%2FComm_9.1.html%23%3A~%3Atext%3DModbus%2520TCP%25E6%2595%25B0%25E6%258D%25AE%25E5%25B8%25A7%2520Modbus%25E6%2595%25B0%25E6%258D%25AE%25E5%259C%25A8TCP%2FIP%25E4%25BB%25A5%25E5%25A4%25AA%25E7%25BD%2591%25E4%25B8%258A%25E4%25BC%25A0%25E8%25BE%2593%25EF%25BC%258C%25E6%2594%25AF%25E6%258C%2581Ethernet%2520II%25E5%2592%258C802.3%25E4%25B8%25A4%25E7%25A7%258D%25E5%25B8%25A7%25E6%25A0%25BC%25E5%25BC%258F%25EF%25BC%258CModbus%2CTCP%25E6%2595%25B0%25E6%258D%25AE%25E5%25B8%25A7%25E5%258C%2585%25E5%2590%25AB%25E6%258A%25A5%25E6%2596%2587%25E5%25A4%25B4%25E3%2580%2581%25E5%258A%259F%25E8%2583%25BD%25E4%25BB%25A3%25E7%25A0%2581%25E5%2592%258C%25E6%2595%25B0%25E6%258D%25AE3%25E9%2583%25A8%25E5%2588%2586%25EF%25BC%258CMBAP%25E6%258A%25A5%25E6%2596%2587%25E5%25A4%25B4%2528MBAP%25E3%2580%2581Modbus%2520Application%2520Protocol%25E3%2580%2581Modbus%25E5%25BA%2594%25E7%2594%25A8%25E5%258D%258F%25E8%25AE%25AE%2529%25E5%2588%25864%25E4%25B8%25AA%25E5%259F%259F%25EF%25BC%258C%25E5%2585%25B17%25E4%25B8%25AA%25E5%25AD%2597%25E8%258A%2582%25EF%25BC%258C%25E5%25A6%2582%25E5%259B%25BE1%25E6%2589%2580%25E7%25A4%25BA%25EF%25BC%259A%2520%25E5%259B%25BE1%25EF%25BC%259AMODBUS%2520TCP%25E6%258A%25A5%25E6%2596%2587