本文进行中,未完结。
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.txt Changelog.txt demo doc gpl.txt lgpl.txt modbus tools
我们只需要demo和modbus即可。
进入demo后,可以看到各个平台的支持文件,我们也只需要LINUXTCP即可,初学者看的乱的话,可以将其余的文件夹删掉
root@yjp-pc:/GIT_workplace/freemodbus_yjp/demo# ls
AT91SAM7X_ROWLEY ATSAM3S ATSAM3S_FREERTOS AVR BARE HCS08 LINUX LINUXTCP LPC214X MCF5235 MCF5235CW MCF5235TCP MSP430 STR71X STR71XGCC STR71XTCP WIN32 WIN32TCP Z8ENCORE
modbus路径下的,ascii和rtu,本次也用不到,初学者可以删去。
二、配置编译modbus TCP
找到文件/modbus/include/mbconfig.h,修改如下,简单来讲就是关掉ASCII和RTU功能,开启TCP。
三、修改makefile
经过上述两个修改,进入demo/LINUXTCP下应该就可以直接make出来了,但是在ubuntu 16.04下还是会报错
undefined reference to `pthread_create'
查了原因是因为-lpthread在ubuntu中编译选项要放到最后,所以做在demo/LINUXTCP对makefile进行修改如下
这个问题参考了大神的博客
https://blog.csdn.net/dyzhen/article/details/79058554
在freemodbus的文档中有讲到,但是我找不到在那儿了,说的是官方在redhat xx版本上验证的,所以我们要在ubuntu运行,需要修改一下。
完成上述,就可以编译出tcpmodbus文件了,运行即可。
root@yjp-pc:/GIT_workplace/freemodbus_yjp/demo/LINUXTCP# ls
demo.c demo.o Makefile port tcpmodbus
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 information
Copyright 2007 Steven Guo
>
四、eclipse编译
我个人是比较喜欢图形界面编译,将精力集中于代码逻辑上,而不要浪费时间(哪怕一秒)在学习记忆指令和格式上。
高手喜欢指令的请跳过本节
我用的版本是eclipse oxygen
1.分析demo/LINUXTCP下的makefile文件
对于LINUXTCP需要的源文件,这里只有c文件
CSRC = 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配置如图
删除了modbus文件夹下的ascii和rut,并把其放到了linuxtcp目录下,这个是我个人习惯,随意放置即可。
确保makefile中的c文件,全部加入了eclipse项目中。
上述的config修改也请确认修改完毕
然后编译,缺库问题可以见招拆招,本地库的路径很好找,也可以直接按我的来
pthread问题解决
到此即可编出可执行文件了,如果是通用库的问题,请百度,因为我没有遇到所以也没法写,可以先自己写一个hello和socket test,确保你的环境库,eclipse没问题,再来搞modbus TCP
------------------------------------------------------------------------------------------------------------------------------------------------------------
如何使用LinuxTCP
修改这个宏定义为自己的IP地址 #define INADDR_ANY
下述这两个全局数组,是modbus 3X 4X两个区的寄存器存储,自行修改为测试数据即可。
static USHORT usRegInputBuf [REG_INPUT_NREGS];
static USHORT usRegHoldingBuf [REG_HOLDING_NREGS];
REG_INPUT_START 3x区的起始地址
REG_HOLDING_START 4x区的起始地址
切记!!!!一定先用modscan 和modslave这两个软件自行对测一下,熟悉一个modbus 从站,需要配置什么,然后再来看代码。
代码和modslave需要配置的地方都一样:从站IP地址,端口502写死的,3x4x区数据地址,数据内容即可。TCP的协议栈目前不支持0X1X区,其他demo支持,后面有时间我研究一下如何移植。