迅为iTOP-开发板-modbus移植和使用文档
[复制链接]
本文档介绍 modbus库如何移植到ARM开发板上,以及如何使用测试程序。 适用迅为iTOP-4412开发板丨4418开发板丨6818开发板丨IMX6开发板 1.什么是 modbus 网络上关于 modbus 介绍的文章非常多,还有专门介绍 modbus 的书籍,这些资料大家 都可以利用起来,但是在这一小节中,作者希望帮助大家理解 modbus 的本质,modbus 到 底是用来做什么,用来解决什么问题和存在的价值。 第一个要重点理解的是:modbus 是一个“纯数据协议”。 说到 modbus 协议,经常和 RS232 和 RS485 以及以太网联系到一起。那么 modbus 和 RS485 协议有什么关系么?modbus 是纯粹的数据协议,和 RS232、RS485 和网络等协议没 有一点关系,如果在串口 RS232 上使用 modbus 协议,modbus 只处理通过串口发送前和串 口接收后的数据,串口只是在发送数据前使用 modbus 协议来转换数据,接收数据之后,将 数据通过 modbus 协议转换出来。 第二个要重点理解的是:modbus 是一个“通用的纯数据协议”。 怎么理解通用的数据协议呢?作者在读书的时候,刚开始学习嵌入式,使用的是 51 单片 机,当时要调试程序的时候,一般执行到哪一步,就点亮一个灯或者拉高一个 IO,后来觉得 通过“点灯”调试程序是在太慢了,于是自己定义了“串口数据协议”,例如:执行到某一段 代码,我就打印 0x01,这段代码出现错误就打印 0x02...现在大家学习了 linux,都知道 linux 控制台了,linux 控制台对于程序员来说,主要就是用来调试程序的,带代码中添加 print 函 数就可以实现控制台打印字符串。 那么作者当年自己定义的“串口数据协议”,就不是一个通用的协议,只能自己使用,但 是 linux 控制台,无论哪一个 linux 工程师,操作的方式都是类似的。那么 linux 控制台,在 所有的 linux 设备上使用方法就是通用的。 modbus 可以类比为普通话,如下对应关系: 福建人→闽南语→普通话 广东人→粤语→普通话 东北人→东北话→普通话 四川人→四川话→普通话 福建人”比作“RS232”,“广东人”和“东北人”比作 RS485,“四川人”比作 “以太网”...那么“普通话”就是 modbus 协议。modbus 协议和“人”这个硬件没有关 系,和“人”的说法方式没有关系,甚至机器人只要发声是“普通话”,这个普通话也是 modbus 协议。 网上关于 modbus 的资料很多,有不少资料将 modbus 和 RS232 绑定,这一点是完全 错误的,请大家务必注意,modbus 只是一个“通用的纯数据协议”。 modbus 是用于工业现场的总线协议,它不仅仅是在 PLC 或者单片机上可以使用,在任 何可以跑代码的电子设备上都可以使用,因为 modbus 对硬件没有任何定义。当然, modbus 应用范围主要是在工业控制上。如果每一台工业控制设备,都有一种自定义的协 议,那将是很恐怖的,modbus 协议可以用在所有控制设备上,所有的工业控制设备都可以 兼容 modbus 协议。 modbus 的本质是一个通用的纯数据协议,modbus 是用来规范工业现场各种控制设备 的通信协议,通过 modbus 协议,控制设备通过网络(RS485 和以太网等)可以和其它设备 之间通信,不同厂商的设备生产的设备可以很方便的连成工业网络。 2.modbus 移植到 linux 2.1 modbus 源码下载 作者将“libmodbus-3.1.4.tar.gz”下载,打包在“topeet_modbus.tar.gz”中,其中还 有移植好文件。 2.2 arm-linux 上的 modbus 移植和编译 交叉编译使用的编译器是“arm-2009q3”,如下图所示。 通过 ssh 将下载好的源码压缩包“libmodbus-3.1.4.tar.gz”拷贝到 Ubuntu 上,使用命 令“tar -vxf libmodbus-3.1.4.tar.gz”解压,解压后生成目录“libmodbus-3.1.4”,如下 图所示。 使用命令“mkdir install”,新建 install 路径,用以安装生成的文件,如下图所示。 进入 libmodbus-3.1.4,执行命令./configure ac_cv_func_malloc_0_nonnull=yes -- host=arm-none-linux-gnueabi --enable-static --prefix=/home/minilinux/install/ 。 Host=后面的是编译器前缀,--prefix=后面的是安装目录,可根据自己环境确定,如下图所 示。 如下图所示,执行完毕。 执行编译命令“make”,如下图所示。 编译完成,如下图所示。 执行安装命令“make install”,则安装到./configure 指定的目录,作者这里是 “/home/minilinux/install/”目录,如下图所示。 安装完成,如下图所示。 查看安装目录 install,在 install 生成三个目录:include、lib、share,如下图所示。 如下图所示,使用 file 命令查看 lib 目录下的库文件,可以发现其中的文件是 arm 架构 的。 将编译出来的 lib 路径下的所有文件拷贝到开发板的“/lib”目录下。 至此,modbus 的 arm-linux 的库文件编译完成。 2.3 arm 的测试程序 进入目录/home/minilinux/libmodbus-3.1.4/tests/,查看测试程序 random-test- server.c,如下图所示,已经编译出来了,但是还是需要修改一下源码中的几个参数,重新编 译。 输入命令 vim random-test-server.c 打开测试程序,里面 23 行 ctx =modbus_new_tcp("127.0.0.1", 1502); 改成 ctx = modbus_new_tcp(NULL, 1502);, 即 server 监控所有的 ip 地址,端口是 1502。 然后执行命令交叉编译命令arm-none-linux-gnueabi-gcc -o random-test-server random-test-server.c - L/home/minilinux/install/lib -lmodbus -I/home/minilinux/install/include/modbus 生成可执行文件 random-test-server,如下图所示。 如下图所示,可执行文件是 arm 架构的。 至此,arm 服务端的测试例程“random-test-server”编译完成。 2.3 x86-linux 的 modbus 移植和编译 在 minilinux 目录下再建一个文件夹,用于放 modbus 的 x86 的文件,如下图所示,使 用命令“tar -vxf libmodbus-3.1.4.tar.gz -C x86-modbus/”,将源码解压到这个目录下。 进入解压出来的“/home/minilinux/x86-modbus/libmodbus-3.1.4”目录,如下图所 示,执行命令“./configure”,不用加任何参数,默认就是 GCC-x86 配置。 配置完成,如下图所示。 执行“make”编译命令,然后执行安装命令“make install”,安装完成,如下图所 示。 进入 test 目录,前面我们编译的 arm 下的测试程序是 server,那么 Ubuntu 下运行的就应 该是 client 客户端,如下图所示。 客户端需要服务端的 IP 地址,如下图所示,作者的服务端(也就是开发板端)IP 是 “192.168.2.20”。 接着,修改 x86-modbus 目录下的“random-test-client.c”文件,使用 vim 命令打开 random-test-client.c 文件,将 ctx = modbus_new_tcp("127.0.0.1", 1502); 改成 ctx = modbus_new_tcp(开发板 IP, 1502); 如下图所示,然后保存退出。 执行命令:gcc -o random-test-client random-test-client.c `pkg-config --libs --cflags libmodbus` 编译生成 random-test-client 可执行文件,如下图所示,编译出的可执行文件是 x86 的。 至此,x86 上的测试程序编译完成。 3.测试 首先确保开发板和虚拟机 Ubuntu 可以 ping 通,如下图所示,作者虚拟机的 IP 为 “192.168.2.200”,通过开发板可以 ping 通 Ubuntu。 其次,注意将前面编译出的 arm 的库文件拷贝到开发板上,如下图所示。 在开发板上运行服务端程序,如下图所示。 在虚拟机 Ubuntu 上运行客户端程序“./random-test-client”,运行完毕如下图所示 服务端运行完毕,如下图所示。 至此,modbus 的移植和测试完成。
|