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的网络分层图:
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数据报文帧四个部分的含义:
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的开发者有用。