发明内容
有鉴于此,本发明提供了一种Modbus RTU中从站快速捕获数据的方法及从 站。可以降低通信延迟,提高数据传输效率。
本发明提供的Modbus RTU中从站获取数据的方法,包括:
从站i侦听主站和被侦听的从站j间含从站j被侦听的功能码的通信报文,所述i、j为正整数;
所述从站i判断所述侦听到的通信报文是否含有需要被捕获的数据;
当判断结果为是时,所述从站i直接从所述侦听到的通信报文中捕获所需数据。
进一步,所述从站i侦听主站和被侦听的从站j间含从站j被侦听的功能码的通信报文,包括:
从站i侦听主站和从站间的通信报文;
从站i判断侦听到的主站和从站间的通信报文中所含从站地址是否与被侦听的从站j的地址相同;
当判断结果为是时,从站i继续判断侦听到的主站和从站间的通信报文所含的功能码是否与从站j被侦听的功能码相同;
当判断结果也为是时,执行所述从站i判断所述侦听到的通信报文是否含有需要被捕获的数据的步骤。
进一步,主站和从站间的通信报文为主站下发给从站的请求或从站返回给主站的响应。
进一步,所述从站i判断所述侦听到的通信报文是否含有需要被捕获的数据,包括:
从站i识别所述侦听到的通信报文中所含功能码的类型;
当识别到的类型为读操作时,判断所述侦听到的通信报文是否为主站下发给从站j的请求,若是,则判断结果为是;
当识别到的类型为写操作时,判断所述侦听到的通信报文是否为从站j返回给主站的响应,若是,则判断结果为是;
当识别到的类型为读/写操作时,判断结果为是。
进一步,所述侦听到的通信报文中所含功能码包括:属于读操作的读线圈 状态、读输入寄存器、读保持寄存器或读离散输入,属于写操作的写单个寄存器、写单个线圈、写多个线圈或写多个寄存器,或者,属于读/写操作的读/写多个寄存器。
进一步,从站i设置一个初始值为0的侦听计数器,每当从站i侦听到主站和被侦听的从站j间的含从站j被侦听的功能码的通信报文时,对所述侦听计数器加1;当所述侦听计数器的值为1时,从站i认为所述侦听到的通信报文为主站下发给从站j的请求,当所述侦听计数器的值为2时,从站i认为所述侦听到的通信报文为从站j返回给主站的响应;
所述方法还包括:
当所述侦听计数器的值为2时,
若从站i判断到所述侦听到的通信报文不含有需要被捕获的数据时,直接将所述侦听计数器清零;
若从站i判断到所述侦听到的通信报文含有需要被捕获的数据时,则从站i在执行所述直接从所述侦听到的通信报文中捕获所需数据步骤之后,将所述侦听计数器清零。
本发明提供的Modbus RTU中的从站,包括:
侦听模块,用于侦听主站和被侦听的从站j间的含从站j被侦听的功能码的通信报文,所述j为正整数;
判断模块,判断所述侦听模块侦听到的通信报文是否含有需要被捕获的数据;
捕获模块,用于当判断模块的判断结果为是时,直接从所述侦听到的通信报文中捕获所需数据。
进一步,所述侦听模块包括:
侦听单元,用于侦听主站和从站间的通信报文;
第一判断单元,用于判断所述侦听单元侦听到的主站和从站间的通信报文中所含从站地址是否与被侦听的从站j的地址相同;
第二判断单元,用于当所述第一判断单元的判断结果为是时,判断所述侦 听单元侦听到的主站和从站间的通信报文所含的功能码是否与从站j被侦听的功能码相同;
第一指示单元,用于当第二判断单元的判断结果为是时,向所述判断模块输出判断结果为是的指示信号。
进一步,所述主站和从站之间的通信报文为主站下发给从站的请求或从站返回给主站的响应;
所述判断模块,包括:
识别单元,用于识别所述侦听模块侦听到的通信报文中所含功能码的类型;
第三判断单元,用于当识别单元识别到的类型为读操作时,判断所述侦听到的通信报文是否为主站下发给从站j的请求;
第四判断单元,用于当识别单元识别到的类型为写操作时,判断所述侦听到的通信报文是否为从站j返回给主站的响应;
第二指示单元,用于当所述识别单元识别到的类型为读/写操作或第三判断单元的判断结果为是或第四判断单元的判断结果为是时,向所述捕获模块输出判断结果为是的指示信号。
进一步,还包括:
侦听计数器,所述侦听计数器的初始值为0,每当所述侦听模块侦听到主站和被侦听的从站j间的含从站j被侦听的功能码的通信报文时,所述侦听计数器加1;
当所述侦听计数器的值为1时,所述第三判断单元认为所述侦听到的通信报文为主站下发给从站j的请求,当所述侦听计数器的值为2时,所述第四判断单元认为所述侦听到的通信报文为从站j返回给主站的响应;
清零模块,用于当所述侦听计数器的值为2时,
若所述判断模块判断到所述侦听到的通信报文不含有需要被捕获的数据时,直接将所述侦听计数器清零;
若判断模块判断到所述侦听到的通信报文含有需要被捕获的数据时,则在所述捕获模块直接从所述侦听到的通信报文中捕获所需数据之后,将所述侦听 计数器清零。
本发明的有益效果:
由于从站i对主站和被侦听从站j间的含从站j被侦听的功能码的通信报文进行侦听,并且在判断到侦听到的通信报文含其所需的数据时,直接从该侦听到的通信报文中捕获所需数据,因此可降低通信延迟,提高数据传输效率。
具体实施方式
请参考图1,是本发明提供的Modbus RTU中从站快速捕获数据的方法的第一实施例的流程示意图。其包括:
步骤S11、从站i侦听主站和被侦听的从站j间的含从站j被侦听的功能码的通信报文。
其中,i和j均为正整数,其可以为从站的站号,由于目前同一时间上,总线上的从站最多有247个,因此i和j可以为1至247间的正整数。
具体的,如图2所示,是步骤S11的一种实施例的流程示意图。其包括:
步骤S21、从站i侦听主站和从站间的通信报文。
此处,步骤S21中指的从站包括从站i在内的与从站i位于同一网段内的其它从站,其中位于同一网段内的从站间能够相互接收通信报文。
步骤S22、从站i判断侦听到的主站和从站间的通信报文中所含从站地址 是否与被侦听的从站j的地址相同。
此处,从站j代指被侦听的从站。在系统设计阶段,从站i可以将同一网段中其它一个或多个从站做为被侦听的从站。并且,从站i维护一张记录被侦听从站的地址的侦听表。具体的,当从站i接收到主站和从站间的通信报文时,从站i从接收到的通信报文中取出从站地址,然后以该从站地址为关键词索引侦听表,如果能从该表中找到与取出的从站地址相同的地址,则说明接收到的通信报文为主站和被侦听的从站间的通信报文,需要做进一步处理(即步骤S23)。如果未能从该表中查找到与取出的从站地址相同的地址,此时需要进一步识别从通信报文中取出的地址是否与本站地址相同,如果与本站地址相同,则按标准Modbus RTU通信,如果与本站地址不相同,则丢弃该通信报文。
步骤S23、当步骤S22的判断结果为是时,从站i继续判断侦听到的主站和从站间的通信报文所含的功能码是否与从站j被侦听的功能码相同。
此处,从站i中维护的侦听表中还记录了被侦听从站对应的被侦听功能码。由于被侦听从站对应的功能码有很多,本实施例可以仅对其中的一个或几个功能码进行侦听。一般的,Modbus RTU中的功能码按类型分可以分为三类,分别是读操作、写操作和读/写操作,具体的可参考表二。
具体的,步骤S22的判断结果为是时,从站i从接收到的通信报文中取出功能码,并将该功能码与被侦听从站的被侦听的功能码进行比较,如果相同,则执行步骤S12,如果不相同,则丢弃该接收到的通信报文,返回空闲状态。
需要说明的是,被侦听从站可能存在多个被侦听的功能码,因此只要取出的功能码与多个被侦听的功能码之一相同,即步骤S23的判断结果为是,需要执行步骤S12。
需要说明的是,在步骤S21和步骤S22之间,或者在步骤S22之后,还可以增加执行如下步骤:对接收到的通信报文进行CRC校验,如果校验正解,才执行步骤S22或者步骤S12。如果校验错误,丢弃接收到的通信报文,返回空闲状态。进行CRC校验的目的,如果CRC校验错误,则表明接收到的通信报文中的数据已经成为了错误的数据,即使该通信报文为被侦听从站的需被侦听的功能码的通信报文,也已经失去了实际用处。
步骤S12、从站i判断步骤S11侦听到的通信报文是否含有需要被捕获的数据。
其中,当步骤S11确定当前侦听到的通信报文中的地址与被侦听从站j的地址,功能码与被侦听从站j对应的被侦听功能码均相同时,还不足以说明侦听到的通信报文中含有从站i需要的数据。这是由于主站和从站间的通信报文包括:主站下发给从站的请求和对应的从站返回给主站的响应,并且在正常通信时,主站下发给从站的请求和从站返回给主站的响应中的地址和功能码相同,但是所携带的数据不同,因此符合步骤S11条件的通信报文未必一定含有从站i所需捕获的数据。另外,本领域技术人员还知道,如果通信报文中的功能码的类型为读操作时,那么从站j返回给主站的响应含有有效的数据,如果通信报文中的功能码的类型为写操作时,那么主站下发给从站j的请求中含有有效的数据,如果通信报文中的功能码的类型为读/写类型时,那么从站j返回给主站的响应和主站下发给从站j的请求中均含有有效的数据。但是,通过功能码并不能够区分出侦听到的通信报文到底是主站下发给从站j的请求,还是从站 j返回给主站的响应,因此可以设计一个侦听计数器,通过该侦听计数器的值来区分。
具体的,侦听计数器的初始值为0,在启动侦听时,当通过前述的方法每判断到一次侦听到通信报文中的地址与被侦听从站的地址相同,且功能码与被侦听从站被侦听的功能码相同时,将侦听计数器的值加1。由于主站总是先向从站发出请求,从站再做出响应,因此,侦听计数器的值为1时可以表明是主站下发给从站的请求,侦听计数器为2时,可以表明是从站返回主站的响应,从而实现区分,再结合通信报文中的功能码,就可以知道当前侦听到的通信报文是否含有需要被捕获的数据。另外,在侦听完成一次请求和对应的响应后,还需要对侦听计数器清零,好为下一次的报文侦听和数据捕获做准备。
步骤S13、当步骤S12的判断结果为是时,从站i直接从步骤S11侦听到的通信报文中捕获所需数据。
此处,可以在系统设计阶段,根据从站i的实际需要,确定需要捕获从站j的哪个或哪几个数据。在步骤S13中,按照Modbus通信应用层协议步骤S11侦听到的通信报文,获得报文中全部数据;然后从获得的全部数据中,提取出预先确定的需要捕获的数据。。
本实施例仅针对Modbus RTU的单播而言,对数据输入,从站i可以直接从从站j向主站返回的响应中捕获所需数据,因此这中间不存在主站转发这一环节,可以降低通信延迟,提高实时性。对于数据输出,从站i可以直接从主站下发给从站j的通信报文中捕获所需数据,从而在降低通信延迟、提高实时性的基础上,还能够减少主从通信次数,提高通信效率。
请参考图3,是本发明提供的Modbus RTU中从站快速捕获数据的方法的第二实施例的流程示意图。下述步骤的执行主体是指从站i,从站j是指被侦听的从站。图3实施例其体包括:
步骤S301、空闲状态。
步骤S302、接收主站和从站间的通信报文。
步骤S303、判断通信报文中的地址与本站地址是否相同。如果不相同,执 行步骤S304,如果相同,执行步骤S305。
步骤S304、按照标准Modbus RTU通信,返回空闲状态。
步骤S305、判断通信报文中的地址与从站j的地址是否相同。如果相同,执行步骤S306,如果不相同,执行步骤S309。
步骤S306、CRC校验。如果校验正确,执行步骤S307,如果校验错误,执行步骤S308。
步骤S307、判断通信报文中的功能码是否与从站j的被侦听的功能码相同。如果不相同,执行步骤S308,如果相同,执行步骤S309。
步骤S308、丢弃通信报文,返回空闲状态。
步骤S309、侦听计数器加1。
步骤S310、识别通信报文类型。如果类型为读操作,执行步骤S311,如果类型为写操作,执行步骤S313,如果类型为读/写操作,执行步骤S316。
步骤S311、判断侦听计数器值。侦听计数器的值为1时,执行步骤S308,侦听计数器的值为2时,执行步骤S312。
步骤S312、捕获所需数据,侦听计数器清0,返回空闲状态。
步骤S313、判断侦听计数器值。侦听计数器的值为1时,执行步骤S314,侦听计数器的值为2时,执行步骤S315。
步骤S314、捕获所需数据,返回空闲状态。
步骤S315、丢弃通信报文,侦听计数器清0,返回空闲状态。
步骤S316、判断侦听计数器值。侦听计数器的值为1时,执行步骤S317,侦听计数器的值为2时,执行步骤S318。
步骤S317、捕获所需数据,返回空闲状态。从主站下发给从站j的请求中捕获。
步骤S318、捕获所需数据,侦听计数器清0,返回空闲状态。从从站j返回给主站的响应中捕获。
下面介绍相应于上述方法实施例的结构。
请参考图4是本发明提供的Modbus RTU中从站的实施例的结构示意图。该 从站包括:
侦听模块1,用于侦听主站和被侦听的从站j间的含从站j被侦听的功能码的通信报文。
其中,i和j均为正整数,其可以为从站的站号,由于目前同一时间上,总线上的从站最多有247个,因此i和j可以为1至247间的正整数。
具体的,侦听模块1的结构的实施例的示意图。其包括:
侦听单元11,用于侦听主站和从站间的通信报文。
第一判断单元12,用于判断侦听到的主站和从站间的通信报文中所含从站地址是否与被侦听的从站j的地址相同。
此处,从站j代指被侦听的从站。在系统设计阶段,可以将同一网段中其它一个或多个从站做为被侦听的从站。并且,维护一张记录被侦听从站的地址的侦听表。具体的,当侦听单元11接收到主站和从站间的通信报文时,第一判断单元12从接收到的通信报文中取出从站地址,然后以该从站地址为关键词索引侦听表,如果能从该表中找到与取出的从站地址相同的地址,则说明接收到的通信报文为主站和被侦听的从站间的通信报文,需要做进一步处理。如果未能从该表中查找到与取出的从站地址相同的地址,此时需要进一步识别从通信报文中取出的地址是否与本站地址相同,如果与本站地址相同,则按标准Modbus RTU通信,如果与本站地址不相同,则丢弃该通信报文。
第二判断单元13,用于当第一判断单元12的判断结果为是时,判断侦听到的主站和从站间的通信报文所含的功能码是否与从站j被侦听的功能码相同。
此处,维护的侦听表中还记录了被侦听从站对应的被侦听功能码。由于被侦听从站对应的功能码有很多,本实施例可以仅对其中的一个或几个功能码进行侦听。具体的,第二判断单元13从接收到的通信报文中取出功能码,并将该功能码与被侦听从站的被侦听的功能码进行比较。
需要说明的是,被侦听从站可能存在多个被侦听的功能码,因此只要取出的功能码与多个被侦听的功能码之一相同,那么第二判断单元13的判断结果为 是。
第一指示单元13,用于当第二判断单元的判断结果为是时,向所述判断模块输出判断结果为是的指示信号。
需要说明的是,在第一判断单元12和第二判断单元13之间,或者在第二判断单元13之后,还可以增加执行如下处理:对接收到的通信报文进行CRC校验,如果校验正解,才执行后续的处理。如果校验错误,丢弃接收到的通信报文,返回空闲状态。进行CRC校验的目的,如果CRC校验错误,则表明接收到的通信报文中的数据已经成为了错误的数据,即使该通信报文为被侦听从站的需被侦听的功能码的通信报文,也已经失去了实际用处。
判断模块2,用于判断侦听模块1侦听到的通信报文是否含有需要被捕获的数据。
其中,当侦听模块1确定当前侦听到的通信报文中的地址与被侦听从站j的地址,功能码与被侦听从站j对应的被侦听功能码均相同时,还不足以说明侦听到的通信报文中含有从站i需要的数据。这是由于主站和从站间的通信报文包括:主站下发给从站的请求和对应的从站返回给主站的响应,并且在正常通信时,主站下发给从站的请求和从站返回给主站的响应中的地址和功能码相同,但是所携带的数据不同,因此侦听模块1侦听到的通信报文未必一定含有从站i所需捕获的数据。另外,本领域技术人员还知道,如果通信报文中的功能码的类型为读操作时,那么从站j返回给主站的响应含有有效的数据,如果通信报文中的功能码的类型为写操作时,那么主站下发给从站j的请求中含有有效的数据,如果通信报文中的功能码的类型为读/写类型时,那么从站j返回给主站的响应和主站下发给从站j的请求中均含有有效的数据。因此,判断模块2可以包括:
识别单元21,用于识别所述侦听模块侦听到的通信报文中所含功能码的类型。
第三判断单元22,用于当识别单元识别到的类型为读操作时,判断所述侦听到的通信报文是否为主站下发给从站j的请求。
第四判断单元23,用于当识别单元识别到的类型为写操作时,判断所述侦听到的通信报文是否为从站j返回给主站的响应。
第二指示单元24,用于当所述识别单元识别到的类型为读/写操作或第三判断单元的判断结果为是或第四判断单元的判断结果为是时,向所述捕获模块输出判断结果为是的指示信号。
但是,通过功能码并不能够区分出侦听到的通信报文到底是主站下发给从站j的请求,还是从站j返回给主站的响应,因此本实施例的从站还包括:一个侦听计数器4,通过该侦听计数器的值来区分。
具体的,侦听计数器4的初始值为0,在启动侦听时,当通过前述的方式每判断到一次侦听到通信报文中的地址与被侦听从站的地址相同,且功能码与被侦听从站被侦听的功能码相同时,将侦听计数器的值加1。由于主站总是先向从站发出请求,从站再做出响应,因此,侦听计数器的值为1时可以表明是主站下发给从站的请求,侦听计数器为2时,可以表明是从站返回主站的响应,从而实现区分,再结合通信报文中的功能码,就可以知道当前侦听到的通信报文是否含有需要被捕获的数据。另外,在侦听完成一次请求和对应的响应后,还需要对侦听计数器清零,好为下一次的报文侦听和数据捕获做准备,因此本实施例还包括:一个清零模块5,用于对侦听计数器进行清零处理。
捕获模块3、当判断模块2的判断结果为是时,直接从侦听模块1侦听到的通信报文中捕获所需数据。
此处,可以在系统设计阶段,根据从站i的实际需要,确定需要捕获从站j的哪个或哪几个数据。捕获模块3按照Modbus通信应用层协议解析侦听模块1侦听到的通信报文,获得报文中全部数据;然后从获得的全部数据中,提取出预先确定的需要捕获的数据。。
本实施例仅针对Modbus RTU的单播而言,对数据输入,从站i可以直接从从站j向主站返回的响应中捕获所需数据,因此这中间不存在主站转发这一环节,可以降低通信延迟,提高实时性。对于数据输出,从站i可以直接从主站下发给从站j的通信报文中捕获所需数据,从而在降低通信延迟、提高实时性 的基础上,还能够减少主从通信次数,提高通信效率。
最后说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的宗旨和范围,其均应涵盖在本发明的权利要求范围当中。