一、基础知识:1、什么是Modbus?Modbus是由Modicon(现为施耐德电气公司的一个品牌)在1979年发明的,是全球第一个真正用于工业现场的总线协议。2、主--从结构:主设备查询查询消息中的功能代码告之被选中的从设备要执行何种功能。数据段包含了从设备要执行功能的任何附加信息。例如功能代码03是要求从设备读保持寄存器并返回它们的内容。数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。错误检测域为从设备提供了一种验证消息内容是否正确的方法。从设备回应如果从设备产生正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。数据段包括了从设备收集的数据:像寄存器值或状态。如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。错误检测域允许主设备确认消息内容是否可用。每个MODBUS帧都包括地址域功能域数据域错误检测域3、Modbus的三种通信协议:Modbus协议分为三种通信方式:ModbusRTU、ModbusASCII以及ModbusTCP。首先,ModbusTCP的通信格式和ModbusRTU非常相似,唯一的差别只是ModbusRTU最后带两个字节的CRC校验,而ModbusTCP没有。其次,ModbusASCII的通信格式与ModbusRTU其实“神合貌离”,就是把ModbusRTU的每一个字节(例如:27H)高四位(2)和低四位(7)拆分为两个字节,并以ASCII码的方式表现出来(3237),再给命令帧分别加上起始符和结束符便可以,当然ModbusRTU和ModbusASCII的校验的方式不同,这里暂不详述,所以同一条命令用ModbusRTU方式和ModbusASCII方式表现出来,虽然在命令长度的上有很大的区别,但其实际表达的意思却是一样。4、RTU方式:帧定界:MODBUSRTU方式下,每两个字符之间发送或者接收的时间间隔不能超过1.5倍字符传输时间。如果两个字符时间间隔超过了3.5倍的字符传输时间,规约就认为一帧数据已经接收,新的一帧数据传输开始。备注:NPort与MGate产品的区别就在于,MGate在每帧报文的之后,增加了3.5倍的字符传输时间,而NPort则没有。5、ASCII方式:帧定界:“:”帧起始“CRLF”帧结束ASCII方式用两个ASCII字符表示一个8位数据,比如16进制的3A用字符“3”和字符“A”表示。6、ModbusTCPModbusTCP数据帧包含报文头、功能代码和数据3个部分:MBAP报文头(MBAP:ModbusApplicationProtocol,Modbus应用协议)分4个域,共7个字节:自注:这里的客户端、服务器端是指TCP的Client、Server端。二、MGate说明:1、通信模式1)MGate配置文件中:Modbus采用主从结构,只有两种模式:Master和SlaveRTU/ASCIISlave:PC作为Master主,装置作为Slave从;RTU/ASCIIMaster:PC作为Slave从,装置作为Master主;RTU与ASCII的区别:a)校验:RTU:CRC(循环冗长校验);ASCII:LRC(纵向冗长校验);校验码用于检查信息的完整性;b)消息格式不同:RTU:消息中每个字节(8Bit)包含2个4Bit的十六进制字符,优点:同样波特率下,比ASCII传送更多的数据;ASCII:消息中每个字节(8Bit)都作为一个ASCII码(2个十六进制字符)发生,优点:字符发送的时间间隔可达到1秒而不产生错误;2)说明手册中:两种通信模式:A)以太网Master串口Slave:ModbusTCP可支持同时16个连接,串口支持RS-232和RS-422/485,其中RS-232和RS-422仅能连一个设备,RS-485可连接31个设备;B)串口Master以太网Slave:可支持32个ModbusTCPslave设备;三、实测:1、结构:笔记本电脑网口MB3480笔记本+UPort1150;2、UPort1150设置:默认为RS-232方式,注意设置为RS-485(也可为RS-232),方法:“控制面板”“设备管理器”3、MB3480的设置:1)主从模式的设定:以PC端作为Master、装置作为Slave为例;2)设置串口状态:3)ID映射:说明:a)ModbusTCP通信标准端口号为502,所有的端口号都是502,串口通过ID好识别;b)ID表中设置情况:1~5:Port1;6~10:Port2;c)从站偏移量:可不设,以下为例子,假定偏移量为3;4、使用的软件:前提说明:两套软件:软件一:自己在网上找的ModbusPoll和ModbusSlave,注意:ModbusPoll:只作为Master(主端)(TCPMaster和RTUMaster都用它);ModbusSlave:只作为Slave(从端)(TCPSlave和RTUSlave都用它);软件二:刘丹提供的ModScan32和ModSim32,注意:ModScan32:只作为Master(主端)(TCPMaster和RTUMaster都用它);ModSim32:只作为Slave(从端)(TCPSlave和RTUSlave都用它);软件一:ModbusPoll(用于TCPMaster)ModbusSlave(用于串口的Slave)1)打开ModbusSlave:选择“Connectiong”注意:UPort1150映射为主机的COM2口,使用这里选择Port2;ID号:1;功能码:3;2)打开ModbusPoll:选择“Connection”,端口号为502;ID号:1;功能码:3;3)注意事项:a)ModbusPoll和ModbusSlave设置的ID号、功能码必须一致;b)通信成功的判断:可从ModbusPoll软件本身、MGateManager的“监控”来观察;注意:MdobusSlave软件无法判断连接是否成功;通信成功的界面:ModbusPoll:Tx值不断增加,Err值为0(Err指响应的返回值);MGateManager“监控”:通信不成功的界面:比如:将ModbusSlave的连接断开,则ModbusPoll会报错:正确的连接,则Err=0;MGateManager“监控”:图中:TCPReq、RTUReq(通过MB3480转发到RTU串口的),没有Resp。c)其他功能键的使用:ModbusPoll:Read/WriteDefinition:可设置ID号、功能码、地址;ResetCounters:充值计数器;其中:地址可自定义,但是ModbusPoll和ModbusSlave的地址设置都要一致;ModbusSlave:SlaveDefinition:可设置ID号、功能码、地址;软件二:ModScan32:用于TCPMaster;ModSim32:用于RTUSlave;1)打开ModSim32软件:直接打开目录,点击“ModSim32.exe”即可;点击“OK”;等几秒钟,“OK”由灰色变为黑色即可点击;等几秒钟,“OK”由灰色变为黑色即可点击;“File”“New”:“Connection”“Port2”---UPort1150在笔记本上映射的端口号为COM;2)打开ModScan32软件:直接打开目录,点击“ModScan32.exe”即可;“Connection”“RemoteTCP/IPServer”:3)注意事项:a)ModScan32和ModSim32的Address(地址)、DeviceId(ID号)、MODBUSPointType(功能码,为3)设置必须一致,其中:ID号:Port1为1~5;功能码:为3;Address:可自己设定,只要ModScan32和ModSim32的一致就可以了;b)连接不成功的界面:比如:将Address一个设置为“0001”,另一个设置为“0100”,则会连接不成功,如下界面:而ModSim32则不会有报错信息;错误一:出现“**MODBUSMessageTIME-OUT**”,如果正确的连接,则没有这行报错;错误二:NumberofPolls的值一直在增加,而ValidSlaveResponses的值不变,这说明TCPMaster一直发送请求,却一直没有得到回应;当正确连接后,点击“ResetCtrs”后,这个计数值就会清零,重新累计,出现的数据应该是NumberofPolls与ValidSlaveResponses一致;c)当修改设置后,参数会自动执行,不要重启软件或按键;d)如果所有设置都正确,但是连接却还是报错,这种情况下,只要将ModScan32和ModSim32软件重新开启就可以了,因为这个软件是没有经过注册的;5、监控和数据报文:1)一个完整的轮询过程:TCPReq(TCP请求)转为RTUReq(RTU请求)RTUResp(RTU回应)TCPResp(TCP回应);2)报文内容:分析如下:TCPReq:010000000006010300630005TCP请求MBAP报头从设备ID起始地址读寄存器个数7个Byte(字节)功能码MBAP报头格式:MBAP包含7个字节:0100:处理标识ID,取决于设备的类型,取值一般为0000到FFFF;0000:协议ID,0=Modbus协议;0006:后面跟随的字节个数(包含从设备ID号),此例:后面跟随了6个字节;01:从设备的ID号;RTUReq:01030063000575D7RTU请求从设备ID起始地址读寄存器个数功能码CRC校验码(高低)---RTU方式;RTUResp:01030A00010002000300040005CF24RTU回应从设备ID回复的数据校验码长度CRC(高低)功能码TCPResq:TCP回应01000000000D01030A00010002000300040005MBAP报头从设备ID长度回复的数据功能码MBAP:000D:13---后面跟随13个字节;6、较深入的报文内容:1)ModbusPoll向多个寄存器发送数据的报文分析:a)ModbusPoll中的设置:双击红框部分,界面:Value中填入要发送的数据,注意:这是十进制,对于“监控”中是十六进制;SlaveID:Port所接从设备的ID;Address:这是寄存器地址,第1个是0,第2个是1……;b)多寄存器报文分析:监控中看到的数据:分析:第一组:i)TCPReq:TCP发送请求;时间数据0.00003360000000601030000000AMBAP报头从设备ID起始地址读寄存器个数功能码MBAP:0336:处理标识ID;0000:协议ID,0=Mdobus;0006:后面跟随的字节个数;01:从设备ID;ii)RTUReq:通过MB3480转换到串口的请求;时间数据0.00001030000000AC5CD从设备ID起始地址寄存器个数CRC校验码功能码注意:i)与ii)的起始地址、寄存器个数是一样的;ii)在i)的基础上,去掉了MBAP报头,并且增加了CRC校验码;iii)RTUResp:从串口RTU回应的数据;时间数据0.090010314000F00100011001200000000000000000000从设备ID长度1516171800001169功能码校验码一共10个寄存器:000F:表示15;0010:表示16;0011:表示17;0012:表示18;其余寄存器为00,没有发送数据;注意:第i)、ii)是请求,没有具体数据,只有寄存器起始地址和寄存器个数;第iii)、iv)开始回应数据;iv)TCPResp:通过MB3480转到TCP的回应数据;时间数据0.090033600000017010314000F001000110012000000MBAP报头从设备ID长度000000000000000000功能码数据注意:第iv)的MBAP报头与i)的报头是一样的;第二组:与