Modbus是工业自动化领域使用广泛的通信协议之一,随着电子、计算机和通信技术的不断发展,特别是物联网以及“互联网 ”等概念的兴起,Modbus通信技术也从串行总线发展到了Modbus TCP,方兴未艾。为了让广大在校学生、工业控制和自动化工程师、技术人员了解Modbus协议的内涵,特别是彻底掌握Modbus通信技术的软件开发方法,作者从初学者的角度,由浅入深,循循善诱,以文字和画面相结合的方式撰写了本书。 本书分为11章,依次介绍了Modbus协议,特别是功能码消息帧的定义,然后从软件开发的角度,详细介绍了辅助调试工具、软件开发环境的构筑,重点介绍和解析了libmodbus开发库的源代码,以及使用libmodbus在不同语言环境下的开发技巧。阅读本书,可快速入门并精通Modbus软件开发技术。作为一本软件技术开发指南的书籍,本书不仅仅局限于Modbus通信协议,对其他通信协议的软件开发也有很强的参考价值。 本书可作为各大中专院校、工程设计院、系统集成商和工厂企业的Modbus通信协议开发人员的软件设计和开发的入门指导书籍,也可作为工业自动化领域及物联网开发的参考资料,还可供广大自动化及通信专业的教师、学生及物联网开发爱好者阅读。
着重讲述如何快速入门并精通Modbus软件开发技术,适用于初学Modbus通信协议的读者。如果你想用C/C 语言开发Modbus通信库,如果你想用其它语言(如Visual Basic、Visual C#)开发Modbus应用程序,如果你想从事物联网或Modbus测试开发,本书干货满满,值得一读。
杨更更 2003年毕业于清华大学,先后加入中国航天科工集团公司、日本横河电机株式会社等多家大型企业工作。曾作为主要研发人员,参与过多个大型项目的开发,了解并精通各现场总线通信协议,所开发的多个软硬件设备,正在世界各地稳定地运行。作为一个纯粹的技术开发者,闲暇时爱读书,所猎甚广,每有所得便欣欣然也。
目录
第1章初识Modbus1
1.1背景2
1.2模型4
1.3协议版本4
1.4通信设备6
1.5事务处理6
1.6专业术语9
第2章Modbus开发环境11
2.1虚拟串口软件12
2.1.1什么是虚拟串口软件12
2.1.2使用方法13
2.2Modbus Poll的使用16
2.2.1简介16
2.2.2功能17
2.2.3使用方法18
2.3Modbus Slave的使用21
2.3.1简介21
2.3.2功能22
2.3.3使用方法232.4Modbus PollSlave互联互通24
2.5Visual Studio 2015的安装28
第3章Modbus协议的相关知识31
3.1协议概要32
3.2Modbus寄存器34
3.2.1寄存器种类说明34
3.2.2寄存器地址分配35
3.3Modbus串行消息帧格式35
3.3.1ASCII消息帧格式36
3.3.2RTU消息帧格式36
3.3.3地址域38
3.3.4功能码域39
3.3.5数据域39
3.4Modbus差错校验39
3.4.1LRC校验40
3.4.2CRC校验42
3.5字节序和大小端49
3.5.1来历49
3.5.2为什么会有大小端50
3.5.3什么是“大端”和“小端”51
3.6Modbus TCP消息帧格式53
3.6.1协议描述53
3.6.2查询与响应报文例56
第4章Modbus功能码详解59
4.1功能码概要60
4.201(0x01)读取线圈/离散量输出状态61
4.2.1功能说明61
4.2.2查询报文61
4.2.3响应报文62
4.2.4借助工具软件观察和理解63
4.302(0x02)读取离散量输入值72
4.3.1功能说明72
4.3.2查询报文72
4.3.3响应报文73
4.403(0x03)读取保持寄存器值74
4.4.1功能说明74
4.4.2查询报文74
4.4.3响应报文75
4.504(0x04)读取输入寄存器值76
4.5.1功能说明76
4.5.2查询报文76
4.5.3响应报文77
4.605(0x05)写单个线圈或单个离散输出78
4.6.1功能说明78
4.6.2查询报文79
4.6.3响应报文79
4.706(0x06)写单个保持寄存器80
4.7.1功能说明80
4.7.2查询报文80
4.7.3响应报文81
4.808(0x08)诊断功能82
4.8.1功能说明82
4.8.2查询报文82
4.8.3响应报文83
4.8.4诊断子功能码84
4.911(0x0B)获取通信事件计数器87
4.9.1功能说明87
4.9.2查询报文87
4.9.3响应报文88
4.1012(0x0C)获取通信事件记录89
4.10.1功能说明89
4.10.2查询报文89
4.10.3响应报文90
4.1115(0x0F)写多个线圈91
4.11.1功能说明91
4.11.2查询报文91
4.11.3响应报文92
4.1216(0x10)写多个保持寄存器93
4.12.1功能说明93
4.12.2查询报文93
4.12.3响应报文95
4.1317(0x11)报告从站ID(仅用于串行链路)96
4.13.1功能说明96
4.13.2查询报文96
4.13.3响应报文97
4.14Modbus异常响应97
第5章libmodbus开发库101
5.1功能概要102
5.2源码获取与编译102
5.3与应用程序的关系109
第6章libmodbus源码解析111
6.1类型与结构定义112
6.1.1精细类型定义112
6.1.2常量定义114
6.1.3核心结构体定义之一115
6.1.4核心结构体定义之二120
6.2常用接口函数122
6.2.1各类辅助接口函数122
6.2.2各类Modbus功能接口函数126
6.2.3数据处理的相关函数或宏定义131
6.3RTU/TCP关联接口函数132
6.3.1RTU模式关联函数133
6.3.2TCP模式关联函数135
6.4部分内部函数详解135
6.4.1函数read_io_status()135
6.4.2函数read_registers()141
6.4.3函数write_single()144
6.4.4函数modbus_mapping_new_start_
address()147
6.5开发应用程序基本流程151
第7章完整RTU模式开发范例153
7.1开发RTU Master端154
7.1.1新建工程154
7.1.2添加开发库155
7.1.3添加应用源代码158
7.1.4代码调试166
7.2开发RTU Slave端169
7.2.1新建工程并添加开发库169
7.2.2添加应用源代码169
第8章完整TCP模式开发范例173
8.1开发TCP Client端174
8.1.1新建工程174
8.1.2添加开发库176
8.1.3添加应用源代码177
8.1.4代码调试186
8.2开发TCP Server端189
8.2.1新建工程并添加开发库189
8.2.2添加应用源代码189
第9章Visual Basic中使用libmodbus193
9.1函数调用约定与修饰名194
9.1.1函数调用约定194
9.1.2函数修饰名196
9.1.3调用约定的使用198
9.2模块定义文件198
9.3对libmodbus开发库的改造200
9.3.1添加__stdcall调用符200
9.3.2添加DEF模块定义文件201
9.4开发Visual Basic程序204
9.4.1创建新项目204
9.4.2添加函数描述文件205
9.4.3调用libmodbus库函数213
第10章Visual C#中使用libmodbus217
10.1开发Visual C#程序218
10.1.1创建新项目218
10.1.2添加函数描述文件219
10.1.3调用libmodbus库函数226
10.2基于C#的NModbus类库230
10.2.1什么是NModbus类库230
10.2.2NModbus类库用法232
第11章打造自己的Modbus调试工具237
11.1开发自己的Modbus Poll238
11.1.1软件需求分析238
11.1.2命令行解析功能240
11.1.3创建应用程序并调试246
11.2开发自己的Modbus Slave270
11.2.1软件需求分析270
11.2.2创建应用程序并调试272
参考文献284
第5章libmodbus开发库Modbus作为一种常见的工业通信协议,几乎被所有的设备所支持,如果能在软件或者设备中增强Modbus通信功能,无疑对于市场应用来说是个很吸引人的卖点。而对于Modbus开发来说,网络上存在相当多的开源库,其中libmodbus(www.libmodbus.org)和freemodbus(www.freemodbus.org)可以说是其中的翘楚,值得开发者认真分析和学习。5.1功能概要古人云: “登高而招,臂非加长也,而见者远;顺风而呼,声非加疾也,而闻者彰。假舆马者,非利足也,而致千里;假舟楫者,非能水也,而绝江河。君子生非异也,善假于物也”。确实,在互联网以及开源项目蓬勃发展的时代,闭门造车已显得非常不合时宜。libmodbus 是一个免费的跨平台的支持RTU和TCP的Modbus库,遵循LGPL v2.1 协议。libmodbus支持Linux、Mac OS X、FreeBSD、QNX和Windows等操作系统。libmodbus可以向符合Modbus协议的设备发送和接收数据,并支持通过串口或者TCP网络进行连接。作为一个开源项目,libmodbus还处于开发测试阶段,代码量还不是十分庞大,文档和注释也不够,本章通过对libmodbus源代码的阅读过程,一方面可以进一步理解Modbus协议,同时也可以学习下一个好的开源项目的代码组织及开发过程。libmodbus官方网站libmodbus.org/,现在稳定的版本是v3.0.6,当前近期版是v3.1.4,可以从libmodbus.org/download/下载源码。作为开源软件,还可以从GitHub网站获取近期版本代码。GitHub: https://github.com/stephane/libmodbus.git5.2源码获取与编译首先,访问libmodbus官方GitHub网站https://github.com/stephane/libmodbus,并下载近期版本源代码。如图51所示,单击[Clone or download]按钮,再单击[Download ZIP]按钮,则自动下载近期的源代码。图51下载libmodbus源码源码下载完毕,解压下载的zip文件,如图52所示。简单查看源代码根目录的构成: 图52解压libmodbus源码 doc目录: libmodbus库的各API接口说明文档。 m4目录: 存放GNU m4文件,在这里对理解代码没有意义,可忽略。 src目录: 全部libmodbus源文件。 tests目录: 包含自带的测试代码。其他文件对我们理解源代码关系不大,可以暂时忽略。进一步展开src代码目录,如图53所示。图53libmodbus源码构成 win32: 定义了在Windows下使用Visual Studio编译时的项目文件和工程文件,以及相关配置选项等。其中,modbus9.sln默认使用的是Visual Studio 2008。 Makefile.am: Makefile.am是Linux下AutoTool编译时读取相关编译参数的配置文件,用于生成Makefile文件,因用于Linux下开发,在这里暂时忽略。 modbus.c: 核心文件,实现Modbus协议层,定义共通的Modbus消息发送和接收函数、各功能码对应的函数。 modbus.h: libmodbus对外暴露的接口API头文件。 modbusdata.c: 数据处理的共通函数,包括大小端相关的字节、位交换等函数。 modbusprivate.h: libmodbus内部使用的数据结构和函数定义。 modbusrtu.c: 通信层实现,RTU模式相关的函数定义,主要是串口的设置、连接及消息的发送和接收等。 modbusrtu.h: RTU模式对外提供的各API定义。 modbusrtuprivate.h: RTU模式的私有定义。 modbustcp.c: 通信层实现,TCP模式下相关的函数定义,主要包括TCP/IP网络的设置、连接、消息的发送和接收等。 modbustcp.h: 定义TCP模式对外提供的各API定义。 modbustcpprivate.h: TCP模式的私有定义。 modbusversion.h.in: 版本定义文件。下面开始尝试在Visual Studio 2015中编译libmodbus库文件。为了在Visual Studio下展开项目,首先双击configure.js,用以生成 config.h 和 modbusversion.h文件。然后打开前面已经安装的开发环境Visual Studio 2015,在Visual Studio 2015中,打开modbus9.sln文件,弹出项目文件升级对话框,如图54所示。图54libmodbus项目文件升级对话框在图54中勾选全部可选项,然后单击[OK]按钮,完成项目文件升级。在Visual Studio 2015中打开后,源代码展开如图55所示。图55libmodbus项目文件结构此时如果直接编译工程文件,将发生编译错误。原因是其中新生成的文件modbusversion.h没有正确加载,在文件上单击右键选择[Remove]菜单,删除旧的文件,同时,在目录Header Files上右键单击,在弹出的菜单中依次选择[Add]→[Existing Item...],重新加载新生成的modbusversion.h文件,如图56所示。图56修改或者添加文件尝试着再次编译看看: 在项目名称上单击右键,在弹出的菜单上选择[Rebuild Solution]菜单项,如图57所示。libmodbus库文件开始编译。图57编译libmodus库文件编译完成的时候,出现编译错误,如图58所示。图58编译libmodus出现错误为了解决这个错误,同时按下Alt F7键弹出项目属性设置对话框,依次找到[VERSION]项的定义。查看路径为[Configuration Properties]→[Linker]→[All Options]→[Version],如图59所示。图59Version项的定义找到后直接删除[VERSION]项的定义,再次重新编译库文件。如果一切顺利,在win32目录下将会成功生成modbus.dll和modbus.lib文件。在工具栏上将工程文件目标属性切换到[Release]项,按照上面的方法重新编译Release版,在win32目录下同样成功生成modbus.dll和modbus.lib文件。至此,对libmodbus库文件的编译工作完成,成功生成的动态链接库可以方便地供其他应用程序调用。5.3与应用程序的关系我们已经知道libmodbus是一个免费的跨平台的支持RTU和TCP的Modbus开发库,借助于libmodbus开发库能够非常方便地建立自己的应用程序或者将Modbus通信协议嵌入到单体设备中。libmodbus开发库与应用程序的基本关系如图510所示。图510应用程序与libmodbus的关系在对libmodbus的接口及代码框架简单了解之后,不妨让我们再深入一下细节,探探究竟。看看libmodbus都实现了哪些基础功能?以及源代码中对Modbus各功能码和消息帧是如何包装的?具体内容请看下一章。
物流速度太慢
物流挺快的,纸质不错,就是想找一本可以边学习边编程操作的书,目前看着还行,等学习一段时间再来评价!
条理清楚,
纸质很好,正版
这本书还可以
很基础入门书,软件截图占太多篇幅,有点水
很好很好很好
这本书讲的浅显易懂,讲的简单明了。作者很用心。作为modbus学习完全足够。过段时间要用到,之前在网上也学了一些,可是现在想系统学一下。推荐。