发新帖我要提问
12
返回列表
打印

基于EncEthernet的FreeModbus-TCP 在stm32上的移植与测试

[复制链接]
楼主: Diyer2015
手机看帖
扫描二维码
随时随地手机跟帖
21
Diyer2015|  楼主 | 2017-11-28 11:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
在EV_FRAME_RECEIVED接收完数据后,发现一个问题,按RTU的思路还要比较接收地址是不是给我们的地址,但是我们之前并没有制定我们自己的设备地址ucMBAddress,在xMBTCPPortInit初始化的时候只绑定了端口,就给地址设置带来不便,只有在TCP端口初始化像设定mac地址、ip地址那样设置从地址了,我们移植的原则是尽量不去修改下载的源码,一切修改都在接口的实现中完成。

使用特权

评论回复
22
Diyer2015|  楼主 | 2017-11-28 11:07 | 只看该作者
寻根溯源,在eMBTCPReceive看到这样的定义:
       eMBTCPReceive: *pucRcvAddress =MB_TCP_PSEUDO_ADDRESS;
       #defineMB_TCP_PSEUDO_ADDRESS   255 原来设备从地址居然是一个宏定义!协议栈是这样解释的:
       /* Modbus TCP does not useany addresses. Fake the source address such
       * that the processing partdeals with this frame.*/
       原来modbus-TCP根本不需要从地址,因为已经有IP地址以及MAC地址进行了绑定!

使用特权

评论回复
23
Diyer2015|  楼主 | 2017-11-28 11:09 | 只看该作者
四、通信测试
       移植分析完毕,把程序下载到stm32板子中进行测试。
       (1)测试工具
       上位机采用TCP&UDP测试工具建立服务器

1.jpg (93.42 KB )

1.jpg

使用特权

评论回复
24
Diyer2015|  楼主 | 2017-11-28 11:09 | 只看该作者
以及抓包工具wireshark

2.jpg (104.65 KB )

2.jpg

使用特权

评论回复
25
Diyer2015|  楼主 | 2017-11-28 11:09 | 只看该作者
(2)测试内容
       由于EncEthernet原协议TCP端口号只支持了一个字节,而modbus-TCP要用到502端口,超出了这一范围,稍加改动就可以正常与上位机连接了。

使用特权

评论回复
26
Diyer2015|  楼主 | 2017-11-28 11:10 | 只看该作者
在wireshark中可以捕获到TCP协议三次握手连接以及断开过程如下图所示:

3.jpg (90.53 KB )

3.jpg

使用特权

评论回复
27
Diyer2015|  楼主 | 2017-11-28 11:10 | 只看该作者
使用上位机TCP&UDP测试工具发送读取寄存器指令00 0000 00 00 00 ff  04 00 00 00 01

4.jpg (61.6 KB )

4.jpg

使用特权

评论回复
28
Diyer2015|  楼主 | 2017-11-28 11:11 | 只看该作者
来读取GPIOA的数据,可是没有数据返回,先Debug一下看看板子有没有收到这个数据包,从结果看来确实收到了这个数据包,原来是数据发送有问题,修改xMBTCPPortSendResponse函数,先发送一个ACK应答包,再发送数据,就可以了!注意数据的格式。在wireshark中抓包如下图所示:

4.jpg (146.89 KB )

4.jpg

使用特权

评论回复
29
Diyer2015|  楼主 | 2017-11-28 11:13 | 只看该作者
Wireshark收到的Modbus-TCP数据帧

1.jpg (66.44 KB )

1.jpg

使用特权

评论回复
30
Diyer2015|  楼主 | 2017-11-28 11:14 | 只看该作者
更改上位机指令,使其发送读取3个寄存器(GPIOA-GPIOC)的值:

2.jpg (71.15 KB )

2.jpg

使用特权

评论回复
31
Diyer2015|  楼主 | 2017-11-28 11:14 | 只看该作者
至此,经过了三天时间modbus-TCP模式终于能够正常通信了,真高兴!其实无论是移植EncEthernet,或是uIP、Lwip基本思路都是一样的,弄清楚数据接收以及发送的整个过程很重要,可以很好的帮助理解协议栈是如何运行的。

使用特权

评论回复
32
carefull3357dc| | 2017-11-28 11:18 | 只看该作者
请问一下 有没有 W5500 或者MCU自带的 网口的例程呢?

使用特权

评论回复
33
carefull3357dc| | 2017-11-28 11:19 | 只看该作者
Wireshark 这个软件 是用来分析 网口数据的吗?

是类似于串口的监控的软件吗?

使用特权

评论回复
34
carefull3357dc| | 2017-11-28 11:24 | 只看该作者
现在用的是DP83848网卡芯片,porttcp.c怎么改啊?

使用特权

评论回复
35
xujunyi3611| | 2017-11-28 17:12 | 只看该作者
modbus-RTU的速度最大可以达到多少呢?

使用特权

评论回复
36
Diyer2015|  楼主 | 2018-9-3 15:15 | 只看该作者
串口 也就是 115200 最通用的了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则