随着某化工仓储企业生产经营规模的不断扩大,不同时期所采用的现场仪表不同往往使得仪表种类越来越多,需要处理的数据量也越来越大。这些数据有的通过PLc控制系统采集,有的甚至还需要人工抄表和手动录入数据,这不仅造成了工作效率低下,而且还容易导致各个生产区之间的信息彼此孤立。形成一个个信息孤岛。信息孤岛使得企业的生产管理人员无法及时获知准确有效的数据并及时做出决策,这在一定程度上影响了企业的生产运营。在工业信息化的大背景下,有必要将各孤立系统的数据进行集成整合,建立
实时数据库系统,从而为上层ERP系统及应用软件提供准确实时的数据。
由于该企业的大部分仪表还能正常使用,如直接淘汰、更换系统将会造成很大的资源浪费。本文结合该企业的数据采集改造项目,设计实现了一套对全厂生产数据进行集成处理的软件系统。
1 系统设计
罐区实时生产数据主要有储罐液位、温度和压力等,这些原始数据由现场的液位计、多点温度测量仪、压力表等获取。该化工仓储企业现有一套西门子s7.300 PLC控制系统、2台AWG一ⅡA型巡检仪、若干AwG—IB型光电智能液位仪、若干科隆BMloo雷达液位计、若干带通信接口的罐旁指示仪和其他一些温度、压力、液位传感器。这些现场测量仪表有的通过4—20 mA的模拟信号或通信线接入到PLc控制系统中,有的通过带有通信接口的罐旁指示仪或直接接入到巡检仪(二次表),其他的则未接人任何系统。
根据现有系统设备的特点,数据采集软件需实现以下3个功能:与PLc控制系统通信并采集数据、从巡检仪中采集数据、直接与现场表通信并采集数据。
整个数据采集系统以数据采集为中心,在一台工控机上运行数据采集程序;从底层采集各部分原始数据,根据相应的计算标准计算体积、储量等;并通过网络通信协议将数据转存到数据服务器。这些数据作为历史数据存人关系数据库,为上层的应用提供数据。系统结构图如图l所示。
2 数据通信
由于系统中的设备类型各不相同,它们各自具有不同的通信协议,因此,数据采集程序必须遵循相应的通信规范才能从各种设备中读到数据。
本系统数据通信解决方案如下。
①与PLc控制系统的通信采用OPc协议。OPc过程控制数据采集的标准,为目前主流的组态软件所遵循。西门子的上位机软件支持0PC标准,并提供0PC Server服务,即只要在客户端开发OPCClient,就可请求到存放在OPc Senrer中的过程数据。
②由于OPC标准被大多数自动化厂家所采用,所以部分底层数据采集设备也支持OPc。在通信软件中开发OPC Senrer程序,将硬件设备作为0Pc的数据源,可直接从底层采集设备中获取过程数据值。
③与巡检仪及部分现场仪表的通信采用Modbus协议。巡检仪及大部分现场设备都支持目前工业领域最流行的通信协议之一的Modbus。通过工控机串口与它们提供的接口相连,即可进行主从方式通信。
④部分不支持通信的采集设备,可将数值转换为4—20 InA模拟信号,接入到PLC控制系统中,再通过OPC方式采集。
⑤由于OPc服务器很难穿过防火墙进行数据传输,所以采集程序与数据服务器及上层应用软件之间通过UDP协议交换数据。通过该解决方案,所有的数据都能接入到采集系统。并进行实时准确测量。
3 系统实现
主程序分为Modbus通信模块、0PC通信模块、uDP通信模块和数据计算模块。程序采用多线程技术,将各种数据的接收和发送放在优先级较高的线程中。在数据收发期间,数据的计算处理并不影响主程序的运行。此外,在程序中采用全局内存存放实时采集的数据,以便于数据的快速存取交换。系统主要程序基于VC++实现。
3.1 Modb哪通信模块
M0dbus协议包括AscII、RTu(远程终端单元)、TcP等工作模式,本系统采用较高数据传送密度的RTU通信模式。在该模式下,数据通信一般采用主从方式,主机向从设备发出请求消息;从设备接收到正确消息后就可以发送数据到主机,以响应请求H1。Modbus RTu消息帧结构如图2所示,其中,T1一T2一T3一T4。为不小于3.5个字符时间的停顿间隔。
Modbus协议需要对数据进行校验。串行协议中除有奇偶校验外,I删模式还采用16位CRc(循环冗长检测)校验。CRC的生成流程具体如下。
①预置一个16位寄存器为oFFFFH(全1),即为CRC寄存器。
②把数据帧中的第一个字节的8位与cRc寄存器中的低字节进行异或运算,结果存入CRC寄存器。
③将CRc寄存器向右移一位,最高位填以0,最低位移出并检测其值。
④如果最低位为O,则进行下一次移位;如果最低位为l,将cRc寄存器与一个0A00lH进行异或运算。
⑤重复步骤③一步骤④,直到8次移位,这样就处理完了一个完整的8位数据。
⑥处理下一个8位数据,直到所有的字节处理结束.最终CRC寄存器的值就是cRc的值。
3.2 OPC通信模块
OPC服务器由服务器、组和数据项这3类对象组成。服务器对象具有服务器的所有信息,同时也是组对象的容器。组对象具有本组的所有信息,同时包容数据项。项对象是读写数据的最小逻辑单位,项与具体的位号相连。OPC服务器支持自动化接口和定制接口两种访问接口。
OPC C1ienI的具体开发流程如下。
①初始化coM库,当需要调用cOM库时,需使coInitializeEx()来为当前线程初始化c0M库。CoInitializeEx()提供了一个让用户可以选择多线程模式还是单线程模式的参数。
HRESUIJ hr=CoInitializeEx(NULL,COINIT—MU加THREADED);
②通过oPc服务器的ProgID查询cLsID,通过给定的ProgID,采用CLSIDFromPmdD()函数从注册表中查找出对应的类标符。
CLSlD(Class Identifer);
HRESUIJ hr=CLSlDFmmProgID(m—strProgID,&clsid);
③创建OPC服务器对象,并查询OPc服务器对象的IOPCsenrer接口。通过调用cocreateInstaJlceEx()函数,不仅可以在本机中创建COM对象并得到一个接口指针,还可以实现远程访问。将Mu哪一QI结构体数组中指向IOPCserver接口的元素赋值给变量m—pISen,er,以获取lOPCsenrer接口,进而可以使用该接口完成对组对象进行创建、删除、枚举和获取当前状态等操作。
IOPCServer*Im_pISen,er;
m—pIserver=(IOPcsen,er木)m arrMultiQI[MQIIOPCSERVER].pItf;
④添加OPC组对象,并查询IOPCItemMgt接口,通过IOPcserver接口的AddGroup()方法添加组对象,它将返回一个指向OPC组对象Iunknown的指针。通过Iunknown的QueryInte血ce方法可获得0Pc组对象的IOPcItemMgt接口指针,进而可以使用该接口完成对各项进行添加、删除和设置参数等操作。
hr=pUnknmm一>QlueryInterf砬e[uD—10PCItemMgt,(void**)&(nLpIItemMgt)];
②通过oPc服务器的ProgID查询cLsID,通过给定的ProgID,采用CLSIDFromPmdD()函数从注册表中查找出对应的类标符。
CLSlD(Class Identifer);
HRESUIJ hr=CLSlDFmmProgID(m—strProgID,&clsid);
③创建OPC服务器对象,并查询OPc服务器对象的IOPCsenrer接口。通过调用cocreateInstaJlceEx()函数,不仅可以在本机 中创建COM对象并得到一个接口指针,还可以实现远程访问。将Mu哪一QI结构体数组中指向IOPCserver接口的元素赋值给变量m— pISen,er,以获取lOPCsenrer接口,进而可以使用该接口完成对组对象进行创建、删除、枚举和获取当前状态等操作。
IOPCServer*Im_pISen,er;
m—pIserver=(IOPcsen,er木)m arrMultiQI[MQIIOPCSERVER].pItf;
④添加OPC组对象,并查询IOPCItemMgt接口,通过IOPcserver接口的AddGroup()方法添加组对象,它将返回一个指向OPC组 对象Iunknown的指针。通过Iunknown的QueryInte血ce方法可获得0Pc组对象的IOPcItemMgt接口指针,进而可以使用该 接口完成对各项进行添加、删除和设置参数等操作。
hr=pUnknmm一>QlueryInterf砬e[uD—10PCItemMgt,(void**)&(nLpIItemMgt)];
⑤添加项:为保存项的相关属性值的结构体数组进行赋值。以该结构体数组为参数,用10PcltemMgt接口的AddItem()方法添加项。
hr=m—pIItemMgt一>AddItems(dwCount,
//[in]要添加的项的数目
pItemAll置y,
//[in]保存项相关属性值的结构体数组
&pResults, //[out]返同数组
&pErrors); //【out]
HREsuLT数组,告诉客户每个项是否成功添加
⑥同步读写:通过Iunknown的QueryInter厶lce方法,获得0PC组对象的IOPcsyncIO接口指针。
hr=pUnknown一>QueryInte梳e(IIDjOPcSyllcIO,
(void**)&(m_pIS)mc));
采用10PCSyncl0接口的Read()方法,完成同步读操作。
采用IOPCSyncIO接口的write()方法,完成同步写操作。
⑦释放:在程序关闭之前,需要删除已创建的OPC对象并释放内存。
首先删除以下项:
HRESU【JT Ilr = m—pIItemMgt一>RemoveItes(dwcount,phserver,&perrors);
接着释放OPC组对象的IOPCItemMgt接口和IOPCSyncIO接口,然后删除OPC组对象:调用服务器对象m—pIsen,er的RemoveGroup()方法,删除0PC组对象,再调用Release()释放服务器资源,最后关闭COM库。
3.3 UDP通信模块
用户数据报协议(user data protocol,UDP)是一个简单的面向数据包的传输层协议旧J,它所提供的是非面向连接的、不可靠的数据流传输。UDP不提供报文到达确认、排序、 可靠以及流量控制等功能;它只是将应用程序传递给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于uDP在传输数据报前不用在客户和服务器 之间建立一个连接,且没有超时重发等机制,因此,其传输速度更快。uDP数据通信格式和数据结构定义如下。
UDP请求数据报格式如图3所示。
其中,起始符为字符“撑”,ASCIl码为35(十进制);结束符为回车符,ASCII码为13;请求位号长度为10 B,为同定长度,位号不足10 B的用空格符补充。定义一个UDP请求数据报可同时打包不超过30个位号。
UDP应答数据报格式如图4所示。
其中,起始符为字符“!”,AScII码为33(十进制);结束符为回车符,ASCII码为13;应答位号长度为lO B,为固定长度,位号不足10 B的用空格符补充;返回值长度为20 B,为同定长度,数据不足20 B的用空格符补充;连接符、位号与数据之间用“=”号连接,AsCII码为6l。定义一个uDP应答数据报可同时打包不超过30个
位号的数据,数据报总长度不超过990 B。
本系统在MFC中使用CS0cket类实现UDP通信。Csocket是对winsock API的封装,用于管理通信,使得用户可以直接避免调用API函数,数据的收发也因此变得简单。
程序实现时,系统分别构造服务器和客户端套接字对象,调用套接字对象的c删()成员函数初始化套接字。调用Csocket类的重载函数 onReceive()响应接收事件;调用ReceiveFbm(1pBIlf,bu|‰n,RemoteIP,RemotePon,0)接收数据报,并 按照协议格式将数据从数据报中取出。按照通信协议将需要发送的数据打包,并调用SendTo(1pBuf,Sen掇 rLen,RenlDtePon,Remot椰,0)发送数据报。
4 关于实时数据库的探讨
该套数据采集软件的设计与实现,实际上为企业构建了一个实时数据库系统。程序中采用全局内存共享技术对实时数据进行存取,并采用内存、文件管理、关系数据库相结合的数据存储策略,使系统在响应速度、实时数据的共享性和时间一致性方面初步满足了
实时数据库系统的定义要求。
5 结束语
系统自投用以来运行正常,效果良好,不仅解决了在生产数据管理过程中存在的问题,而且节省了购买SCADA硬件、软件系统的大笔费用。同时,避免了大量仍能使用的仪表设备的淘汰弃置,具有一定的经济效益。
上一篇:三相异步电动机电机启动常见故障
下一篇:制造业中多工步组合机床监控系统设计
推荐阅读最新更新时间:2024-05-03 00:49