Freemodbus TCP协议栈使用笔记

本文进行中,未完结。
Freemodbus这个协议栈是比较有名的modbus开源协议站,支持在很多平台上运行。

modbus TCP是最容易移植的demo,因为底层是socket,只要支持linux运行即可,修改的地方非常少。

本文内容:
1.用命令行编译出modbus TCP的可执行文件
2.用eclipse编译出modbus TCP的可执行文件
3.使用协议栈程序


需要的基础:modbus协议基础,先自己学会使用,然后再来看协议栈,直接看协议栈难度太高;
建议使用modsan和modslave这两款软件,再搭建虚拟机,两者之间通信。一主一从先玩会了再看协议栈。

开发环境:
gcc version 4.7.4 (Ubuntu/Linaro 4.7.4-3ubuntu12)
Ubuntu 16.04

一、源代码结构分析
官方的代码库https://github.com/cwalter-at/freemodbus.git
从git获取代码后,进入目录下可以看到

root@yjp-pc:/GIT_workplace/freemodbus_yjp# ls bsd.txtChangelog.txtdemodocgpl.txtlgpl.txtmodbustools


我们只需要demo和modbus即可。
进入demo后,可以看到各个平台的支持文件,我们也只需要LINUXTCP即可,初学者看的乱的话,可以将其余的文件夹删掉
root@yjp-pc:/GIT_workplace/freemodbus_yjp/demo# ls AT91SAM7X_ROWLEYATSAM3SATSAM3S_FREERTOSAVRBAREHCS08LINUXLINUXTCPLPC214XMCF5235MCF5235CWMCF5235TCPMSP430STR71XSTR71XGCCSTR71XTCPWIN32WIN32TCPZ8ENCORE

modbus路径下的,ascii和rtu,本次也用不到,初学者可以删去。
二、配置编译modbus TCP
【Freemodbus TCP协议栈使用笔记】找到文件/modbus/include/mbconfig.h,修改如下,简单来讲就是关掉ASCII和RTU功能,开启TCP。
Freemodbus TCP协议栈使用笔记
文章图片

三、修改makefile
经过上述两个修改,进入demo/LINUXTCP下应该就可以直接make出来了,但是在ubuntu 16.04下还是会报错
undefined reference to `pthread_create'
查了原因是因为-lpthread在ubuntu中编译选项要放到最后,所以做在demo/LINUXTCP对makefile进行修改如下
Freemodbus TCP协议栈使用笔记
文章图片

这个问题参考了大神的博客
https://blog.csdn.net/dyzhen/article/details/79058554
在freemodbus的文档中有讲到,但是我找不到在那儿了,说的是官方在redhat xx版本上验证的,所以我们要在ubuntu运行,需要修改一下。
完成上述,就可以编译出tcpmodbus文件了,运行即可。
root@yjp-pc:/GIT_workplace/freemodbus_yjp/demo/LINUXTCP# ls demo.cdemo.oMakefileporttcpmodbus root@yjp-pc:/GIT_workplace/freemodbus_yjp/demo/LINUXTCP# ./tcpmodbus Type 'q' for quit or 'h' for help! > > > > h FreeModbus demo application help: 'd' ... disable protocol stack. 'e' ... enabled the protocol stack 's' ... show current status 'q' ... quit applicationr 'h' ... this informationCopyright 2007 Steven Guo >

四、eclipse编译
我个人是比较喜欢图形界面编译,将精力集中于代码逻辑上,而不要浪费时间(哪怕一秒)在学习记忆指令和格式上。
高手喜欢指令的请跳过本节
我用的版本是eclipse oxygen
1.分析demo/LINUXTCP下的makefile文件
对于LINUXTCP需要的源文件,这里只有c文件
CSRC= https://www.it610.com/article/demo.c port/portother.c /
port/portevent.c port/porttcp.c \
../../modbus/mb.c ../../modbus/tcp/mbtcp.c \
../../modbus/functions/mbfunccoils.c \
../../modbus/functions/mbfuncdiag.c \
../../modbus/functions/mbfuncholding.c \
../../modbus/functions/mbfuncinput.c \
../../modbus/functions/mbfuncother.c \
../../modbus/functions/mbfuncdisc.c \
../../modbus/functions/mbutils.c
eclipse配置如图
Freemodbus TCP协议栈使用笔记
文章图片

删除了modbus文件夹下的ascii和rut,并把其放到了linuxtcp目录下,这个是我个人习惯,随意放置即可。
确保makefile中的c文件,全部加入了eclipse项目中。
上述的config修改也请确认修改完毕
Freemodbus TCP协议栈使用笔记
文章图片

然后编译,缺库问题可以见招拆招,本地库的路径很好找,也可以直接按我的来
Freemodbus TCP协议栈使用笔记
文章图片

pthread问题解决
Freemodbus TCP协议栈使用笔记
文章图片

到此即可编出可执行文件了,如果是通用库的问题,请百度,因为我没有遇到所以也没法写,可以先自己写一个hello和socket test,确保你的环境库,eclipse没问题,再来搞modbus TCP
------------------------------------------------------------------------------------------------------------------------------------------------------------
如何使用LinuxTCP

修改这个宏定义为自己的IP地址#defineINADDR_ANY
下述这两个全局数组,是modbus 3X 4X两个区的寄存器存储,自行修改为测试数据即可。
static USHORTusRegInputBuf[REG_INPUT_NREGS];
static USHORTusRegHoldingBuf[REG_HOLDING_NREGS];
REG_INPUT_START3x区的起始地址
REG_HOLDING_START4x区的起始地址

切记!!!!一定先用modscan 和modslave这两个软件自行对测一下,熟悉一个modbus 从站,需要配置什么,然后再来看代码。
代码和modslave需要配置的地方都一样:从站IP地址,端口502写死的,3x4x区数据地址,数据内容即可。TCP的协议栈目前不支持0X1X区,其他demo支持,后面有时间我研究一下如何移植。




    推荐阅读