MODBUS协议软件开发(modbus协议实现)

MODBUS协议软件开发(modbus协议实现)

1、相关话题:第四次工业革命

我国提出了中国制造2025计划,同样,德国也提出了工业4.0计划,无疑,这是当前最热门的技术方向之一,甚至有很多人将之称为“第四次工业革命”。

到现在为止,人类历史上共出现四次工业革命

第一次工业革命:以蒸汽机的发明为标志,发源地是英国;第一次工业革命使得英国成为全球第一强国;

第二次工业革命:以内燃机的发明为标志,发源地是德国;第二次工业革命使得德国一跃成为全球强国,美国也紧紧抓住第二次工业革命的机遇,成为全球第一强国;

第三次工业革命:以计算机技术为标志,发源地是美国;第三次工业革命让美国保持了数十年全球霸主的地位。

目前全球各国关注的第四次工业革命,普遍的观点是以“AI 制造”为标志,从目前的发展态势来看,最可能取得第四次工业革命成功的国家是中国或美国。

第四次工业革命方兴未艾,使得制造业的提升成为全球关注的中心,大量从事软件开发的工程师,也将目光投向工业制造,因此PLC与MODBUS也越来越热。

2、可编程逻辑控制器PLC

PLC,Programmable Logic Controller,可编程逻辑控制器。

PLC可以被看成用在工业控制的微处理器,PLC包含CPU、内存、I/O、数模转换单元。

PLC具有稳定性高、可扩展性强,因而在工业控制领域得到广泛应用。

与此同时,PLC为工程技术人员提供图形化编程接口,学习起来非常容易,不需要计算机专业知识也能进行工业控制的程序编写,因此深受工程技术人员的喜爱。

3、MODBUS协议

PLC的应用,使得工业制造的数字化提升了一大步。如何利用收集的数据,进行分析,然后对工业制造过程进行优化,是工业制造能力提升的关键。

MODBUS协议1979年由德国施耐德电气公司(准确讲是施耐德公司的前身Modicon公司)发表,随即得到广泛的关注与应用。

MODBUS协议的提出,是为了让拥有PLC能力的自动化设备,进一步拥有通信能力。

MODBUS协议得到广泛应用的原因有:

(1)免费;

(2)易于使用;

(3)应用的可扩展能力强。

4、MODBUS协议

MODBUS协议很容易获得,进入modbus官网,即可下载协议文档。

当前最新的版本是《Modbus_Application_Protocol_V1_1b3》,仅有50页,感兴趣的读者可以自行下载和阅读。

5、MODBUS协议的层次

MODBUS虽然应用于工业制造领域,但是协议对网络承载层的适应性很强。

从网络分层的角度来看,我们可以把MODBUS看成应用层协议。这两年来,我接触过下面类型MODBUS协议:

MODBUS on TCP

MODBUS on UDP

MODBUS on RS-232

MODBUS on RS-422

MODBUS on RS-485

上述各种MODBUS协议实现,很容易实现互联互通。

下图是MODBUS的网络分层图:

MODBUS协议软件开发(modbus协议实现)MODBUS协议软件开发(modbus协议实现)

6、MODBUS协议定义

MODBUS协议有两种模式:MODBUS RTU和MODBUS ASCII,前者为二进制格式,后者为ASCII格式。考虑到MODBUS RTU格式更紧凑,处理起来速度更快,实际使用中,主要采用MODBUS RTU。

MODBUS协议定义了两个名词:

ADU,Application Data Unit,应用数据单元;

PDU,Protocol Data Unit,协议数据单元

考虑到MODBUS数据报文帧仅仅由四部分组成,非常紧凑,实际使用中,大多数开发人员并不关心ADU和PDU这两个名词。

MODBUS数据报文帧的格式如下:

MODBUS协议软件开发(modbus协议实现)

MODBUS数据报文帧四个部分的含义:

Additional addres:附加地址,用于标识终端设施的地址;使用附加地址,MODBUS支持对多个终端通过总线收集数据、设置参数;

Function code:功能码,标识对终端进行的操作;

Data:报文帧包含的数据(可以为空);

Error check:CRC16校验码。

7、MODBUS协议软件的开发

由于MODBUS协议实在太简单,并且由于MODBUS与承载层没有相关性,导致MODBUS的软件开发特别容易,接到一个从未做过的新任务,往往不到一天就可以初步开发完成。

这是我前段时间写过的一段代码,你会发现,它简直简单到极点:

adubytes[0] = slaveId;aduBytes[1] = FUNCTION_CODE_READ_HOLDING_REGISTERS;aduBytes[2] = (byte)((startAddress >> 8) & 0xFF);aduBytes[3] = (byte)(startAddress & 0xFF);aduBytes[4] = (byte)((registerQuantity >> 8) & 0xFF);aduBytes[5] = (byte)(registerQuantity & 0xFF);long crcValue = CommonUtil.getCrcValue(aduBytes, 0, 6);aduBytes[6] = (byte)(crcValue & 0xFF);aduBytes[7] = (byte)((crcValue >> 8) & 0xFF);

天有点晚了,随手写了这篇文章,希望对MODBUS的开发者有用。

相关新闻

联系我们
联系我们
公众号
公众号
在线咨询
分享本页
返回顶部