资源描述:
《modbus通讯协议及编程》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
MODBUS通讯协议及编程 ModBus通讯协议分为RTU协议和ASCII协议,我公司的多种仪表都采用ModBusRTU通讯协议,如:CH2000智能电力监测仪、CH2000M电力参数采集模块、巡检表、数显表、光柱数显表等。下面就ModBusRTU协议简要介绍如下:一、通讯协议(一)、通讯传送方式: 通讯传送分为独立的信息头,和发送的编码数据。以下的通讯传送方式定义也与MODBUSRTU通讯规约相兼容:编码8位二进制起始位1位数据位8位奇偶校验位1位(偶校验位)停止位1位错误校检CRC(冗余循环码)初始结构=≥4字节的时间地址码=1字节功能码=1字节数据区=N字节错误校检=16位CRC码结束结构=≥4字节的时间 地址码:地址码为通讯传送的第一个字节。这个字节表明由用户设定地址码的从机将接收由主机发送来的信息。并且每个从机都有具有唯一的地址码,并且响应回送均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机发送的地址码表明回送的从机地址。 功能码:通讯传送的第二个字节。ModBus通讯规约定义功能号为1到127。本仪表只利用其中的一部分功能码。作为主机请求发送,通过功能码告诉从机执行什么动作。作为从机响应,从机发送的功能码与从主机发送来的功能码一样,并表明从机已响应主机进行操作。如果从机发送的功能码的最高位为1(比如功能码大与此同时127),则表明从机没有响应操作或发送出错。26 数据区:数据区是根据不同的功能码而不同。数据区可以是实际数值、设置点、主机发送给从机或从机发送给主机的地址。 CRC码:二字节的错误检测码。(二)、通讯规约: 当通讯命令发送至仪器时,符合相应地址码的设备接通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务;然后把执行结果返送给发送者。返送的信息中包括地址码、执行动作的功能码、执行动作后结果的数据以及错误校验码。如果出错就不发送任何信息。1.信息帧结构地址码功能码数据区错误校验码8位8位N×8位16位 地址码:地址码是信息帧的第一字节(8位),从0到255。这个字节表明由用户设置地址的从机将接收由主机发送来的信息。每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送。当从机回送信息时,相当的地址码表明该信息来自于何处。 功能码:主机发送的功能码告诉从机执行什么任务。表1-1列出的功能码都有具体的含义及操作。代码含义操作03读取数据读取当前寄存器内一个或多个二进制值06重置单一寄存器把设置的二进制值写入单一寄存器 数据区:数据区包含需要从机执行什么动作或由从机采集的返送信息。这些信息可以是数值、参考地址等等。例如,功能码告诉从机读取寄存器的值,则数据区必需包含要读取寄存器的起始地址及读取长度。对于不同的从机,地址和数据信息都不相同。 错误校验码:主机或从机可用校验码进行判别接收信息是否出错。有时,由于电子噪声或其它一些干扰,信息在传输过程中会发生细微的变化,错误校验码保证了主机或从机对在传送过程中出错的信息不起作用。这样增加了系统的安全和效率。错误校验采用CRC-16校验方法。注:信息帧的格式都基本相同:地址码、功能码、数据区和错误校验码。2.错误校验26 冗余循环码(CRC)包含2个字节,即16位二进制。CRC码由发送设备计算,放置于发送信息的尾部。接收信息的设备再重新计算接收到信息的CRC码,比较计算得到的CRC码是否与接收到的相符,如果两者不相符,则表明出错。 CRC码的计算方法是,先预置16位寄存器全为1。再逐步把每8位数据信息进行处理。在进行CRC码计算时只用8位数据位,起始位及停止位,如有奇偶校验位的话也包括奇偶校验位,都不参与CRC码计算。 在计算CRC码时,8位数据与寄存器的数据相异或,得到的结果向低位移一字节,用0填补最高位。再检查最低位,如果最低位为1,把寄存器的内容与预置数相异或,如果最低位为0,不进行异或运算。 这个过程一直重复8次。第8次移位后,下一个8位再与现在寄存器的内容相相异或,这个过程与以上一样重复8次。当所有的数据信息处理完后,最后寄存器的内容即为CRC码值。CRC码中的数据发送、接收时低字节在前。 计算CRC码的步骤为:·预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;·把第一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器;·把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;·如果最低位为0:重复第3步(再次移位);如果最低位为1:CRC寄存器与多项式A001(1010000000000001)进行异或;·重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;·重复步骤2到步骤5,进行下一个8位数据的处理;·最后得到的CRC寄存器即为CRC码。3.功能码03,读取点和返回值: 仪表采用ModbusRTU通讯规约,利用通讯命令,可以进行读取点(“保持寄存器”)或返回值(“输入寄存器”)的操作。保持和输入寄存器都是16位(2字节)值,并且高位在前。这样用于仪表的读取点和返回值都是2字节。一次最多可读取寄存器数是60。由于一些可编程控制器不用功能码03,所以功能码03被用作读取点和返回值。从机响应的命令格式是从机地址、功能码、数据区及CRC码。数据区中的寄存器数据都是每两个字节高字节在前。4.功能码06,单点保存26 主机利用这条命令把单点数据保存到仪表的存储器。从机也用这个功能码向主机返送信息。二、编程举例 下面是一个用VC编写的ModBusRTU通讯的例子(一)、通讯口设置DCBdcb;hCom=CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);if(hCom==INVALID_HANDLE_VALUE){ MessageBox("createfileerror,error");}BOOLerror=SetupComm(hCom,1024,1024);if(!error) MessageBox("setupcommerror");error=GetCommState(hCom,&dcb);if(!error) MessageBox("getcommstate,error");dcb.BaudRate=2400;dcb.ByteSize=8;dcb.Parity=EVENPARITY;//NOPARITY;dcb.StopBits=ONESTOPBIT;error=SetCommState(hCom,&dcb);(二)、CRC校验码计算UINTcrcvoidcalccrc(BYTEcrcbuf){BYTEi;crc=crc^crcbuf;for(i=0;i<8;i++){26 BYTETT;TT=crc&1;crc=crc>>1;crc=crc&0x7fff;if(TT==1)crc=crc^0xa001;crc=crc&0xffff;}}(三)、数据发送zxaddr=11;//读取地址为11的巡检表数据zxnum=10;//读取十个通道的数据writebuf2[0]=zxaddr;writebuf2[1]=3;writebuf2[2]=0;writebuf2[3]=0;writebuf2[4]=0;writebuf2[5]=zxnum;crc=0xffff;calccrc(writebuf2[0]);calccrc(writebuf2[1]);calccrc(writebuf2[2]);calccrc(writebuf2[3]);calccrc(writebuf2[4]);calccrc(writebuf2[5]);writebuf2[6]=crc&0xff;writebuf2[7]=crc/0x100;WriteFile(hCom,writebuf2,8,&comnum,NULL);(四)、数据读取ReadFile(hCom,writebuf,5+zxnum*2,&comnum,NULL);//读取zxnum个通道数据可增加错误处理程序,如地址码错误、CRC码错误判断、通讯故障处理等。Modbus通讯协议及编程技术分类:网络与通讯发表时间:2007-02-17Modbus通讯协议分为RTU协议和ASCII协议,我公司的多种仪表都采用ModBusRTU通讯协议。下面就ModBusRTU协议简要介绍如下:26 一、通讯协议:1、通讯传送方式:通讯传送分为独立的信息头,和发送的编码数据。以下的通讯传送方式定义也与MODBUSRTU通讯规约相兼容:编码8位二进制起始位1位数据位8位奇偶校验位1位(偶校验位)停止位1位错误校检CRC(冗余循环码) 初始结构=≥4字节的时间地址码=1字节功能码=1字节数据区=N字节错误校检=16位CRC码结束结构=≥4字节的时间地址码:地址码为通讯传送的第一个字节。这个字节表明由用户设定地址码的从机将接收由主机发送来的信息。并且每个从机都有具有唯一的地址码,并且响应回送均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机发送的地址码表明回送的从机地址。功能码:通讯传送的第二个字节。ModBus通讯规约定义功能号为1到127。本仪表只利用其中的一部分功能码。作为主机请求发送,通过功能码告诉从机执行什么动作。作为从机响应,从机发送的功能码与从主机发送来的功能码一样,并表明从机已响应主机进行操作。如果从机发送的功能码的最高位为1(比如功能码大与此同时127),则表明从机没有响应操作或发送出错。数据区:数据区是根据不同的功能码而不同。数据区可以是实际数值、设置点、主机发送给从机或从机发送给主机的地址。CRC码:二字节的错误检测码。26 2、通讯规约:当通讯命令发送至仪器时,符合相应地址码的设备接通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务;然后把执行结果返送给发送者。返送的信息中包括地址码、执行动作的功能码、执行动作后结果的数据以及错误校验码。如果出错就不发送任何信息。(1)信息帧结构地址码功能码数据区错误校验码8位8位N×8位16位地址码:地址码是信息帧的第一字节(8位),从0到255。这个字节表明由用户设置地址的从机将接收由主机发送来的信息。每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送。当从机回送信息时,相当的地址码表明该信息来自于何处。功能码:主机发送的功能码告诉从机执行什么任务。表1-1列出的功能码都有具体的含义及操作。代码含义操作03读取数据读取当前寄存器内一个或多个二进制值06重置单一寄存器把设置的二进制值写入单一寄存器 数据区:数据区包含需要从机执行什么动作或由从机采集的返送信息。这些信息可以是数值、参考地址等等。例如,功能码告诉从机读取寄存器的值,则数据区必需包含要读取寄存器的起始地址及读取长度。对于不同的从机,地址和数据信息都不相同。错误校验码:主机或从机可用校验码进行判别接收信息是否出错。有时,由于电子噪声或其它一些干扰,信息在传输过程中会发生细微的变化,错误校验码保证了主机或从机对在传送过程中出错的信息不起作用。这样增加了系统的安全和效率。错误校验采用CRC-16校验方法。注:信息帧的格式都基本相同:地址码、功能码、数据区和错误校验码。(2)错误校验冗余循环码(CRC)包含2个字节,即16位二进制。CRC码由发送设备计算,放置于发送信息的尾部。接收信息的设备再重新计算接收到信息的CRC码,比较计算得到的CRC码是否与接收到的相符,如果两者不相符,则表明出错。CRC码的计算方法是,先预置16位寄存器全为1。再逐步把每8位数据信息进行处理。在进行CRC码计算时只用8位数据位,起始位及停止位,如有奇偶校验位的话也包括奇偶校验位,都不参与CRC码计算。26 在计算CRC码时,8位数据与寄存器的数据相异或,得到的结果向低位移一字节,用0填补最高位。再检查最低位,如果最低位为1,把寄存器的内容与预置数相异或,如果最低位为0,不进行异或运算。这个过程一直重复8次。第8次移位后,下一个8位再与现在寄存器的内容相相异或,这个过程与以上一样重复8次。当所有的数据信息处理完后,最后寄存器的内容即为CRC码值。CRC码中的数据发送、接收时低字节在前。计算CRC码的步骤为:1、预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;2、把第一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器;3、把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;4、如果最低位为0:重复第3步(再次移位);如果最低位为1:CRC寄存器与多项式A001(1010000000000001)进行异或;5、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;6、重复步骤2到步骤5,进行下一个8位数据的处理;7、最后得到的CRC寄存器即为CRC码。(3)功能码03,读取点和返回值:仪表采用ModbusRTU通讯规约,利用通讯命令,可以进行读取点(“保持寄存器”)或返回值(“输入寄存器”)的操作。保持和输入寄存器都是16位(2字节)值,并且高位在前。这样用于仪表的读取点和返回值都是2字节。一次最多可读取寄存器数是60。由于一些可编程控制器不用功能码03,所以功能码03被用作读取点和返回值。从机响应的命令格式是从机地址、功能码、数据区及CRC码。数据区中的寄存器数据都是每两个字节高字节在前。(4)功能码06,单点保存主机利用这条命令把单点数据保存到仪表的存储器。从机也用这个功能码向主机返送信息。二、编程举例:下面是一个用VC编写的ModBusRTU通讯的例子通讯口设置26 DCBdcb;hCom=CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);if(hCom==INVALID_HANDLE_VALUE){ MessageBox("createfileerror,error");}BOOLerror=SetupComm(hCom,1024,1024);if(!error) MessageBox("setupcommerror");error=GetCommState(hCom,&dcb);if(!error) MessageBox("getcommstate,error");dcb.BaudRate=2400;dcb.ByteSize=8;dcb.Parity=EVENPARITY;//NOPARITY;dcb.StopBits=ONESTOPBIT;error=SetCommState(hCom,&dcb);CRC校验码计算UINTcrcvoidcalccrc(BYTEcrcbuf){BYTEi;crc=crc^crcbuf;for(i=0;i<8;i++){BYTETT;TT=crc&1;crc=crc>>1;26 crc=crc&0x7fff;if(TT==1)crc=crc^0xa001;crc=crc&0xffff;}}数据发送zxaddr=11;//读取地址为11的巡检表数据zxnum=10;//读取十个通道的数据writebuf2[0]=zxaddr;writebuf2[1]=3;writebuf2[2]=0;writebuf2[3]=0;writebuf2[4]=0;writebuf2[5]=zxnum;crc=0xffff;calccrc(writebuf2[0]);calccrc(writebuf2[1]);calccrc(writebuf2[2]);calccrc(writebuf2[3]);calccrc(writebuf2[4]);calccrc(writebuf2[5]);writebuf2[6]=crc&0xff;writebuf2[7]=crc/0x100;WriteFile(hCom,writebuf2,8,&comnum,NULL);数据读取ReadFile(hCom,writebuf,5+zxnum*2,&comnum,NULL);//读取zxnum个通道数据可增加错误处理程序,如地址码错误、CRC码错误判断、通讯故障处理等。Modbus协议在涩宁兰SCADA系统中的应用来源: 录入时间:07-03-2811:29:24 Englishversion 26 摘要: 工业控制已进入网络时代,在如今工控技术和工控产品百家争鸣的时代,各种不同设备之间的通讯已成为一个系统的关键所在。Modbus工业网络协议就是解决这一问题的一种利器。本文简单阐述了Modbus协议的基本原理,并结合涩宁兰输气管线SCADA系统中Modbus协议的实际应用,介绍了Modbus应用的一般方法和注意事项。 主题词: Modbus帧ASCII模式RTU模式SCADARS-485 Modbus协议是Modicon公司开发的一种数据通讯协议,通过这个协议,各种不同的设备和网络可相互进行通讯,由于其具有高度的可操作性和开放性,Modbus协议已经成为一种通用性很强的工业控制网络通讯协议。许多不同品牌、不同厂家的设备之间都可通过该协议交换数据。涩宁兰输气管线SCADA系统应用了多种通讯和网络协议,使各种设备有机的结合在一起,成为一个完整的三级集散控制系统,Modbus协议是其中一种重要的协议。 Modbus协议简介 一、Modbus的通讯过程 Modbus协议定义了一种信息结构,这种信息结构可以被所有支持该协议的各种设备在通讯时认可和使用。它描述了控制器向其他设备发出查询的过程以及其他设备如何进行应答,以及错误的检测和报告。 Modbus协议采用master-slave(主-从)的技术。在一个Modbus总线上,只能有一个master,而slave最多可有247个,地址为1——247。进行通讯时,只有master才可以发起一个“查询”,充当slave的设备不断的检测,当检测到有自己地址的“查询”时,就会向master发出一个“回应”,或者根据master的命令采取相应的动作。当master发出的“查询”是一个“广播”(地址码为0)时,所有的slave都执行master的命令,但不向master发出回应信息。 二、Modbus的帧 在网络通信中,数据都是以“包”(Packet)或“帧”(Frame)的形式进行传输,“包”和“帧”含义基本相同,均指通信中的一个数据块。对于某种具体通信网络,一般使用术语“帧”。在Modbus协议中,引用了“帧”(Frame)作为通讯过程中的数据单位,Modbus中的“帧”由以下几部分组成: 1、标志位:表示一个“帧”的开始。 2、地址位:表示该“帧”的信息是发给哪一个slave的,或是由哪个slave发出的信息。 3、功能代码:表示指令,在Modbus协议中,有一系列代码表示不同的指令,例如:代码“3”表示读数据。 4、数据位:是对功能代码的进一步补充与说明,说明指令的具体内容。 5、校验位:CRC或LRC校验。 6、停止位:表示该“帧”的结束。 每部分的位数和表示方法依采取的模式不同而略有区别,下文将详细论述。26 三、Modbus的两种通讯模式 在Modbus协议中,依数据在传输的过程中的具体形式不同,分为两种模式:ASCII和RTU,采用哪种模式由用户自己根据需要进行选择。在选择时,同一Modbus网络中的所有设备的模式选择必须一致。 1、ASCII模式 ASCII(AmericanStandardCodeforInformationInterchange),即美国信息交换标准代码。在这种模式中,每个8比特的字节被转换两个ASCII字符进行传送。这种模式的主要优点是传送的每相邻的两字节之间允许最大的时间间隔是1秒。 表一:ASCII模式的帧格式 在此帧中:Ø 帧是以一个冒号(:)来做为开始的标志;以CRLF(carriagereturn-linefeed即“回车-换行”)为结束标志;Ø 代码系统采用十六进制,ASCII字符0...9,A...F每个ASCII字符由一个16进制的字符组成;Ø Ø 每个字节中包括:1个开始位;7个数据位(低位先传送);1个奇偶校验位(无奇偶校验时为0位);1个(有奇偶校验时)或2位(无奇偶校验时)停止位;Ø ASCII模式采用LRC(纵向冗余校验)检错方法。 2、RTU模式 RTU(RemoteTerminalUnit),即远程终端单元,这种模式的特点是信息中每个8比特的字节被转换为两个4比特的十六进制字符来传输。它的优点是更大的数据密度使它在相同的波特率下比ASCII模式有更强的数据吞吐能力。 表二:RTU模式的帧格式 在此帧中:26 该帧是以一个相当于至少3.5个字节传输时间的空闲做为开始和结束的标志;整个帧的所有数据必须连续传送,如果中间间隔超过1.5个字符传输时间,接收设备会认为下一个字符为一个新帧的开始,即为一个地址码;Ø 代码系统采用8位二进制,十六进制数0...9,A...F;信息的每个8比特字符由两个16进制的字符组成;Ø Ø 每个字节中包括:一个开始位;8个数据位(低位先传送);1个奇偶校验位(无奇偶校验时为0);1个(有奇偶校验时)或2位(无奇偶校验时)停止位;Ø ASCII模式采用CRC(循环冗余校验)检错方法。 四、Modbus与其他网络的通讯 Modbus网络可以通过设备内置的部件或网络适配器与其他兼容Modbus的网络进行通讯。在其他网络上,Modbus协议的有关信息将被植入该网络的帧或数据包结构中,以完成信息的转换,这种转换还可以解译节点的地址、路径和检错方法等。 在其它网络上,控制器使用对等(peer-to-peer)技术通信,故任何控制器都能发起一个和其它控制器的通信。这样在单独的通信过程中,控制器既可作为主设备(master)也可作为从设备(slave)。多个内部通道可允许多个传输进程同时进行。 在传送消息时,尽管网络通信方法是“对等”的方式,但Modbus协议仍然遵循“主—从”原则。当一个控制器发送一个消息,并期望从其他设备得到回应时,它是做为“主”设备,。同样,当该控制器接收到一消息,它将建立一个“回应”格式的信息返回给发送的控制器。这时,他充当的是“从”设备 Modbus协议在涩宁兰SCADA系统中的应用 应用原理 在涩宁兰SCADA系统中,Modbus充当的是连接流量计算机和PLC的数据桥梁。流量计算机从现场仪表采集相应的数据,计算出瞬时流量、累计流量等流量参数,再通过Modbus将必要的数据传至PLC中,经PLC进行必要的处理后,显示在上位机上供生产运行之用。流程如下图: 图1:流量参数的数据流向示意图26 调试过程 一、接线 涩宁兰SCADA系统的PLC采用的是A-B公司的contrologix,其远程I/O机架上有一块通讯模板,叫做MCM(ModbusConmminicationModel),即Modbus通讯模板。MCM模板在Modbus和PLC的背板之间充当一个网桥,同时也是Modbus总线的Master。若干台流量计算机与MCM模板按照RS-485接口标准,通过DB9串口连接器连接成一个Modbus网络,接线图如下(以两台流量计算机为例,多台可顺次并联): 图2:MCM模板与流量计算机通讯接线图 注意事项: 1、MCM模板提供的是RJ45的接口,可利用厂家提供的RJ45--DB9转接线,也可以直接用RJ45接线,方法为:RJ45玻璃体从前直视,自左向右依次为1-8,与DB9接头1-8端一一对应。本工程采用后者,好处是减少接线次数,提高通讯的稳定性。 2、通讯介质采用超五类屏蔽双绞线,主要是考虑RJ45接头的连接。我们在实验时曾用过一般导线,对通讯效果并无影响。可见Modbus对通讯介质并无特殊要求。 3、连线应尽量短,够用即可,不仅看起来整齐,而且对于不同设备间的通讯,尽量短的线总是稳定性要好的多。 4、导线一定要保证完好无损,接头一定连接紧固,要反复测试确认。因为在调试过程中,任何一点的虚接都可能造成通讯的失败,而且极难查找原因。一个可靠的硬件连接可省去调试过程中很多不必要的故障和故障查找的步骤。 5、RS-485总线通讯在连线时只需遵循一个原则,那就是收对发,发对收。确认此连接无误,若其他没有问题,一定会成功。 二、设备组态 在此网络中,MCM模板充当Master,流量计算机为slave。对所用的MCM模板的端口设置如表三,流量计算机相应端口设置如表四: 26 表三:MCM模板的端口设置 表四:流量计算机的端口设置 其他相关设置项根据实际需要进行设置。 设备设置时一定要注意根据不同设备的不同要求,两端的设置相对应的项一定要相同。 三、调试中出现的问题及解决方法: 1、在利用Modbus通讯的过程中,遇到这样一个问题,即浮点数的传输问题。因为一般浮点数都是32位,而Modbus总线中只能传输最多16位的数据。 解决方法:可以利用两个整形数传送一个浮点数(即将一个32位的二进制数分割成两个16位的二进制数),传送完以后,再将两个整形数整合为一个浮点数。 2、在调试过程中,当数据传输至PLC中后,最初发现数据并不是原来的数值,而是一些莫名其妙的数据,要么大的离谱,要么是负的多位数。 经过反复的尝试,终于发现问题所在,原来,在Modbus总线中,数据传输时是低位字节先传送,传送过来后如果不进行交换,二进制的数值排列是反向的,即原来的低字节在高位,高字节在低位,所以得到的数据和原数据相差甚远。只要将数据的高低位字节进行交换(swap位置1),就可解决此问题。 3、在调试过程中,总是调不通怎么办? 在数据通讯的调试过程中,如果数据总是不通,我们一般按照这样的顺序进行检查:26 1)各种设备是否正常, 2)接线是否正确、完好; 3)各种设备组态是否正确。 一般来说,这些因素极少出现问题,但仔细检查是必要的,这些得到确认后,还要注意以下几点: 1)用一种测试软件进行测试,这样可以将问题的范围缩小,在我们的调试过程中,我们用了一种叫做“MBUS2”的小测试软件对流量计算机的接线和组态进行测试,一般当利用此软件测试成功后,再整体调试,问题可迎刃而解。象我们用的“MBNUS2“,还有“MODBUSVIEW”等,这种测试软件在网上可以得到。它们简单易用,但却极其有效。 2)检查没有任何问题但却仍旧不通时,可尝试将所有设备关掉重新启动。这样一个简单的方法,在调试时经常很有用。 结束语: 利用Modbus协议来实现不同设备之间的通讯,操作简便,适用性强,通讯速度快。因此,在各种工控系统中,Modbus是极为常见的一种通讯协议。同时,Modbus也是一种实力较强的现场总线,在工业控制实现真正的网络化过程中,Modbus将发挥更大的作用。26 MODBUS通讯协议及编程 ModBus通讯协议分为RTU协议和ASCII协议,我公司的多种仪表都采用ModBusRTU通讯协议,如:YD2000智能电力监测仪、巡检表、数显表、光柱数显表等。下面就ModBusRTU协议简要介绍如下:一、通讯协议(一)、通讯传送方式: 通讯传送分为独立的信息头,和发送的编码数据。以下的通讯传送方式定义也与MODBUSRTU通讯规约相兼容:编码8位二进制起始位1位数据位8位奇偶校验位1位(偶校验位)停止位1位错误校检CRC(冗余循环码)初始结构=≥4字节的时间地址码=1字节功能码=1字节数据区=N字节错误校检=16位CRC码结束结构=≥4字节的时间 地址码:地址码为通讯传送的第一个字节。这个字节表明由用户设定地址码的从机将接收由主机发送来的信息。并且每个从机都有具有唯一的地址码,并且响应回送均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机发送的地址码表明回送的从机地址。 功能码:通讯传送的第二个字节。ModBus通讯规约定义功能号为1到127。本仪表只利用其中的一部分功能码。作为主机请求发送,通过功能码告诉从机执行什么动作。作为从机响应,从机发送的功能码与从主机发送来的功能码一样,并表明从机已响应主机进行操作。如果从机发送的功能码的最高位为1(比如功能码大与此同时127),则表明从机没有响应操作或发送出错。 数据区:数据区是根据不同的功能码而不同。数据区可以是实际数值、设置点、主机发送给从机或从机发送给主机的地址。 CRC码:二字节的错误检测码。(二)、通讯规约: 当通讯命令发送至仪器时,符合相应地址码的设备接通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务;然后把执行结果返送给发送者。返送的信息中包括地址码、执行动作的功能码、执行动作后结果的数据以及错误校验码。如果出错就不发送任何信息。26 1.信息帧结构地址码功能码数据区错误校验码8位8位N×8位16位 地址码:地址码是信息帧的第一字节(8位),从0到255。这个字节表明由用户设置地址的从机将接收由主机发送来的信息。每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送。当从机回送信息时,相当的地址码表明该信息来自于何处。 功能码:主机发送的功能码告诉从机执行什么任务。表1-1列出的功能码都有具体的含义及操作。代码含义操作03读取数据读取当前寄存器内一个或多个二进制值06重置单一寄存器把设置的二进制值写入单一寄存器 数据区:数据区包含需要从机执行什么动作或由从机采集的返送信息。这些信息可以是数值、参考地址等等。例如,功能码告诉从机读取寄存器的值,则数据区必需包含要读取寄存器的起始地址及读取长度。对于不同的从机,地址和数据信息都不相同。 错误校验码:主机或从机可用校验码进行判别接收信息是否出错。有时,由于电子噪声或其它一些干扰,信息在传输过程中会发生细微的变化,错误校验码保证了主机或从机对在传送过程中出错的信息不起作用。这样增加了系统的安全和效率。错误校验采用CRC-16校验方法。注:信息帧的格式都基本相同:地址码、功能码、数据区和错误校验码。2.错误校验 冗余循环码(CRC)包含2个字节,即16位二进制。CRC码由发送设备计算,放置于发送信息的尾部。接收信息的设备再重新计算接收到信息的CRC码,比较计算得到的CRC码是否与接收到的相符,如果两者不相符,则表明出错。 CRC码的计算方法是,先预置16位寄存器全为1。再逐步把每8位数据信息进行处理。在进行CRC码计算时只用8位数据位,起始位及停止位,如有奇偶校验位的话也包括奇偶校验位,都不参与CRC码计算。 在计算CRC码时,8位数据与寄存器的数据相异或,得到的结果向低位移一字节,用0填补最高位。再检查最低位,如果最低位为1,把寄存器的内容与预置数相异或,如果最低位为0,不进行异或运算。 这个过程一直重复8次。第8次移位后,下一个8位再与现在寄存器的内容相相异或,这个过程与以上一样重复8次。当所有的数据信息处理完后,最后寄存器的内容即为CRC码值。CRC码中的数据发送、接收时低字节在前。 计算CRC码的步骤为:·预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;·把第一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器;·把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;26 ·如果最低位为0:重复第3步(再次移位);如果最低位为1:CRC寄存器与多项式A001(1010000000000001)进行异或;·重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;·重复步骤2到步骤5,进行下一个8位数据的处理;·最后得到的CRC寄存器即为CRC码。3.功能码03,读取点和返回值: 仪表采用ModbusRTU通讯规约,利用通讯命令,可以进行读取点(“保持寄存器”)或返回值(“输入寄存器”)的操作。保持和输入寄存器都是16位(2字节)值,并且高位在前。这样用于仪表的读取点和返回值都是2字节。一次最多可读取寄存器数是60。由于一些可编程控制器不用功能码03,所以功能码03被用作读取点和返回值。从机响应的命令格式是从机地址、功能码、数据区及CRC码。数据区中的寄存器数据都是每两个字节高字节在前。4.功能码06,单点保存 主机利用这条命令把单点数据保存到仪表的存储器。从机也用这个功能码向主机返送信息。二、编程举例 下面是一个用VC编写的ModBusRTU通讯的例子(一)、通讯口设置DCBdcb;hCom=CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);if(hCom==INVALID_HANDLE_VALUE){ MessageBox("createfileerror,error");}BOOLerror=SetupComm(hCom,1024,1024);if(!error) MessageBox("setupcommerror");error=GetCommState(hCom,&dcb);if(!error) MessageBox("getcommstate,error");dcb.BaudRate=2400;dcb.ByteSize=8;dcb.Parity=EVENPARITY;//NOPARITY;dcb.StopBits=ONESTOPBIT;error=SetCommState(hCom,&dcb);26 (二)、CRC校验码计算UINTcrcvoidcalccrc(BYTEcrcbuf){BYTEi;crc=crc^crcbuf;for(i=0;i<8;i++){BYTETT;TT=crc&1;crc=crc>>1;crc=crc&0x7fff;if(TT==1)crc=crc^0xa001;crc=crc&0xffff;}}(三)、数据发送zxaddr=11;//读取地址为11的巡检表数据zxnum=10;//读取十个通道的数据writebuf2[0]=zxaddr;writebuf2[1]=3;writebuf2[2]=0;writebuf2[3]=0;writebuf2[4]=0;writebuf2[5]=zxnum;crc=0xffff;calccrc(writebuf2[0]);calccrc(writebuf2[1]);calccrc(writebuf2[2]);calccrc(writebuf2[3]);calccrc(writebuf2[4]);calccrc(writebuf2[5]);writebuf2[6]=crc&0xff;writebuf2[7]=crc/0x100;WriteFile(hCom,writebuf2,8,&comnum,NULL);(四)、数据读取ReadFile(hCom,writebuf,5+zxnum*2,&comnum,NULL);//读取zxnum个通道数据可增加错误处理程序,如地址码错误、CRC码错误判断、通讯故障处理等。MODBUS通讯协议简介一、概述Modbus26 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。1、在Modbus网络上转输标准的Modbus口是使用一RS-232C兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。控制器能直接或经由Modem组网。控制器通信使用主—从技术,即仅一设备(主设备)能初始化传输(查询)。其它设备(从设备)根据主设备查询提供的数据作出相应反应。典型的主设备:主机和可编程仪表。典型的从设备:可编程控制器。主设备可单独和从设备通信,也能以广播方式和所有从设备通信。如果单独通信,从设备返回一消息作为回应,如果是以广播方式查询的,则不作任何回应。Modbus协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、一错误检测域。从设备回应消息也由Modbus协议构成,包括确认要行动的域、任何要返回的数据、和一错误检测域。如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。2、在其它类型网络上转输在其它网络上,控制器使用对等技术通信,故任何控制都能初始和其它控制器的通信。这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。提供的多个内部通道可允许同时发生的传输进程。在消息位,Modbus协议仍提供了主—从原则,尽管网络通信方法是“对等”。如果一控制器发送一消息,它只是作为主设备,并期望从从设备得到回应。同样,当控制器接收到一消息,它将建立一从设备回应格式并返回给发送的控制器。Modbus是Modicon公司为其PLC与主机之间的通讯而发明的串行通讯协议。其物理层采用RS232、485等异步串行标准。由于其开放性而被大量的PLC及RTU厂家采用。Modbus通讯方式采用主从方式的查询-相应机制,只有主站发出查询时,从站才能给出响应,从站不能主动发送数据。主站可以向某一个从站发出查询,也可以向所有从站广播信息。从站只响应单独发给它的查询,而不响应广播消息。Modbus的串行口的通讯参数(如波特率、奇偶校验)可由用户选择。二、MODBUS协议传送方式MODBUS通讯协议有两种传送方式:RTU方式和ASCII方式,两种方式如下所示:项目RTU方式ASCII方式字节长度8BITS7BITS奇偶校验1BITOR0BIT1BITOR0BIT字节中止1BITOR2BITS1BITOR2BITS开始标记不要:(冒号)结束标记不要CR,LF数据间隔<24BIT<1S出错检验方式CRC-16LRC三、MODBUS指令字符串格式:下面以WT301模拟量数据采集器为例讲解04命令;主机命令:26 从机地址功能码数据起始地址数据量冗余校验从机地址:(WT306通讯控制器可以设置#1-#4从机地址)üMODBUS通讯是主从式通讯,WT306通讯控制器采用的是从机的设置,通过面板上的跳线开关设置;功能码:(模拟量信号采用功能码04)ü功能码定义04READINPUTREGISTERS数据地址:ü数据地址定义3XXXXINPUTREGISTERS从机响应:从机地址功能码数据字节量数据量数据1数据2数据3。。。。。数据n冗余校验从机地址:üMODBUS通讯是主从式通讯,WT306通讯控制器采用的是从机的设置,通过面板上的跳线开关设置;ü功能码:(WT301数据采集器总采用功能码04)功能码定义04READINPUTREGISTERSü数据字节量:如温度、压力等模拟量每一个变量占用2字节;WT306通讯控制器允许最大数据字节量为256字节,即128点数据;26 Modbus通讯协议入门作者:未知文章来源:华文论坛http://www.huawen.net.cn点击数:6030一、Modbus协议简介Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。1、在Modbus网络上转输标准的Modbus口是使用一RS-232C兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。控制器能直接或经由Modem组网。控制器通信使用主-从技术,即仅一设备(主设备)能初始化传输(查询)。其它设备(从设备)根据主设备查询提供的数据做出相应反应。典型的主设备:主机和可编程仪表。典型的从设备:可编程控制器。主设备可单独和从设备通信,也能以广播方式和所有从设备通信。如果单独通信,从设备返回一消息作为回应,如果是以广播方式查询的,则不作任何回应。Modbus协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、一错误检测域。从设备回应消息也由Modbus协议构成,包括确认要行动的域、任何要返回的数据、和一错误检测域。如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。2、在其它类型网络上转输在其它网络上,控制器使用对等技术通信,故任何控制都能初始和其它控制器的通信。这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。提供的多个内部通道可允许同时发生的传输进程。在消息位,Modbus协议仍提供了主-从原则,尽管网络通信方法是"对等"。如果一控制器发送一消息,它只是作为主设备并期望从设备得到回应。同样,当控制器接收到一消息,它将建立一从设备回应格式并返回给发送的控制器。3、查询-回应周期(1)查询查询消息中的功能代码告之被选中的从设备要执行何种功能。数据段包含了从设备要执行功能的任何附加信息。例如功能代码03是要求从设备读保持寄存器并返回它们的内容。数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。错误检测域为从设备提供了一种验证消息内容是否正确的方法。(2)回应如果从设备产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。数据段包括了从设备收集的数据:象寄存器值或状态。如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。错误检测域允许主设备确认消息内容是否可用。二、两种传输方式控制器能设置为两种传输模式(ASCII或RTU)中的任何一种在标准的Modbus网络通信。用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。26 1.ASCII模式地址功能代码数据数量数据1..数据nLRC高字节LRC低字节回车换行2.RTU模式地址功能代码数据数量数据1...数据nCRC高字节CRC低字节所选的ASCII或RTU方式仅适用于标准的Modbus网络,它定义了在这些网络上连续传输的消息段的每一位,以及决定怎样将信息打包成消息域和如何解码。三、Modbus消息帧两种传输模式中(ASCII或RTU),传输设备以将Modbus消息转为有起点和终点的帧,这就允许接收的设备在消息起始处开始工作,读地址分配信息,判断哪一个设备被选中(广播方式则传给所有设备),判知何时信息已完成。部分的消息也能侦测到并且错误能设置为返回结果。1、ASCII帧使用ASCII模式,消息以冒号(:)字符(ASCII码3AH)开始,以回车换行符结束(ASCII码0DH,0AH)。其它域可以使用的传输字符是十六进制的0...9,A...F。网络上的设备不断侦测":"字符,当有一个冒号接收到时,每个设备都解码下个域(地址域)来判断是否发给自己的。消息中字符间发送的时间间隔最长不能超过1秒,否则接收的设备将认为传输错误。一个典型消息帧如下所示:起始位设备地址功能代码数据LRC校验结束符1个字符2个字符2个字符n个字符2个字符2个字符图2ASCII消息帧2、RTU帧使用RTU模式,消息发送至少要以3.5个字符时间的停顿间隔开始。在网络波特率下多样的字符时间,这是最容易实现的(如下图的T1-T2-T3-T4所示)。传输的第一个域是设备地址。可以使用的传输字符是十六进制的0...9,A...F。网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字符之后,一个至少3.5个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始。整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的CRC域的值不可能是正确的。一典型的消息帧如下所示:起始位设备地址功能代码数据CRC校验结束符T1-T2-T3-T48Bitn个8Bit16BitT1-T2-T3-T43、地址域消息帧的地址域包含两个字符(ASCII)或8Bit(RTU)。可能的从设备地址是0...247(十进制)。单个设备的地址范围是1...247。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备做出回应。地址0是用作广播地址,以使所有的从设备都能认识。当Modbus协议用于更高水准的网络,广播可能不允许或以其它方式代替。4、如何处理功能域消息帧中的功能代码域包含了两个字符(ASCII)或8Bits(RTU)。可能的代码范围是十进制的1...255。当然,有些代码是适用于所有控制器,有此是应用于某种控制器,还有些保留以备后用。当消息从主设备发往从设备时,功能代码域将告之从设备需要执行哪些行为。例如去读取输入的开关状态,读一组寄存器的数据内容,读从设备的诊断状态,允许调入、记录、校验在从设备中的程序等。当从设备回应时,它使用功能代码域来指示是正常回应(无误)还是有某种错误发生(称作异议回应)。对正常回应,从设备仅回应相应的功能代码。对异议回应,从设备返回一等同于正常代码的代码,但最重要的位置为逻辑1。例如:一从主设备发往从设备的消息要求读一组保持寄存器,将产生如下功能代码:00000011(十六进制03H)对正常回应,从设备仅回应同样的功能代码。对异议回应,它返回:1000001126 (十六进制83H)除功能代码因异议错误作了修改外,从设备将一独特的代码放到回应消息的数据域中,这能告诉主设备发生了什么错误。主设备应用程序得到异议的回应后,典型的处理过程是重发消息,或者诊断发给从设备的消息并报告给操作员。5、数据域数据域是由两个十六进制数集合构成的,范围00...FF。根据网络传输模式,这可以是由一对ASCII字符组成或由一RTU字符组成。从主设备发给从设备消息的数据域包含附加的信息:从设备必须用于进行执行由功能代码所定义的所为。这包括了象不连续的寄存器地址,要处理项的数目,域中实际数据字节数。例如,如果主设备需要从设备读取一组保持寄存器(功能代码03),数据域指定了起始寄存器以及要读的寄存器数量。如果主设备写一组从设备的寄存器(功能代码10十六进制),数据域则指明了要写的起始寄存器以及要写的寄存器数量,数据域的数据字节数,要写入寄存器的数据。如果没有错误发生,从从设备返回的数据域包含请求的数据。如果有错误发生,此域包含一异议代码,主设备应用程序可以用来判断采取下一步行动。在某种消息中数据域可以是不存在的(0长度)。例如,主设备要求从设备回应通信事件记录(功能代码0B十六进制),从设备不需任何附加的信息。6、错误检测域标准的Modbus网络有两种错误检测方法。错误检测域的内容视所选的检测方法而定。ASCII当选用ASCII模式作字符帧,错误检测域包含两个ASCII字符。这是使用LRC(纵向冗长检测)方法对消息内容计算得出的,不包括开始的冒号符及回车换行符。LRC字符附加在回车换行符前面。RTU当选用RTU模式作字符帧,错误检测域包含一16Bits值(用两个8位的字符来实现)。错误检测域的内容是通过对消息内容进行循环冗长检测方法得出的。CRC域附加在消息的最后,添加时先是低字节然后是高字节。故CRC的高位字节是发送消息的最后一个字节。7、字符的连续传输当消息在标准的Modbus系列网络传输时,每个字符或字节以如下方式发送(从左到右):最低有效位...最高有效位使用ASCII字符帧时,位的序列是:有奇偶校验启始位1234567奇偶位停止位无奇偶校验启始位1234567停止位停止位图4.位顺序(ASCII)使用RTU字符帧时,位的序列是:有奇偶校验启始位12345678奇偶位停止位无奇偶校验启始位12345678停止位停止位图4.位顺序(RTU)四、错误检测方法标准的Modbus串行网络采用两种错误检测方法。奇偶校验对每个字符都可用,帧检测(LRC或CRC)应用于整个消息。它们都是在消息发送前由主设备产生的,从设备在接收过程中检测每个字符和整个消息帧。用户要给主设备配置一预先定义的超时时间间隔,这个时间间隔要足够长,以使任何从设备都能作为正常反应。如果从设备测到一传输错误,消息将不会接收,也不会向主设备作出回应。这样超时事件将触发主设备来处理错误。发往不存在的从设备的地址也会产生超时。1、奇偶校验用户可以配置控制器是奇或偶校验,或无校验。这将决定了每个字符中的奇偶校验位是如何设置的。如果指定了奇或偶校验,"1"的位数将算到每个字符的位数中(ASCII模式7个数据位,RTU中8个数据位)。例如RTU字符帧中包含以下8个数据位:11000101整个"1"的数目是4个。如果便用了偶校验,帧的奇偶校验位将是0,便得整个"1"的个数仍是4个。如果便用了奇校验,帧的奇偶校验位将是1,便得整个"1"的个数是5个。如果没有指定奇偶校验位,传输时就没有校验位,也不进行校验检测。代替一附加的停止位填充至要传输的字符帧中2、LRC检测使用ASCII模式,消息包括了一基于LRC方法的错误检测域。LRC域检测了消息域中除开始的冒号及结束的回车换行号外的内容。LRC域是一个包含一个8位二进制值的字节。LRC值由传输设备来计算并放到消息帧中,接收设备在接收消息的过程中计算LRC,并将它和接收到消息中LRC域中的值比较,如果两值不等,说明有错误。LRC方法是将消息中的8Bit的字节连续累加,丢弃了进位。3、CRC检测26 使用RTU模式,消息包括了一基于CRC方法的错误检测域。CRC域检测了整个消息的内容。CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。CRC是先调入一值是全"1"的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。CRC添加到消息中时,低字节先加入,然后高字节。26