TCP 模式是为了让Modbus 数据顺利在以太网上传输产生的,使用TCP502端口。该协议物理层,数据链路层,网络层,传输层都是基于TCP 协议,只在应用层,将Modbus 协议修改后封装进去; 接收端将该TCP数据包拆封后,重新获得原始Modbus 帧,按照Modbus 协议规范进行解析,并将返回的数据包重新封装进TCP协议中,返回到发送端。与串行链路传输的数据格式不同,TCP模式去除了附加地址和校验,增加了报文头,其具体格式如图4所示。
在modbus TCP中包含一个MBAP头,该头包含以下几个部分
区域 | 长度 | 描述 | 客户端 | 服务器 |
---|---|---|---|---|
传输标志 | 2字节 | MODBUS 请求和响应传输过程中序列号 | 客户端生成 | 应答时复制该值 |
协议标志 | 2字节 | Modbus协议默认为0 | 客户端生成 | 应答时复制该值 |
长度 | 2字节 | 剩余部分的长度 | 客户端生成 | 应答时由服务器端生成 |
单元标志 | 1字节 | 从机标志(从机地址) | 客户端生成 | 应答时复制该值 |
【注意】
【1】传输标志可理解为序列号,防止 MODBUSTCP通信错位,例如后发生的响应先到了主机,而早发生的响应后到主机
【2】单元标志可理解为从机地址,此时已经不再重要
6.4 modbus tcp 和 TCP IP的关系
modbusTCP可以理解为发生在TCP上的应用层协议,既然是TCP协议那么一个完整的MODBUSTCP报文必然包括TCP首部,IP首部和Ethernet首部。
07 功能码作用
启动Modbus事务处理的客户机创建Modbus应用数据单元。功能码(PDU中的)向服务器指示将执行哪种操作。
用一个字节编码Modbus数据单元的功能码域。有效范围是十制制1-255(128-255为异常响应保留)。当从客户机向服务器发送报文时,功能码域通过服务器执行哪种操作。
从客户机向服务器发送的报文数据域包括附加信息,服务器使用这个信息执行功能码定义的操作。这个域还包括离散项目和寄存器地址、处理项目的数量以及域中的实际数据字节数。
在某种请求中,数据域可以是不存在的,在此情况下服务器不需要任何附加信息。功能码仅说明操作。
功能码的类型
功能码主要分为有效功能码、异常功能码和错误功能码。
如果在一个正确接收ModbusADU中,不出现与请求Modbus功能有关的差错,那么服务器至客户机的响应数据会包含请求中的正常功能码。如果出现与请求Modbus功能有关的差错,那么响应数据会包含一个异常码和错误码。
例如,客户机能够读一组离散量输出或输入的开/关状态,或者用户能够读/写一组寄存器数据内容。当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或出现某种差错(称为异常响应)。对于一个正常响应来说,服务器仅对原始功能码响应,如下图:
对于异常响应,服务器返回一个与客户机等同的码,设置该原始功能码的Zui高有效位为逻辑1,并加该异常码后增加错误码,以通知客户机异常原因。如下图:
有效功能码
有效功能码有二十几种,一般使用上都以1、2、3、4、5、6、15、16等八种Zui为常用,以及特殊使用的20、21两种,此为GeneralReferenceRegister,绝大部份的Modbus设备并不会提供此Register。于PLC上主要的控制数据有下列四种型式。此八种功能码就是处理这些控制资料,详细说明如下各点:
控制数据四种型式:
DI:DigitalInput(数字输入,离散输入),一个地址一个数据位,用户只能读取它的状态,不能修改。以一个 bit表示On/Off,用来记录控制信号的状态输入,例如:开关,接触点,马达运转,超限switch…等等。于PLC上被称为Inputrelay、input coil等。
DO:DigitalOutput(数字输出,线圈输出),一个地址一个数据位,用户可以置位、复位,可以回读状态。以一个 bit表示On/Off,用来输出控制信号,以激活或停止马达,警铃,灯光…等等。于PLC上被称为Output relay、Outputcoil等。
AI:Analog Input(模拟输入,输入寄存器),一个地址16位数据,用户只能读,不能修改,,以16 bitsinteger表示一个数值,用来记录控制信号的数值输入,例如:温度、流量、料量、速度、转速、文件板开度、液位、重量…等等。于PLC上被称为Inputregister。
AO:AnalogOutput(模拟输出,保持寄存器),一个地址16位数据,用户可以写,也可以回读,以16 bitsinteger表示一个数值,用来输出控制信号的数值,例如:温度、流量、速度、转速、文件板开度、饲料量…等等设定值。于PLC上被称为Outputregister、Holding register。