1 word = 2 byte;
1 byte = 8 bit.
校验码:校验码是由前面的数据通过某种算法得出的,用以检验该组数据的正确性。代码作为数据在向计算机或其它设备进行输入时,容易产生输入错误,为了减少这种输入错误,编码专家发明了各种校验检错方法,并依据这些方法设置了校验码。
常用的校验有:累加和校验SUM、字节异或校验XOR、纵向冗余校验LRC、循环冗余校验CRC……
离散量输入:主要用来读取单个位的数据,如IO的状态;
线圈:开关输出信号,主要用来写入单个位的数据,与离散量构成组成对位的操作;
输入寄存器:主要用来读取16位,也就是两个字节的数据;
保持寄存器:主要用来写入16位的数据。、
PLC:可编程逻辑控制器,是一种采用一类可编程的存储器,用于其内部存储程序,执行逻辑运算、顺序控制、定时、计数与算术操作等面向用户的指令,并通过数字或模拟式输入/输出控制各种类型的机械或生产过程。
Modbus通信协议,是Modicon PLC所制定的资料交换通信接口标准,于1979年首先制定串行通信标准(含Modbus异步及Modbus Plus同步),于1997年制定网络通信标准(Modbus/TCP)。是属于OSI所定义的通信层的第七层应用层(Application Layer)。是为Client/Server或称为 Master/Slave型式的通信协议。由于Modbus的通信协议简单容易设计,结果广被许多控制设备或外围信号设备所采用,因此无形中成为自控业界的标准。Modbus异步的硬件架构简单,被使用的比率最高。Modbus Plus同步的协议可以提供高速的通信速度,适合主控制设备间大量资料交换。Modbus/TCP则是因应Ethernet网络的架构,近年来被大量使用的通信协议,也因为其速度及资料传送量远比Modbus Plus更快更大,所以已渐渐取代其功能。
Modbus通信协议基本上是遵循MasterandSlave的通信步骤,有一方扮演Master角色采取主动询问方式,送出QueryMessage给Slave方,然后由Slave方依据接到的QueryMessage内容准备ResponseMessage回传给Master。即使目前硬件通信已经可以达到双方互相主动通信的能力,但是于Modbus通信协议的规定,必须一方为Master,另一方为Slave不能互换角色。一般使用上,监控系统(HMI)都为Master,PLC、电表、仪表等都为Slave,HMI系统一直PollingSlave的各种relayandregister最新数值,然后做显示及各种逻辑计算及控制调整等处理。
起始字符组:于前面再多加6个字符,以定义一些TCP/IP的需要 系数。说明如下:
Byte0:本次通信Message的编号以2 bytes整数(Byte 0、1)表示,此 byte为上字符,一般是由Master编号之,以区分每次Message。如果是Slave则将Master传来的Query Message照转至Response Message。
Byte1:本次通信Message的编号下字符。
Byte2:通信协议识别号码以2 bytes整数(Byte 2、3)表示,此 byte 为上字符,于此处为零。
Byte3:通信协议识别号码下字符,于此处为零。
Byte4:Message长度以2 bytes整数(Byte 4、5)表示,此 byte 为上字符(由Device Address至Data为止),因为长度不能超过256位,所以此位永远为零。
Byte5:Message长度下字符(由Device Address至Data为止)。
由Device Address至Data等资料,都是将 8 bits原始值转换为两码的十六进制ASCII码,所以其实际传送的字符数约为RTU格式的两倍。Data:数个字符是表示每个Function Code有不同数目的详细资料规定。
Modbus规定IP Port No. 为 502。
Modbus协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网线路上的Modbus协议映射能够在应用数据单元(ADU)上引入一些附加域。
启动Modbus事务处理的客户机创建Modbus应用数据单元。功能码向服务器指示将执行哪种操作。
Modbus协议建立了客户机启动的请求格式。
用一个字节编码Modbus数据单元的功能码域。有效范围是十制制1-255(128-255为异常响应保留)。当从客户机向服务器发送报文时,功能码域通过服务器执行哪种操作。
从客户机向服务器发送的报文数据域包括附加信息,服务器使用这个信息执行功能码定义的操作。这个域还包括离散项目和寄存器地址、处理项目的数量以及域中的实际数据字节数。
在某种请求中,数据域可以是不存在的,在此情况下服务器不需要任何附加信息。功能码仅说明操作。
功能码主要分为有效功能码、异常功能码和错误功能码。
如果在一个正确接收Modbus ADU中,不出现与请求Modbus功能有关的差错,那么服务器至客户机的响应数据会包含请求中的正常功能码。如果出现与请求Modbus功能有关的差错,那么响应数据会包含一个异常码和错误码。
例如,客户机能够读一组离散量输出或输入的开/关状态,或者用户能够读/写一组寄存器数据内容。当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或出现某种差错(称为异常响应)。对于一个正常响应来说,服务器仅对原始功能码响应,如下图:
对于异常响应,服务器返回一个与客户机等同的码,设置该原始功能码的最高有效位为逻辑1,并加该异常码后增加错误码,以通知客户机异常原因。如下图:
有效功能码有二十几种,但是一般使用上都以1、2、3、4、5、6、15、16等八种最为常用,以及另外特殊使用的20、21两种,此为General Reference Register,绝大部份的Modbus设备并不会提供此Register。于PLC上主要的控制数据有下列四种型式。此八种功能码就是处理这些控制资料,详细说明如下各点:
控制数据四种型式:
DI:DigitalInput(数字输入,离散输入),一个地址一个数据位,用户只能读取它的状态,不能修改。以一个 bit表示 On/Off,用来记录控制信号的状态输入,例如:开关,接触点,马达运转,超限switch…等等。于PLC上被称为Input relay、input coil等。
DO:DigitalOutput(数字输出,线圈输出),一个地址一个数据位,用户可以置位、复位,可以回读状态。以一个 bit表示 On/Off,用来输出控制信号,以激活或停止马达,警铃,灯光…等等。于PLC上被称为Output relay、Output coil等。
AI:Analog Input(模拟输入,输入寄存器),一个地址16位数据,用户只能读,不能修改,,以16 bits integer表示一个数值,用来记录控制信号的数值输入,例如:温度、流量、料量、速度、转速、文件板开度、液位、重量…等等。于PLC上被称为Input register。
AO:AnalogOutput(模拟输出,保持寄存器),一个地址16位数据,用户可以写,也可以回读,以16 bits integer表示一个数值,用来输出控制信号的数值,例如:温度、流量、速度、转速、文件板开度、饲料量…等等设定值。于PLC上被称为Output register、Holding register。
有效功能码说明(十进制)
01 |
读取线圈状态 |
02 |
读取输入状态 |
03 |
读取保持寄存器 |
04 |
读取输入寄存器 |
05 |
强置单线圈 |
06 |
预置单寄存器 |
07 |
读取异常状态 |
08 |
回送诊断校验 |
09 |
编程(只用于484) |
10 |
控询 |
11 |
读取事件计数 |
12 |
读取通信事件记录 |
13 |
编程(184/384/484/584等) |
14 |
探寻 |
15 |
强置多线圈 |
16 |
预置多线圈 |
17 |
报告多寄存器 |
18 |
可使主机模拟编程功能 |
19 |
重置通信链路 |
20 |
读取通用参数 |
21 |
写入通用参数 |
22 |
屏蔽写寄存器 |
23 |
读/写多个寄存器 |
43 |
读设备别识码 |
22-42,44-64 |
保留作为扩展功能 |
65-72 |
保留以备用功能所用 |
73-119 |
非法功能 |
120-127 |
保留,留作内部作用 |
128-255 |
保留,用于异常应答 |
注:功能码的具体描述可参考如下地址第11页:
http://wenku.baidu.com/link?url=cm-3qRyq2LAUZV3hb7fHucYD2NgacRy4bC-eJI4z4NBY03SZeGQqsISLACm_hwsbRKo7ChWsrAO5sXDXJyMJhnpyLZvVSXUOMt3iG7zgsGC
异常码(ExceptionCode)是用来表示,当有任何通信资料异常时,由Slave不回传正常资料,而回传错误码号(Error Code)以提供Master做异常处理。其Message格式以下表为例说明:
由以上可知处理ExceptionCode,将原有的Function Code的最左边 Bit 设定为 1,然后将适合的Error code代入。比如:上图功能码为06(二进制为00000110),因为是地址超出范围,属于异常情况,所以将最左边bit设为1,即:10000110,转成10进制为86。
01 |
非法功能。对于服务器(或从站)来说,询问中接收到的功能码是不可允许的操作,可能是因为功能码仅适用于新设备而被选单元中不可实现同时,还指出服务器(或从站)在错误状态中处理这种请求,例如:它是未配置的,且要求返回寄存器值。 |
02 |
非法数据地址。对于服务器(或从站)来说,询问中接收的数据地址是不可允许的地址,特别是参考号和传输长度的组合是无效的。对于带有100个寄存器的控制器来说,偏移量96和长度4的请求会成功,而偏移量96和长度5的请求将产生异常码02。 |
03 |
非法数据值。对于服务器(或从站)来说,询问中包括的值是不可允许的值。该值指示了组合请求剩余结构中的故障。例如:隐含长度是不正确的。modbus协议不知道任何特殊寄存器的任何特殊值的重要意义,寄存器中被提交存储的数据项有一个应用程序期望之外的值。 |
04 |
从站设备故障。当服务器(或从站)正在设法执行请求的操作时,产生不可重新获得的差错。 |
05 |
确认。与编程命令一起使用,服务器(或从站)已经接受请求,并且正在处理这个请求,但是需要长持续时间进行这些操作,返回这个响应防止在客户机(或主站)中发生超时错误,客户机(或主机)可以继续发送轮询程序完成报文来确认是否完成处理。 |
06 |
从属设备忙。与编程命令一起使用。服务器(或从站)正在处理长持续时间的程序命令。张服务器(或从站)空闲时,用户(或主站)应该稍后重新传输报文。 |
08 |
存储奇偶差错。与功能码20和21以及参考类型6一起使用,指示扩展文件区不能通过一致性校验。服务器(或从站)设法读取记录文件,但是在存储器中发现一个奇偶校验错误。客户机(或主方)可以重新发送请求,但可以在服务器(或从站)设备上要求服务。 |
10 |
不可用网关路径。与网关一起使用,指示网关不能为处理请求分配输入端口至输出端口的内部通信路径。通常意味着网关是错误配置的或过载的。 |
11 |
网关目标设备响应失败。与网关一起使用,指示没有从目标设备中获得响应。通常意味着设备未在网络中。 |
报文分两种,查询报文和响应报文
此报文为仿真软件抓取
00000000 d05f[k1] 0000[k2] 0006[k3] 01[k4] 03[k5] 00 00[k6] 0064[k7]
此条报文的意思是:从寄存器起始地址0000开始,读取100个寄存器(每个寄存器2个字节)。
[k1]起始字符组,用于区分查询与其响应报文是否是一组
[k2]起始字符组,协议类型报文,0000代表是modbus/TCP类型
[k3]起始字符组,包长,代表后面有6个字节的内容
[k4]设备地址
[k5]功能码03,表示读取保持寄存器
[k6]寄存器起始位置
[k7]要读取100个寄存器
00000000 d0 5f[k8] 0000[k9] 00cb[k10] 01[k11] 03[k12] c8[k13] 00 00 00 00 00 00 00 ._...... ........
00000010 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 ........ ........
00000020 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 ........ ........
00000030 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 ........ ........
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
00000050 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 ........ ........
00000060 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 ........ ........
00000070 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 ........ ........
00000080 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 ........ ........
00000090 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 ........ ........
000000A0 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 ........ ........
000000B0 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 ........ ........
000000C0 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 ........ ........
000000D0 00 .[k14]
此条报文的意思是:读取100个寄存器内容,反馈给查询方
[k8]起始字符组,与查询报文对应
[k9]起始字符组,协议类型报文,0000代表是modbus/TCP类型
[k10]起始字符组,包长,代表后面有203个字节的内容
[k11]设备地址
[k12]功能码03,表示读取保持寄存器
[k13]代表后面有200个字节
[k14]指读取的100个寄存器内容
以下报文是shodan流量中的
00000000 0000[k15] 00 00[k16] 00 02[k17] 07[k18] 11[k19]
[k15]起始字符组,用于区分查询与其响应报文是否是一组
[k16]起始字符组,协议类型报文,0000代表是modbus/TCP类型
[k17]起始字符组,包长,代表后面有2个字节的内容
[k18]设备地址
[k19]功能码17,表示报告多寄存器
00000000 0000[k20] 00 00[k21] 00 03[k22] 07[k23] 91[k24] 0b[k25]
[k20]起始字符组,与查询报文对应
[k21]起始字符组,协议类型报文,0000代表是modbus/TCP类型
[k22]起始字符组,包长,代表后面有3个字节的内容
[k23]设备地址
[k24]异常码,原功能码17(十进制),二进制为00010001,在最高位加1后为10010001,转成16进制为91
[k25]错误码11,表示网关目标设备响应失败。
00000000 00 00 00 00 00 05 07[k26] 2b[k27] 0e[k28] 01[k29] 00[k30]
[k26]设备地址
[k27]功能码43,表示读取设备识别码
[k28]基本设备识别码。所有此种对象都是必备的:厂商名称、产品代码和修订本号。
[k29]正常设备识别码。提供附加的和可选择的识别码以及数据对象描述。按标准定义所有种类的对象,但这种对象的执行是可选的。
[k30]扩展设备识别码。除正常数据对象外,提供附加的和可选择的识别码以及专用数据描述。所有这些数据都是与设备有关的。
00000000 0000[k31] 00 00[k32] 00 03[k33] 07[k34] ab[k35] 0b[k36]
[k31]起始字符组,与查询报文对应
[k32]起始字符组,协议类型报文,0000代表是modbus/TCP类型
[k33]起始字符组,包长,代表后面有3个字节的内容
[k34]设备地址
[k35]异常码171。16进制2B转二进制为00101011,最高位加1后为10101011,转16进制为ab
[k36]错误码11,表示网关目标设备响应失败。
主要是从网上查找资料
1. Modbus通信通讯教程(详细)
网址:http://wenku.baidu.com/view/7c737b5d915f804d2a16c122.html?re=view
2. MODBUS通讯协议中文版
网址:http://wenku.baidu.com/link?url=cm-3qRyq2LAUZV3hb7fHucYD2NgacRy4bC-eJI4z4NBY03SZeGQqsISLACm_hwsbRKo7ChWsrAO5sXDXJyMJhnpyLZvVSXUOMt3iG7zgsGC
3.报文主要来源
网址:http://www.pcapr.net/browse?q=Modbus