资源描述
马钢2250热轧横切线过程控制系统的分析和实现
Analysis and realization in the Process Control System of Masteel 2250 Hot Rolling Cross Cutting Shearing Line
作者:马钢自动化工程公司 童 琨
目 录
目 录 2
摘要 3
关键词 3
Abstract 3
Keywords 3
1. 概述 3
2. 系统体系结构和功能 4
2.1. 系统硬件及网络 4
2.2. 系统软件及功能 5
3. 数据通讯方式及实现 6
3.1. SOCKET通讯 6
3.2. DDE通讯 11
3.3. 内存映射 13
3.4. SuiteLink通讯 15
4. 结语 21
参考文献 22
摘要
本文介绍了马钢2250热轧横切线过程控制系统的结构和功能,通过详细分析过程控制系统内部以及与外部系统之间的数据通讯,阐述了该系统所具有的高性能、可扩展、易维护等特点。
关键词
分布式系统 HMI SOCKET 动态数据交换 OCX 内存映射
Abstract
This article introduces the architecture and function of the process control system in Masteel 2250 Hot rolling Cross Cutting Shearing Line. By analysis of data communication between external system and within the PCS in detail, expatiated on characteristics of the Process Control System, e.g. high performance, extended and flexibility, easy maintenances etc.
Keywords
DCS HMI SOCKET DDE OCX Share Mapping
1. 概述
马钢2250热轧横切生产线是将热轧卷剪切成钢板后堆垛打包。所生产的横切板主要用于桥梁、造船、高精度机械设备的部件加工等行业,因此对于横切板平直度和消除钢板内部应力的要求很高。原料来自马钢2250热轧生产线所生产的热轧卷,厚度:5-25.4mm,宽度:850-2100mm,横切板的宽度:800-2100mm,长度:2-16 m,最大垛重:10t。生产线最大线速度45m/min,年产量50万吨。主要设备包括开卷机、探伤、切边剪、1#矫直机、飞剪、2#矫直机、喷印设备、堆垛台、次品台、堆垛传输装置、堆垛称重装置、打包装置等。过程控制系统由马钢自动化工程公司开发实施,其控制范围从机组入口开始到钢板打包结束下线,主要完成数据通讯、设定计算、物料跟踪和监控、过程数据采集、过程数据趋势分析、生产报表等功能。
2. 系统体系结构和功能
马钢2250热轧横切线控制系统如图1所示,包括制造执行系统、过程控制系统、基础自动化系统以及传动控制。过程控制系统配置包括计算机网络、数据库服务器、过程模型计算机、二级操作站,是一个典型的集散控制系统。集散控制系统又叫分布式计算机控制系统(DCS),是由计算机技术、信号处理技术、测控技术、网络通讯技术和人机接口技术相互发展而产生的,其主要特点是集中管理、分散控制,具有很强的自主性、协调性、灵活性和可靠性。
图1 横切线控制系统结构
2.1. 系统硬件及网络
横切线过程控制系统的在线服务器和开发服务器互为备用,二级操作站包括入口操作室、出口操作室和堆垛操作室,电气室与各操作室的网络设备之间通过光纤连接。服务器采用HP ML370,Xeon3.2G*2/4GB/72G*6,磁盘阵列采用RAID 5,二级操作站采用联想M4600,内存 1G,硬盘80G,配置结构图如图2所示。
图2 硬件及网络配置
2.2. 系统软件及功能
过程控制系统包括可视化人机接口HMI、矫直机模型、通讯进程、数据库等。过程控制系统服务器操作系统采用Windows2003, 操作站的操作系统采用Windows XP, HMI采用美国Wonder ware公司的工控组态软件InTouch 9.0开发,数据库采用Oracle 10g, 其他通讯进程采用Borland C++ 6.0开发。过程控制系统的功能如图3所示,从MES接收生产计划和原料卷的PDI数据,编制作业计划,并将生产实绩上传MES系统;在生产过程中接收BAS的设定请求,通过模型计算将设定值下发至BAS系统,同时从BAS系统采集物料跟踪信息、测量值数据、生产过程归档数据。
图3 过程控制系统功能
3. 数据通讯方式及实现
马钢2250横切线过程控制系统包括了与BAS系统、MES系统、喷印设备、在线探伤设备的通讯接口,同时过程控制系统内部进程与HMI、控制模型之间也存在数据通讯,因此本系统根据不同的接口采用多种数据通讯方式,以满足系统高效、稳定、可靠的运行。
3.1. SOCKET通讯
随着网络通讯技术的发展,将Socket 通讯技术应用到分布式控制系统中是一种很好的应用方式。基于TCP/IP 协议的Socket 通讯程序的开发,成功地实现了过程控制系统与过程模型机以及喷印控制设备PLC的数据通讯接口。通讯进程应用BCB(Borland C++ Builder)编程语言,在BCB中,TServerSocket和TClientSocket两个组件涵盖了基本的WinSocket编程,其中TServerSocket作为服务器方使用,TClientSocket作为客户端使用,这两个组件本身并不提供Socket连接,但是他们都有一个Socket属性,这个属性才提供了Socket连接。TServerSocket和TClientSocket只提供基本的服务器/客户机的连接,真正提供数据传输的是它们都有的属性Socket,它的类型分别是TServerWinSocket和TClientWinSocket,而TServerWinSocket和TClientWinSocket的父类都是TCustomWinSocket,因此使用这两个组件的方法可以很方便的实现WinSocket编程。
a) 与模型机通讯接口的实现
过程控制系统的通讯进程与模型之间SOCKET通讯采用的是流(Stream)方式,即面向连接方式。通讯双方确定各自的IP地址和端口号,报文由FLOAT、INTEGER、CHAR类型的字段组成,根据IEEE 754标准,FLOAT和INTEGER类型采用INTEL字节顺序,每条报文有一个独立的报文号,报文由报文头和报文体组成,报文头的结构统一。
如上所述,通讯所传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。为了实现通讯程序的高可配置性,我们利用工具生成一个名为Telegram.h的头文件,在该头文件中将每个数据报文定义成相对应的结构体。 例如原料卷PDI报文的定义:
typedef struct CoilEntryTelegram //T_ENTRYtag 20000
{
char CoilID[10]; /* Unique coil identifier */
float CoilLength; /* Length of the coil */
float CoilThickness; /* Coil thickness */
float CoilWidth; /* Coil width */
float PlateLength; /* The length of the plates behin */
float PlateWidth; /* The width of the plates after */
char MaterialGrade[18]; /* Coil material information (ste */
short Strategy; /* The strategy to be used by the */
short NumCalc; /* The number of calculations */
short Leveller; /* The leveller for which the pre */
} T_ENTRY; /* Coil Entry Telegram from Maans */
由于每个报文在发送和接收过程中需要包含报文头的信息,报文头的结构相同,因此在Telegram.h头文件中,定义了发送和接收两个结构体如下:
typedef struct SndCommuPacket
{
char MsgId[5]; /* Message identifier */
char Date[8]; /* Date */
char Time[6]; /* Time */
char Sender[5]; /* Sender name */
char Receiver[5]; /* Receiver process name */
char Length[4]; /* Length of message */
char Type[1]; /* Type */
char Rc[1]; /* Receive code */
char Appid[5]; /* Application identifier */
char Reserved[8]; /* Reserved */
union
{
T_ENTRY entry; //T_ENTRYtag 20000
T_TSTL1 tstl1; //T_TSTL1tag 20010
T_TMDL1 tmdl1; //T_TMDL1tag 20020
T_TSTL2 tstl2; //T_TSTL2tag 20011
T_TMDL2 tmdl2; //T_TMDL2tag 20021
T_TSRSL1 tsrsl1; //T_TSRSL1tag 20030
T_TSRSL2 tsrsl2; //T_TSRSL2tag 20031
T_TOFFL1 toffl1; //T_TOFFL1tag 20040
T_TOFFL2 toffl2; //T_TOFFL2tag 20041
};
char Ext; /* Reserved */
}T_SND;
typedef struct RcvCommuPacket
{
char MsgId[5]; /* Message identifier */
char Date[8]; /* Date */
char Time[6]; /* Time */
char Sender[5]; /* Sender name */
char Receiver[5]; /* Receiver process name */
char Length[4]; /* Length of message */
char Type[1]; /* Type */
char Rc[1]; /* Receive code */
char Appid[5]; /* Application identifier */
char Reserved[8]; /* Reserved */
union
{
T_TSPL1 tspl1; //T_TSPL1tag 10000
T_TSPL2 tspl2; //T_TSPL2tag 10001
T_TPARL1 tparl1; //T_TPARL1tag 10010
T_TPARL2 tparl2; //T_TPARL2tag 10011
T_TDSL1 tdsl1; //T_TDSL1tag 10020
T_TSSL1 tssl1; //T_TSSL1tag 10030
T_TDSL2 tdsl2; //T_TDSL2tag 10021
T_TSSL2 tssl2; //T_TSSL2tag 10031
};
char Ext; /* Reserved */
}T_Rcv;
在进行报文交换时,直接传送或接收struct SndCommuPacket / RcvCommuPacket一个整体。发送函数原形如下:
// pSendData:发送字节流的首地址,iLen:要发送的长度
Send(char * pSendData, unsigned int iLen);
发送方可以直接进行如下调用发struct SndCommuPacket的一个实例snd:
SimModuClientSk->Socket->SendBuf(&snd, sizeof(SndCommuPacket));
接收函数原形如下:
// pRecvData:发送字节流的首地址,iLen:要接收的长度,//返回值:实际接收到的字节数
unsigned int Recv(char * pRecvData, unsigned int iLen);
接收方直接将接收到的数据保存在struct RcvCommuPacket的实例rcv中:
SimModuSrvSk->Socket->ReceiveBuf((char *)&rcv, sizeof(RcvCommuPacket));
接着判断报文ID进行相应处理。
switch(Msgid)
{
case 10000:
….报文10000的处理
delete &rcv;
break;
case 10001:
….报文10001的处理
delete &rcv;
break;
…
}
在上述函数的原形中值得注意的是强制类型转换:(char *)&sendCommuPacket、(char *)&recvCommuPacket,先取地址,再转化为char型指针,这样就可以直接利用处理字节流的函数。
同时还需要注意的是在Telegram.h头文件定义中,必须C语言结构体中的数据对齐问题。为了加快CPU的存取速度,C++编译器在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)。在程序内部用#pragma pack(n)指定,如:
#ifndef telegramH
#define telegramH
#pragma pack(push)
#pragma pack(push,1)
由#pragma pack(n)设定packing后,编译器实际排列结构体内部成员的时候,并不一定是按照#pragma pack(n)中的n指定长度为单位的,还取决于结构体内部占用空间最大的类型的长度。这么做可能是为了节省空间。当packing值小于结构体内占用空间最多成员占用的字节数的时候,以packing值为准。
b) 与喷印设备PLC通讯接口的实现
马钢2250热轧横切线喷印设备PLC采用Siemense S7-300。过程控制系统与PLC之间是标准的TCP/IP接口,喷印PLC使用Siemense提供的基于TCP/IP网络的标准发送和接收函数实现SOCKET通讯。在此接口实现过程中需要注意的是WinSocket的字节排序问题。由于PLC端的通讯程序不是MFC 应用程序,且通讯双方不共享相同的字节排序,则需要字节顺序转换。对于short和long类型的变量,可以用htons和htonl函数进行转换,htons 将 16 位整数从主机字节顺序转换为网络字节顺序(从 Little-Endian 转换为 Big-Endian)。 htonl 将 32 位整数从主机字节顺序转换为网络字节顺序(从 Little-Endian 转换为 Big-Endian)。对于float类型的变量,在PLC中存储的顺序与Intel正好相反,其转换函数实现如下:
float ConvertFloat(float src)
{
float tmp;
char Bfc[4];
char Afc[4];
memcpy((char *)& Bfc [0],(char *)&src,4);
memcpy((char *)& Afc [0],(char *)& Bfc[3],1);
memcpy((char *)& Afc [1],(char *)& Bfc [2],1);
memcpy((char *)& Afc [2],(char *)& Bfc [1],1);
memcpy((char *)& Afc [3],(char *)& Bfc [0],1);
memcpy(&tmp,& Afc,4);
return temp;
}
经过字节顺序转换,通讯双方即可获得准确的数据。
3.2. DDE通讯
使用动态数据交换(DDE:Dynamic Data Exchange)技术,可以自动进行数据交换。在进行动态数据交换的时侯,有一个或多个应用程序来提供数据,通常称之为服务器端;另外还有一个或多个应用程序可以接收服务器端发送的数据,称之为客户机端。有时一个应用程序在不同的动态数据交换任务中可以扮演不同的角色,也就是在一个动态数据交换任务中是服务器端,而在另一个动态数据交换任务中则作为客户机端。
横切线过程控制系统HMI采用Intouch组态软件,由于生产应用的需要,操作人员需要即时监控控制系统计算的设定值,并且可以通过HMI快速进行人工干预;相反,操作人员所做的人工干预有时也需要快速反馈至模型计算机以修正设定值的再计算。这就需要在控制系统的通讯进程与组态软件应用程序间进行动态数据交换。
BCB提供了四个关于动态数据交换的组件,分别如下:
Ø DdeClientConv组件可以与作为服务器端的应用程序建立一个链接,有时也称为一个通信管道。
Ø DdeClientItem组件可以获取动态数据交换时传递到客户机端的数据。
Ø DdeServerConv组件完成服务器端有关链接的工作。
Ø DdeServerItem组件指定动态数据交换时传递的数据。
在本系统应用中,当通讯程序启动时,建立与HMI的DDE链接。如果建立失败,将启动定时器每隔10秒钟尝试建立链接。代码如下:
if(!(DCC->SetLink("VIEW","tagname")))
{
Trdde->Enabled = true;
IsDDEConn = false;
TrReadFromPlc->Enabled=false;
Memo->Lines->Add("DDE CONNECTION ERROR "+ DateTimeToStr(Now()));
logtext="DDE CONNECTION ERROR ";
writelog(logtext.c_str());
}
else
{
DCC->OpenLink();
Trdde->Enabled = false;
if (TrReadFromPlc->Enabled==false)
{
TrReadFromPlc->Enabled = true;
}
IsDDEConn = true;
Memo->Lines->Add("DDE CONNECTION SUCCESS "+ DateTimeToStr(Now()));
logtext="DDE CONNECT SUCCESS ";
writelog(logtext.c_str());
}
在DDE通讯建立后,当通讯进程接收到来自模型计算的设定值时,即可通过DDE将包含设定值信息的文件名通知HMI,HMI自动读取该文件。代码如下:
if (IsDDEConn)
{
DCI_Flagread10000->DdeItem = "FlagRead10000_io";
DCI_ReadFile10000->DdeItem = "ReadFile10000_io";
StatusPoke = DCC->PokeData(DCI_ReadFile10000->DdeItem,filename);
StatusPoke = DCC->PokeData(DCI_Flagread10000->DdeItem,"1");
}
DCI_Flagread10000和DCI_ReadFile10000是DdeClientItem组件,其属性DdeItem指向Intouch应用程序中的Tag点。通过DdeClientConv的PokeData方法,向Intouch应用程序发送数据,根据返回值StatusPoke可以判断发送是否成功的状态信息。
在Intouch应用程序中,首先建立一个访问名,如图4所示:
图4 DDE访问名配置
然后将需要进行DDE通讯的Tag点配置在该访问名下,如图5所示:
图5 DDE标记点的配置
最后为上述Tag点建立条件脚本,完成相应的应用,如图6所示:
图6 DDE标记点条件脚本
3.3. 内存映射
由于模型计算需要每隔500ms获得2台矫直机的状态信息以及测量值。同时操作人员通过HMI也需要动态监控以上信息,为了满足上述需要,我们开发了OCX(Object Linking and Embedding (OLE) custom control)控件,将其嵌入至Intouch应用程序的窗体中。由Intouch应用程序将从BAS系统获得的状态值、测量值等信息通过OCX的属性,写入共享内存。通过内存映射的方式,通讯进程与OCX控件进行数据通讯,读取共享内存中的数据并发送给模型计算机。
使用内存映射文件是在Win32应用程序间共享数据的另一种方法。当Windows 操作系统向内存中装载文件(数据文件与执行文件)时,它们使用了特殊的全局内存区,然后将应用程序的虚拟内存地址映射到该文件中的相应位置上。事实上,操作系统不会将文件完全装载到内存中,它只是按照需要装载文件的一部分。通过这种方法,操作系统可以快速访问内存中的文件,而不需要完全装载它们。所有进程共享一个用于内存映射文件的全局区域。这就是当两个进程装载相同模块(应用程序或OCX)时,它们实际可以在内存中共享其执行代码的原因。我们可以利用这个事实,在进程间共享该内存区,而不是实际地建立文件。示例如下:
hMapFileTSTL1 = OpenFileMapping(FILE_MAP_ALL_ACCESS,true,"TSTL1");
if(!hMapFileTSTL1)
hMapFileTSTL1=CreateFileMapping((HANDLE)0XFFFFFFFF,NULL,PAGE_READWRITE,0,sizeof(SignalsLeveller1),"TSTL1");
if(hMapFileTSTL1)
{
LTS1=(SignalsLeveller1*)MapViewOfFile(hMapFileTSTL1,FILE_MAP_ALL_ACCESS,0,0,0);
}
API函数CreateFileMapping,把它的第一个参数设为0XFFFFFFFF,这样来说明它用于共享内存而不是文件(该函数参数的说明请见C++ Builder联机帮助)。在建立了映射文件之后,可以通过调用另一个API函数:MapViewOfFile访问它的内存,该函数返回一个指向共享内存块的应用程序特定指针(该指针在当前程序的存储空间中是有效的)。
之后可以在500ms的定时器事件中用以下代码读取共享内存的数据。
if(LTS1)
{
memcpy(&TS1,LTS1,sizeof(SignalsLeveller1));
}
关于OCX的注册使用及卸载、更新,先将shmem.ocx拷贝至/system32目录下,然后使用以下命令行regsvr32 c:\winnt\system32\shmem.ocx 注册,在Intouch 应用程序中安装Active X组件。当需要更新OCX时,首先退出INTOUCH 应用程序,然后使用以下命令行regsvr32 /u c:\winnt\system32\shmem.ocx卸载,再将新的shmem.ocx 拷贝并替换原组件,重新注册OCX组件。
3.4. SuiteLink通讯
马钢2250热轧横切基础自动化系统采用Siemens S7-400 PLC,共有在线PLC,离线PLC,矫直机PLC。 过程控制系统的组态软件Intouch应用程序可以通过SIDirect DAServer的配置,实现通过TCP/IP与S7 PLC的通讯。其中Intouch 应用程序通过SuiteLink协议访问DAServer,该通讯方式无需借助西门子的Simaticnet 软件。具体配置如下:
1. 首先启动System Management Console 程序。
2. 在ArchestrA System Management Console(SMC) 中找到“DAServer Manager”树下的SIDirect DAServer。在Local节点下,DAServer 名字是“ArchestrA.DASSIDirect.1”。见图7:
图7 SMC中的DASSIDirect DAServer
3. 展开ArchestrA.DASSIDirect.1,并选择“Configuration”,将出现如下“Global Parameters”对话框(图8):
图8 DASSIDirect – Global Parameters
各参数含义如下:
Ø Device Group Update Interval: 定义Device Group默认更新时间间隔。
Ø Slow Poll Interval: 定义当连接发生问题进入“Slow Poll”模式时,DAServer查询设备的时间间隔。当通信恢复正常后,DAServer的查询间隔调整为Device Group的查询间隔。
Ø Transaction to Subscription Ratio:“Transaction”是来自于DDE/SL/OPC客户端的读/写消息,“Subscription”是有处于“需采集”状态的数据点产生的,“Subscription”按“Update Interval”为间隔周期性发送。“Transaction to Subscription Ratio”定义DAServer在发送一个Subscription前可以发送的Transaction的最大数目。它是当有多个等待中的Transaction时,Transaction和Subscription的比例,比例的后者总是为1。所以,默认设置为2表示Transaction和Subscription的比例是2:1。这个比例确保当Transaction非常繁忙时,任有一定数量的Subscription动作。例如:比例设为2, 同时有3个Transaction, 2个Subscription准备好,Toolkit将先发送2个Transaction,1个Subscription, 在发送1个Transaction, 1个Subscription。
Ø Transaction Message Timeout: 每个Transaction(读/写/刷新等)消息的超时设置,这个超时设置使得客户端不会由于某种原因Transaction永久不被发送时导致被挂起。这是一个Transaction中消息更新的最大允许时间。此数字应该设置为一个单独的数据更新不应超过此时间设置。
Ø Server Protocal Timer: 因为SIDirect DAServer使用事件驱动的协议引擎,此选项无效。
Ø Diagnostic Backlog Size: 定义在“Transaction Diagnostic”根上可显示的最大的Transaction数。
Ø Poke Mode: 有以下有效模式:
- Control 保持写数据的顺序不改变,并且不合并Transaction。
- Transaction 使用保留要写的第1,第2和最后一个数据的合并方式保持写数据的顺序。
- Optimization 不保持写数据的顺序,并且合并写数据的Transaction,只写入最后一个要写的数据。
Ø Case Sensitive: 控制DAServer按大小写顺利扫描数据项和Device Group。
Ø Device Group Cache: 此参数保留将来使用。
Ø Simulation Mode: 此设置在此SIDirect DAServer中无效。
Ø System Items: 此参数控制系统数据点是否出现在浏览窗口中,是否做为DAServer数据采集接口的有效数据项。
Ø Unique Device Groups: 此参数控制是否检查Device Group在整个DAServer中的唯一性。
4. 右键点击“Configuration”图标。
5. 在菜单中选择“Add PortCpS7 Object”。
6. 右键点击“New_PortCp_000”并选择“Add S7Cp Object”,出现如下S7参数设置对话框(图9):
图 9 S7 CP通信参数
Ø Network Address: 输入PLC的IP地址。
Ø Local TSAP: 定义本地站的传输服务访问点,第一为数字定义设备,第一位数字为0,推荐设置为01.00。
Ø Remote TSAP: 定义PLC的传输服务访问点。
Ø Remote Rack No.: 输入10进制机架号。
Ø Remote Slot No.: 输入10进制的CPU槽号。在此Tech Note中,机架号设为0,CPU槽号设为3(电源模块占2个槽,所以CPU槽号为3)。
Ø Connection Resource: 从下拉框中选择16进制的连接资源。
7. 选择“Device Group”属性页。
8. 右键点击“Device Group”对话框中的空白地方,添加新的Device Group(类似主题名)到Device Group对话框中。如下图10所示:
图10 Device Group 对话框
9. 选择并用右键点击默认名Topic_0, 把它重新命名成一个有意义的名字,如S7PLC, 如图11所示:
图11 S7PLC Device Group
10. 在左面的树形结构图中,右键点击 ArchestrA.DASSIDirect.1并从子菜单中选择“Activate Server”启动DAServer,ArchestrA.DASSIDirect.1旁边的图标将由红变成绿,如图12所示:
图12 SIDirect DA Server已激活
完成了配置SIDirect DAServer后,在Intouch应用程序中,首先建立对应某个PLC的访问名。
图13 访问名配置
其次将需要与该PLC通讯的标记点配置在该访问名下,如图14所示:
图14 标记点配置
通过以上配置,即完成了Intouch的组态工作,如下图所示是2#矫直机的HMI画面,经过测试,Intouch应用程序与PLC之间的通讯性能可达到毫秒级,满足生产工艺需要,并且使操作人员可以快速的进行人工干预。
图15 2#矫直机模型设定画面
4. 结语
马钢2250热轧横切过程控制系统是一个典型的分布式控制系统,由于应用了以上多种通讯方式,使之形成了非控制部分与模型控制部分相分离的软件体系结构,实现了集中管理、分散控制,调试和生产运行表明,整个系统具有控制精度高、运行稳定、操作简便、维护方便等特点,可以满足生产高质量热轧横切板的要求。
参考文献
1、 金以慧,过程控制[M],北京:清华大学出版社,1993年
2、 InTouch 9.0 Basic ,Training Manual,Wonderware Corpo
展开阅读全文