您好,欢迎访问三七文档
Modbus协议主从方式,主站初始化传输。从站根据主设备查询提供的数据作出反应。主站查询格式:站(或广播)地址、功能代码、要发送的数据、错误检测域。从站回应格式:确认要行动的域、返回的数据、错误检测域。如果在消息接收过程中发生错误,或从站不能执行其命令,从站将建立错误消息并把它作为回应发送出去。从站地址是0...247,0为广播地址ASCII模式:地址功能代码数据数量数据1...数据nLRC高字节LRC低字节回车换行消息中的每个ASCII字符都是一个十六进制字符组成每个字节的位:1个起始位7个数据位,最小的有效位先发送1个奇偶校验位,无校验则无1个停止位(有校验时),2个Bit(无校验时)错误检测域LRC(纵向冗长检测)使用ASCII模式,消息以冒号(:)字符(ASCII码3AH)开始,以回车换行符结束(ASCII码0DH,0AH)。其它域可以使用的传输字符是十六进制的0...9,A...F。网络上的设备不断侦测“:”字符,当有一个冒号接收到时,每个设备都解码下个域(地址域)来判断是否发给自己的。消息中字符间发送的时间间隔最长不能超过1秒,否则接收的设备将认为传输错误。RTU模式地址功能代码数据数量数据1...数据nCRC低字节CRC高字节代码系统:8位二进制,十六进制数0...9,A...F消息中的每个8位域都是一个两个十六进制字符组成每个字节的位:1个起始位8个数据位,最小的有效位先发送1个奇偶校验位,无校验则无1个停止位(有校验时),2个Bit(无校验时)错误检测域CRC(循环冗长检测)深入理解ModBus功能码Modbus主要功能码功能码名称注释01ReadCoilStatus(线圈状态0x)(读PLC的输出状态)bit读位,与5对应,可读可写DO02ReadInputStatus(输入状态1x)(读PLC的输入状态)bit读位,只读DI03ReadHoldingRegister(保持寄存器4xHR)(读模出状态)读整形、状态字、浮点型、字符型,与16对应04ReadInputRegister(输入寄存器3xAR)(读PLC模入状态)读整形、状态字、浮点型只读AI05WriteSingleCoil(强制单路输出,给PLC写数据)写单个位可读可写DO06WriteSingleRegister(强制单路模出,给PLC写数据)写单个整形、状态字、浮点型、字符型,写HR4x的地址区15WriteMultipleCoil(强制多路输出,给PLC写数据)写多个位16(0x10H)WriteMultipleRegister(强制多路模出,给PLC写数据)写多个整形、状态字、浮点型、字符型15和16可能是用于一次写一串数据的,不允许单个写。如时间的世纪、年、月、日、时、分、秒要一次写下去设备和Modbus地址范围对应表设备地址Modbus地址描述功能R/W1...10000*address-1Coils(outputs)0Read/Write10001...20000*address-10001DiscreteInputs01Read40001...50000*address-40001HoldingRegisters03Read/Write30001...40000*address-30001InputRegisters04Read*最大值与设备相关注:设备地址是从1开始的,所以Modbus写入地址要在设备地址上减1。协议格式功能码:01(线圈状态0x)(读输出状态)例:从4站读10…22(Coil11…23),从A开始,共D(13)个数据主站从站地址功能码H地址L地址HCoilsLCoilsCRC0401000A000DDD98从站从站地址功能码字节数Coils7..10Coils27..20CRC0401020A1150B3功能码:02(输入状态1x)(读输入状态)例:从4站读10…22(Input10011…10023),从A开始,共D(13)个数据主站从站地址功能码H地址L地址HInputLInputCRC0402000A000D9998从站从站地址功能码字节数Input7..10Input27..20CRC0402020A1114B3功能码:03(保持寄存器4xHR)(读模出状态)例:从1站读0…1(寄存器40001…40002),共2个数据主站从站地址功能码H地址L地址H数据L数据CRC010300000002C40B从站从站地址功能码字节数H数据L数据H数据L数据CRC01030400060005DA31功能码:04(输入寄存器3xAR)(读模入状态)例:从1站读0…1(寄存器30001…30002),共2个数据主站从站地址功能码H地址L地址H数据L数据CRC01040000000271CB从站从站地址功能码字节数H数据L数据H数据L数据CRC01040400060005DB86功能码:05强制单路输出,给PLC写数据例:给17站173单线圈写ON主站从站地址功能码H地址L地址H数据L数据CRC110500ACFF004E8B注:写0xFF00表示ON,写0x0000表示OFF从站从站地址功能码H地址L地址H数据L数据CRC110500ACFF004E8B注:返回帧与主站相同功能码:06强制单路模出,给PLC写数据例:给17站40002变量写0x0003H。帧的地址是0x0001H主站从站地址功能码H地址L地址H数据L数据CRC1106000100039A9B从站从站地址功能码H地址L地址H数据L数据CRC1106000100039A9B注:返回帧与主站相同功能码:15强制多路输出,给PLC写数据例:给17站从20号线圈开始的10个单线圈写ON,MB地址:20-1=19=0x13H数据:帧中位1100110100000001位置7654321015141312111098本例位置起始位为202726252423222120------2928主站从站地址功能码H地址L地址H线圈数量L线圈数量字节数H数据L数据CRC110F0013000A02CD01BF0B从站从站地址功能码H地址L地址H线圈数量L线圈数量CRC11050013000A4E8B注:变量写的从站反馈没有数据功能码:16强制多路模出到保持寄存器,给PLC写数据,每个寄存器的数据为2个字节。例:给17站从40002HR开始的2个寄存器,数据为000A和0102,MB地址:40002-1=40001=MB1主站从站地址功能码H地址L地址H模入数量L模入数量字节数H数据1L数据1H数据2L数据2CRC11100001000204000A0102C6F0从站从站地址功能码H地址L地址H线圈数量L线圈数量CRC1110000100021298注:变量写的从站反馈没有数据Modbus的从站反馈数据没有数据帧的编号(不像TCP协议那样),所以不会显示这个反馈数据是主站的哪次请求的。若主站一次发送N个数据,从站而没有及时反馈,这样就乱了,主站就不知道从站发过来的数据是哪次命令的。单变量与多变量:读可以读单读多,命令不分读几个。但是写要区分写一个还是写多个,所以写命令有写单线圈和写多线圈。Modbus所有功能码功能码名称作用01读取线圈状态取得一组逻辑线圈的当前状态(ON/OFF)02读取输入状态取得一组开关输入的当前状态(ON/OFF)03读取保持寄存器在一个或多个保持寄存器中取得当前的二进制值04读取输入寄存器在一个或多个输入寄存器中取得当前的二进制值05强置单线圈强置一个逻辑线圈的通断状态06预置单寄存器把具体二进值装入一个保持寄存器07读取异常状态取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态08回送诊断校验把诊断校验报文送从机,以对通信处理进行评鉴09编程(只用于484)使主机模拟编程器作用,修改PC从机逻辑10控询(只用于484)可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成操作任务,仅在含有功能码9的报文发送后,本功能码才发送11读取事件计数可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时12读取通信事件记录可是主机检索每台从机的ModBus事务处理通信事件记录。如果某项事务处理完成,记录会给出有关错误13编程(184/384484584)可使主机模拟编程器功能修改PC从机逻辑14探询(184/384484584)可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作,仅在含有功能13的报文发送后,本功能码才得发送15强置多线圈强置一串连续逻辑线圈的通断16预置多寄存器把具体的二进制值装入一串连续的保持寄存器17报告从机标识可使主机判断编址从机的类型及该从机运行指示灯的状态18(884和MICRO84)可使主机模拟编程功能,修改PC状态逻辑19重置通信链路发生非可修改错误后,是从机复位于已知状态,可重置顺序字节20读取通用参数(584L)显示扩展存储器文件中的数据信息21写入通用参数(584L)把通用参数写入扩展存储文件,或修改之22~64保留作扩展功能备用65~72保留以备用户功能所用留作用户功能的扩展编码73~119非法功能120~127保留留作内部作用128~255保留用于异常应答ModBus功能码与数据类型对应表代码功能数据类型01读位02读位03读整型、字符型、状态字、浮点型04读整型、状态字、浮点型05写位06写整型、字符型、状态字、浮点型08N/A重复“回路反馈”信息15写位16写整型、字符型、状态字、浮点型17读字符型Modbus变量地址映射地址功能地址类型存取方式描述0xxxx01,05,15Coil读写1xxxx02离散输入只读2xxxx03,04,06,16浮点寄存器读写两个连续16位寄存器表示一个浮点数(ieee754格式32位)3xxxx04输入寄存器只读每个寄存器表示一个16位无符号整数(0~65535)同上4xxxx03,06,16保持寄存器读写5xxxx03,04,06,16ascii字符读写每个寄存器表示两个ascii字符FAQ0:ABB组态软件有功能块读线圈-1,读线圈-8,读寄存器-1,读寄存器-8的原因是什么?因为Modbus功能码的读操作可以指定数据长度。如果从站的地址连续,则可以用一次读八个变量的操作。如果不连续,可以一次读一个。读八个的效率要高一些。FAQ1:MB地址的问题:MB经常用30001,40001这样的地址,WHY?给个理由。ANS1:地址以3开头,如IFIX的mb1中地址用30001、3001、300001表示的是功能码4的操作,即读输入寄存器。同理,地址以4开头表示的是功能码3的操作,即对指的是对输出寄存器/内部寄存器进行的操作。虽然Modbus有两个字节表示地址0xFFFF,共64K,但是一般用不了那么多的。例:高安屯垃圾电厂DCSModbus通讯点表DCS-TAG_№DESCRIPTIONTypeDataAddr.XA0FG10-1ACTIVATEDCARBONSTORAGESILOVENTINGFILTERFANFAULTDIBOOL00407HC#RC10-ONo.#INLETDAMPERFORNIDSYSTEMAINSERVICECOMMANDDOBOOL10001ATO#FG03-SNo.#SETPOINTSO2EMISSIONAOINT30002AI#RC01No.#REACTORINLETGASSO2ANALYZERAIINT40001注:地址以2开头表示浮点数,以0,1,3,4开头表示整数。FAQ2:Modbus功能码的名称来源是什么?ANS2:因为Modbus主要用于与PLC通讯,所以Modbus的地址空间命名也服从PLC的方式。功能码名称注释01ReadCoilStatus读PLC的输出状态,可能是内部量可读可写02ReadInputStatus读PLC的输入DI点状态只读DI,通道来03ReadHoldingRegist
本文标题:Modbus资料
链接地址:https://www.777doc.com/doc-4802067 .html