一种汽车衡数据采集方案与相关技术研究

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

一种汽车衡数据采集方案与相关技术研究孙悦,李仁发湖南大学计算机与通信学院,长沙(410082)E-mail:xunyue018214@163.com摘要:本文以冶钢汽车衡数据采集系统为基础,详细阐述基于.NET的实时数据采集方案,RTU通信与NPORT5210数据采集分别采集现场离散与模拟数据,对计量数据管理(MES)有实际参考意义。关键词:RTU通信,NPORT,MODBUS协议中图分类号:TP393.041.引言数据采集系统(DataAcquisitionSystem,DAS)在各种工业领域中应用的十分广泛。对于各种制造型企业,数据的采集无疑是企业管理系统正常运作的一个关键。计算机与网络技术的进步,极大地促进了工业的发展。各种基于网络技术与分布式概念的系统大量应用于工业实践,带来了许多变化和影响,衍生出许多新的生产模式,伴随着计算机和通信技术的发展,出现了两种类型的数据采集系统[1]:1)传统的数据采集系统,它由插卡式、模块化或USB总线数据采集设备与相应的硬件平台相结合,配上前端的传感设备,在虚拟仪器软件的控制下,完成本地化数据采集的功能[2];2)网络化的数据采集系统,基于传统的数据采集系统技术,利用计算机网络技术、总线技术将分散在不同地理位置、不同功能的测试设备集成在一起,加上服务器、客户端以及数据库,组成测控局域网系统,通过网络化的虚拟仪器软件,共同实现复杂、相互结合的多种采集系统[3]。本文主要从网络化数据采集系统入手,阐述基于C/S模式的RTU远程数据采集以及NPORT卡虚拟串口通信。2.汽车衡数据采集功能介绍冶钢汽车衡称重数据采集软件是汽车衡称重系统的核心,是计量人员完成计量操作的基本保证,在设计上界面必须清晰直观、操作简单方便与快捷,保证计量工作准确、高效。数据采集系统是本文的研究重点。数据采集模块负责与远程磅房的相关设备进行远程通信,采集如下数据:红绿灯信号的采集:红外线报警仪的报警信号,通过RTU远程采集单元转换为RJ45网络信号,称重计算机采用UDP协议与远程RTU进行通信,实现红外线报警信号的采集。电源信号以及红外警报信息的采集:220V电源信号经过降压后,通过RTU远程采集单元转换为RJ45网络信号,称重计算机采用UDP协议与远程RTU进行通信,实现电源信号及红外警报信息开关量的采集。重量数据的采集:汽车衡称重仪表普遍采用串口输出重量数据,称重仪表的串口与NPORT相连,将RS232串口信号转换为RJ45网络信号,称重计算机采用UDP协议通过-1-虚拟端口与远程仪表进行通信,按照称重仪表的通信协议采集与解析称重仪表的重量数据。3.汽车衡数据采集相关技术方案汽车衡数据采集系统中,核心是数据采集,本章将结合上一章所介绍的技术对汽车衡数据采集系统所涉及的采集模块做详细设计说明。3.1汽车衡RTU数据采集基于.NET平台提供的SOCKETS类[4]的汽车衡RTU采集类实现了RTU通信的所有功能。为实现远程控制RTU,通过上位机发送命令控制RTU,并正确处理返回数据,另外可以切换目标RTU。3.1.1总体说明传输层使用UDP协议,应用层采用MODBUS协议[5]。首先,使用C/S模式建立UPD连接,上位机是客户端,使用SOCKET传输命令信息。其次,按照MODBUS协议打包命令信息,将数据存在字节数组中,调用SOCKET类的SEND方法发送。最后,调用RECEIVE发送接受返回数据,对返回数据进行客户端解析后在返回有用信息的字节数组。另外,对该类返回的字节数组的处理部分由另一个类处理。编程选用当今国际流行且通用的编程软件VS.net2005,以便于将来的维护升级。3.1.2类库结构设计1.RTU切换功能设计通过改变参数IP和端口号,调用RTU_INIT(IPAddressdestip,intport)完成UDP目标服务端的切换。参数分别为目标IP地址以及端口号。2.成员函数关系说明-2-(bytedest,stringcmdtype)publicbyte[]RTU_BIND(IPAddressdestip,intport,bytedest,stringcmdtype)建立连接;publicbyte[]DRTU_RVMSG(byte[]rec),publicbyte[]DataRTU_RVMSG(byte[]rec)最终返回到中心的是含有数据信息的字节或字节数组,然后交给数据分析类处理,提取有用信息ip,port,dest,cmd,typeHDISCRETE_IN(bytedest)Byte[]finalmsgpublicbyte[]RTU_SDMSG(bytedest,bytecmdnum,byteregister1,byteregister2,bytedata1,bytedata2)LDISCRETE_IN(bytedest)DISCRETEADD_IN(bytedest)DISCRETEPLUS_IN(bytedest)DISCRETE_OUT(bytedest)ALL_OUT(bytedest)RTU_INIT(IPAddressdestip,intport)图4.1类成员函数关系图3.数据结构及设计说明采用UDP通信,要与每一个RTU建立SOCKET通信,使用一个全局的结构数组存储所有RTU的SOCKET信息,用于实现切换。(1)初始化SOCKET并切换每一个RTU都有IP和端口。根据实际需要,类中声明一个大小是7的结构数组,可存储7个RTU信息,设置全局变量counter表示当前RTU个数,以及当前RTU在数组中的位置的变量sockpos,切换现有RTU前首先判断当前SOCKET在数组中否,如果不在,初始化该SOCKET并存入数组,如果在则调用。(2)处理用户命令将当前SOCKET的ip和port以及目标地址和命令种类作为参数传给RTU_BIN函数,该函数处理用户事件。每次调用这个时间就建立SOCKET连接,然后将命令包通过该-3-,注意的是,依照MODBUS协议,每条命令都有dest字段,该字段用来表示站号,每种命令发送的命令包的站号不同,最大值255。向终端发送数据时,使用SWITCH和CASE语句根据不同的命令打包该命令,将命令中的目标地址dest作为参数传给响应命令的打包函数RTU_SDMSG()。(3)命令打包此模块由两部分组成,一是各个命令中特别字段初始化函数,另一是各命令中一致字段初始化函数。对于不同的命令,进行两次打包,最终返回字节数组。命令中的所有字段都按MODBUS协议存在字节数组中,具体见代码注释。其中,publicbyte[]RTU_SDMSG(bytedest,bytecmdnum,byteregister1,byteregister2,bytedata1,bytedata2)函数对各命令进行第二次赋值并存储在字节数组中,利用SEITCH和CASE分情况设置。具体地,指令发送规则:(1)Head:0000000000(2)指令长度(不包括自己)(3)站号(4)指令代码(5)起始地址功能码:02(读DI,可实现多个离散数据的读取)000000000006020200010009实现功能:读取DI1后面9个DI的值接收到的数据应为:0000000000050202020000注释:05-指令长度02-站号功能码02-数据数量0000-取到的数据数据处理:0000转换为2进制数:0000000000000000,即DI1到DI9都是0,对于PCTORTU类中读取所有离散数据的命令包是这样规定的,定义一个大小为12字节的字节数组,依照协议内容得到sdmsg[0]=0;sdmsg[1]=0;sdmsg[2]=0;sdmsg[3]=0;sdmsg[4]=0;sdmsg[5]=6;sdmsg[6]=dest;sdmsg[7]=1;sdmsg[8]=0;sdmsg[9]=0;sdmsg[10]=0;sdmsg[11]=16;对于取回的16位bit即2个字节再做处理,调用DRTU_RVMSG()得到一个大小为2的字节数组,最后传入RTUDATA类中解析。-4-[]HDISCRETE_IN(bytedest)控制红灯亮bytefirstreg=0;bytesecondreg=0;寄存器开始地址是00;bytedata=1;1表示红灯亮,0为绿等亮;byte[]byout=newbyte[255];调用RTU_SDMSG方法;byout数组用来接受该函数的返回数组;publicbyte[]DISCRETEADD_IN(bytedest)控制探照灯亮bytefirstreg=0;bytesecondreg=1;寄存器开始地址是01;publicbyte[]ANALOG_OUT(bytedest)从RTU读模拟数据的命令寄存器地址从00开始;其他同上publicbyte[]DISCRETE_OUT(bytedest)从RTU读离散数据的命令寄存器地址从00开始;其他同上(4)处理返回数据用户发送命令后要等待返回数据并对返回数据处理,之后交给数据分析类去解析。返回数据分两种情况,离散和模拟,对应publicbyte[]DRTU_RVMSG(byte[]rec)和publicbyte[]DataRTU_RVMSG(byte[]rec),这两个函数对数据处理后返回一个字节数组,该数组只含数据信息。具体地,通过判断字段sequence的值是否与发送命令一致,如果一致则是该命令的响应,其次判断返回字节数组的第七字节是ACK或NAK,如果是ACK则确认。4.类使用说明(1)调用该类该类的名字是PCtoRTU.dll,在VS.NET2005中建立的项目可直接在引用中导入,创建该类的实例,PCtoRTU.pctortutest=newPCtoRTU.pctortu(),PCtoRTU只命名空间,pctortu是类名。(2)初始化目标RTU的IP和端口-5-()实现,两个参数分别是IP和端口,IP可由IPAddress.Parse(string)获得,端口可由Convert.ToInt16(string)实现,比如对于两个textbox的text转化。5.用户命令响应各种控制命令的名称和目标地址由用户提供,其中名称含义如下表:表4.2用户相应命令说明表名称含义hdlighton红灯亮ldlighton绿等亮tzlighton探照灯亮tzlightoff探照灯灭discreteread读离散数据(内含所有离散信息)analogread读模拟数据(内含重量信息)用户此出得到的数据不是最终数据,要通过调用数据分析类中的方法将有用信息转化。如何使用数据分析类,接下介绍。3.1.3RTU采集设备数据分析类的设计1.类功能说明RTUDATA是命名空间,datause是类名,成员函数实现的功能包括:分别处理离散数据的每一位、处理所有离散数据、处理模拟数据以及同时处理所有离散和模拟数据。通过该类的处理,返回给用户的是最终信息,信息包括灯的状态、电源状态、红外线状态以及重量信息。离散数据每一位用int型的0和1表示,重量信息用float表示。2.类数据结构及函数设计(1)分别返回每一位离散数据以红灯状态信息处理函数为例,publicintHDON_GET(byte[]dmsg),该函数返回一个int,值是0或1,1表示红灯亮,0表示绿灯亮,参数是调用PCtoRTU类后返回的最终字节数组。publicintHDON_GET(byte[]dmsg){inthdtag=0;byte[]d=newbyte[1]

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功