一、Modbus/TCP协议
1.查询报文
00 6D 00 00 00 06 01 03 00 00 00 01 00 6D 查询编号 00 00 协议 00 06 数据包长度 01 设备编号 03 功能码 00 00 起始地址 00 01 查询寄存器个数
2.响应报文
00 6D 00 00 00 05 01 03 02 00 17 00 6D 查询编号 00 00 协议 00 05 数据包长度 01 设备地址 03 功能码 02 数据长度 00 17 数据值
二、代码
1.初始化从机网络
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_Addr[1]=168;
IP_Addr[2]=1;
IP_Addr[3]=199;
S0_Port[0] = 0x13;
S0_Port[1] = 0x88;
S0_Mode=TCP_SERVER;
}
2.简单响应函数
返回一个全局变量data,并且每次响应后自增1。
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++;
}
3.main函数循环等待连接
while (1)
{
W5500_Socket_Set();
W5500_Interrupt_Process();
if((S0_Data & S_RECEIVE) == S_RECEIVE)
{
S0_Data&=~S_RECEIVE;
Process_Socket_Data(0);
}
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
}
三、结果
使用modbus poll建立连接 设置id、地址、读取位数 成功读取到data的值
四、参考
https://blog.csdn.net/qq_47281915/article/details/121927294?spm=1001.2014.3001.5501
|