工控智汇

工控智汇

Modbus通讯过时了吗?Modbus详解!!!

admin 187 161

Modbus通讯协议讲解及通讯实例案例一、Modbus通讯协议讲解

Modbus协议是一种广泛应用于当今工业控制领域的通用通讯协议。通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其他设备之间进行通信。Modbus协议使用的是主从通讯技术,即由主设备主动查询和操作从设备。一般将主控设备方所使用的协议称为ModbusMaster,从设备方使用的协议称为ModbusSlave。典型的主设备包括工控机和工业控制器等;典型的从设备如PLC可编程控制器等。

Modbus协议基于主从结构,其中一个设备充当主站,其他设备充当从站。通信方式主要分为串行通信和以太网通信两种。在串行通信中,Modbus协议使用RS485或RS232通信接口,传输速率可根据具体需求进行调整。以太网通信则使用TCP/IP协议进行数据传输,速率较快,适用于大规模自动化系统。

Modbus协议定义了一套数据帧格式,包括主站地址、功能码、数据字节等字段。主站通过发送读写请求来与从站进行通信,从站则响应主站的请求。Modbus协议的主要功能码包括:

读取线圈:用于读取从站的开关量输出状态。

读取离散量输入:用于读取从站的开关量输入状态。

读取保持寄存器:用于读取从站的模拟量输出状态。

读取输入寄存器:用于读取从站的模拟量输入状态。

写单个线圈:用于向从站写入开关量输出状态的数据。

写单个保持寄存器:用于向从站写入模拟量输出状态的数据。

写多个线圈:用于批量写入从站的开关量输出状态的数据。

写多个保持寄存器:用于批量写入从站的模拟量输出状态的数据。

Modbus通讯物理接口可以选用串口(包括RS232、RS485和RS422),也可以选择以太网口。其通信遵循以下的过程:主设备向从设备发送请求,从设备分析并处理主设备的请求,然后向主设备发送结果。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一个控制器请求访问其他设备的过程,如何回应来自其他设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。

Modbus的工作方式是请求/应答,每次通讯都是主站先发送指令,可以是广播,或是向特定从站的单播;从站响应指令,并按要求应答,或者报告异常。当主站不发送请求时,从站不会自己发出数据,从站和从站之间不能直接通讯。

Modbus协议是应用层(协议层)报文传输协议,它定义了一个与物理层无关的协议数据单元(PDU),即PDU=功能码+数据域,功能码1byte,数据域不确定。Modbus协议能够应用在不同类型的总线或网络。对应不同的总线或网络,Modbus协议引入一些附加域映射成应用数据单元(ADU),即ADU=附加域+PDU,例如ModbusTCP/IP------ADU=MBAP+ADU。

Modbus有下列三种通信方式:

以太网:对应的通信模式是ModbusTCP/IP。

异步串行传输(各种介质如有线RS-232-/422/485/;光纤、无线等):对应的通信模式是ModbusRTU或ModbusASCII。

高速令牌传递网络:对应的通信模式是ModbusPLUS。

ModbusRTU和ModbusASCII协议应用于串口链接(RS232、RS485、RS422),Modbustcp/ip协议应用于以太网链接。标准的Modbus口是使用RS-232C兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。控制器能直接或经由Modem组网。

控制器通信使用主/从技术,即仅一设备(主设备)能初始化传输(查询)。其他设备(从设备)根据主设备查询提供的数据作出相应反应。典型的主设备:主机和可编程仪表。典型的从设备:可编程控制器。主设备可单独和从设备通信,也能以广播方式和所有从设备通信。如果单独通信,从设备返回一消息作为回应,如果是以广播方式查询的,则不作任何回应。

Modbus协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、一错误检测域。从设备回应消息也由Modbus协议构成,包括确认要行动的域、任何要返回的数据、和一错误检测域。如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。

在其它网络上,控制器使用对等技术通信,故任何控制都能初始和其他控制器的通信。这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。提供的多个内部通道可允许同时发生的传输进程。在消息位,Modbus协议仍提供了主/从原则,尽管网络通信方法是对等。如果一控制器发送一消息,它只是作为主设备,并期望从从设备得到回应。同样,当控制器接收到一消息,它将建立一从设备回应格式并返回给发送的控制器。

查询消息中的功能代码告之被选中的从设备要执行何种功能。数据段包含了从设备要执行功能的任何附加信息。例如功能代码03是要求从设备读保持寄存器并返回它们的内容。数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。错误检测域为从设备提供了一种验证消息内容是否正确的方法。如果从设备产生正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。数据段包括了从设备收集的数据:象寄存器值或状态。如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。错误检测域允许主设备确认消息内容是否可用。

Modbus协议的报文(或帧)的基本格式是:表头+功能码+数据区+校验码。功能码和数据区在不同类型的网络都是固定不变的,表头和校验码则因网络底层的实现方式不同而有所区别。表头包含了从站的地址,功能码告诉从站要执行何种功能,数据区是具体的信息。对于不同类型的网络,Modbus的协议层实现是一样的,区别在于下层的实现方式,常见的有TCP/IP和串行通讯两种。ModbusTCP基于以太网和TCP/IP协议,ModbusRTU和ModbusASCII则是使用异步串行传输(通常是RS-232/422/485)。

