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.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。

Freemodbus TCP协议栈使用笔记_第1张图片

三、修改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配置如图

Freemodbus TCP协议栈使用笔记_第2张图片

删除了modbus文件夹下的ascii和rut,并把其放到了linuxtcp目录下,这个是我个人习惯,随意放置即可。

确保makefile中的c文件,全部加入了eclipse项目中。

上述的config修改也请确认修改完毕

Freemodbus TCP协议栈使用笔记_第3张图片

然后编译,缺库问题可以见招拆招,本地库的路径很好找,也可以直接按我的来

Freemodbus TCP协议栈使用笔记_第4张图片

pthread问题解决

Freemodbus TCP协议栈使用笔记_第5张图片

到此即可编出可执行文件了,如果是通用库的问题,请百度,因为我没有遇到所以也没法写,可以先自己写一个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支持,后面有时间我研究一下如何移植。

 

 

 

 

你可能感兴趣的:(通信技术)