串行传输的物理层是RS-485或RS-232,数据链路层是Modbus的串行传输协议;ModbusTCP传输的1、2、3、4层实现和日常所见的以太网、因特网一样,Modbus默认采用的TCP端口号是502。对于ModbusTCP而言,主站通常称为Client,从站称为Server;而对于ModbusRTU和ModbusASCII来说,主站是Master,从站是Slave。

ModbusTCP的数据帧可分为两部分:ADU=MBAP+PDU=MBAP+功能码+数据域,MBAP7byte,功能码1byte,数据域不确定,由具体功能决定。MBAP为报文头,长度为7字节,组成如下:

取消了校验位。数据链路层上就进行了CRC-32的校验,TCP/IP是面向连接的可靠性的协议,因此没必要再加上校验位。

Slave地址换成了UnitIdentifier。当网络里的设备全是使用TCP/IP,这个地址是没有意义的,因为IP就能进行路由寻址。如果网络里还有串行通讯的设备,则需要网关来实现ModbusTCP到ModbusRTU或ASCII之间的协议转换,这时用UnitIdentifier来标识网关后面的每个串行通讯设备。

Length是指后面的字节总数。实际上数据区的长度是能确定的,有的功能码就可以确定数据区的长度,有的功能码虽不能确定数据区长度,但是数据区有字节计数。

TransactionIdentifier和ProtocolIdentifier由Client生成,Server的响应将复制这些参数。

二、Modbus通讯实例案例

案例描述:

假设我们有一个工业自动化系统,包括主站和多个从站设备。主站需要读取从站设备的温度传感器数据,并向从站设备发送控制指令。

通讯过程:

读取温度传感器数据:

主站请求:主站向从站设备发送读取输入寄存器的请求。假设从站地址为01H,读取的输入寄存器的起始地址为0008H,读取2个寄存器。指令格式如下:
010400080002[CRC校验码]
其中,01为从站地址,04为功能码(读取输入寄存器),0008为起始地址,0002为读取的寄存器数量,[CRC校验码]为校验码。

从站响应:从站设备收到请求后,将温度传感器数据存储在输入寄存器中,并向主站发送响应。响应格式如下:
010404[数据区][CRC校验码]
其中,01为从站地址,04为功能码(读取输入寄存器),04为数据字节数(每个输入寄存器2个字节,共读取2个寄存器,所以数据字节数为4),[数据区]为温度值(以两个字节表示),[CRC校验码]为校验码。

数据解析:主站从响应中提取温度传感器数据,并进行处理。温度值由两个字节组成,需要按照Modbus协议的规定进行解析,得到实际的温度值。

发送控制指令:

主站请求:当需要向从站设备发送控制指令时,主站可以使用写单个保持寄存器或写多个保持寄存器的功能码。例如,假设主站要向从站设备发送一个控制指令,将某个设备的运行状态设置为ON。假设从站地址为01H,保持寄存器的地址为0001H,数据为FF00H(表示ON状态)。指令格式如下:
01060001FF00[CRC校验码]
其中,01为从站地址,06为功能码(写单个保持寄存器),0001为寄存器地址,FF00为数据(高字节在前,低字节在后),[CRC校验码]为校验码。

从站响应:从站设备收到请求后,将寄存器中的数据解析为控制指令,并执行相应的操作。如果写入成功,从站设备将返回写入成功的响应,格式如下:
01060001FF00[CRC校验码]
其中,各字段的含义与请求指令相同,表示写入成功。

另一案例:

假设我们要读取一个温度传感器的数据,该传感器通过ModbusRTU协议与主机连接。传感器的地址为1,数据存储在保持寄存器中,希望读取的寄存器地址为1000。以下是读取温度传感器数据的示例Modbus请求和响应:

请求数据:

地址:1

功能码:03(读取保持寄存器)

起始地址:1000

寄存器数量:1

校验:校验和

请求格式:
地址+功能码+起始地址(高字节+低字节)+寄存器数量(高字节+低字节)+校验和
例如:010303E80001[校验和]

响应数据:

地址:1

功能码:03(读取保持寄存器)

字节数:2(因为读取的是1个保持寄存器,每个保持寄存器2个字节)

数据:温度值(以两个字节表示)

校验:校验和

响应格式:
地址+功能码+字节数+数据(高字节+低字节)+校验和
例如:010302[温度值高字节+温度值低字节][校验和]

主机发送Modbus请求后,设备需要解析请求并进行相应的处理。对于上述的温度传感器例子,设备需要读取保持寄存器中的温度值,并将其作为响应返回给主机。设备还可以根据业务需求进行数据转换、计算和处理,以满足特定的应用场景。

通过以上案例,我们可以看到Modbus协议在工业自动化领域中的实际应用场景。通过读写寄存器的方式,主从设备可以进行简单而高效的数据交互,实现自动化控制和数据采集。Modbus协议以其简单可靠的特点,在工业自动化领域中得到了广泛的应用和推广。