组态王实现设备OEE数据采集的项目总结
- 方案设计
- 硬件设计
- 软件设计
- 难点总结
- 数据通讯
- 数据转换
- 报表
- 数据存储
- 项目拓展
最近在做一个项目,关于采集设备OEE数据。陆陆续续做了小半个月,现在算告一段落,特整理总结。
方案设计
硬件设计
本项目是将两台设备的OEE数据,通过OPC协议,采集到终端电脑。两台设备为独立设备,但都预留OPC通讯网口,终端电脑为台式机,另外考虑到后期数据要进行web访问,又在台式机增加一个独立网卡,方便与外部生产网链接。因此项目网络架构初步设计如下:
其中由于现场没有独立电源,交换机是安装在设备2电柜内,由设备2进行供电。
软件设计
本项目由于只做数据采集和展示,功能相对简单,主要包括:数据展示、报表、报警、web。
难点总结
项目是实施过程中,主要遇到几个问题。OPC通讯配置、数据转换、报表等几个问题。
数据通讯
项目是采用OPC通讯协议,这个是设备厂家提供支持的通讯协议,无法改变,设备端作为OPC UA客户端,终端电脑的上位机是组态王,但由于设备端也是分属不同的网段,内部业务层为独立网段,OPC通讯层又是一个网段,设备端的OPC server在工控电脑上,导致组态王无法直接找到OPC服务器。后面询问组态王厂家,也没联系上。。。,但应该是可以的,应该是哪里的参数没配置好。
所以只能采用通过Kepserver当作中继,在终端电脑安装kepserver,通过kepserver将数据从设备端采集,然后组态王从kepserver读取数据。
另外在配置kepserver时,出现一个问题,根据厂家提供的URL地址,无法在kepserver上连接到,但在设备端的工控机上,直接通过UAexpert是可以读取到数据,网上各种查资料和测试,最后发现问题出现在URL地址上,一般OPC的URL格式为:opc.tcp://[HostName]:端口号。其中HostName可以是IP地址或者计算机名,但如果你是跨网络的话,需要把HostName修改为IP地址。
数据转换
设备厂家提供的OPC数据大部分为字符串类型,需要转换为整数型或者浮点型。为了满足数据的时效性,可以使用数据改变脚本,当数据发生变化时,利用StrToInt、StrToReal等函数来实现。
另外由于在计算OEE时,需要启动时间、停止时间、运行时间等,但设备没有直接提供,需要在组态王上完成计算和数据转换。
本项目采用的方法是使用数据变化命令,当启动信号变化后,记录系统时间作为启动时间,当停止信号为true后,再次记录系统时间,作为结束时间。这里记录的系统时间,需要保存成X年X月X日X时X分X秒格式。方便后面的时间计算。
关于数据变化命令的频率周期,默认是1s,主要OPC采集周期也是1s,如果有特殊要求,可以修改,但一般最低是250ms。
运行时间为停止时间减去启动时间,在组态王中,涉及到时间计算,有这样一个函数htConvertTime(Year,Month,Day,Hour,Minute,Second);
参数:
Year: 年,整型,此值必须介于1970和2038之间
Month: 月,整型,此值必须介于1和12之间
Day: 日,整型,此值必须介于1和31之间
Hour: 小时,整型,此值必须介于0和23之间
Minute: 分钟,整型,此值必须介于0和59之间
Second: 秒,整型,此值必须介于0和59之间
返回值:整型
实现方法为将启动时间和结束时间通过此函数转换为数值,然后通过整型数据计算,得到运行时间。
报表
组态王带有报表控件,操作比较简单,和excel功能类似。不过在填写变量的时候,记得加上**=**
另外对于报表的打印,本项目采用自动打印,当生产结束后,就自动将报表打印出来。实现逻辑:利用数据变化命令,当运行停止信号为true后,运行报表打印脚本。
报表打印脚本如下:
//定义变量文件名
string FileName;
//定义报表文件名,其中InfoAppDir()指项目运行路径,StrFromReal代表字符串转换实数功能的函数,.xls是报表文件格式,组态王支持.rtl、.xls、.xlsx、.pdf。
FileName=InfoAppDir()+"日报\"+ StrFromReal( \\local\$Year, 0, "f" )+"年"+StrFromReal(\\local\$Month, 0, "f" )+"月"+StrFromReal(\\local\$Day, 0, "f" )+"日"+".xls";
//如果日报路径下没有当天的文件就清空后台日报,并保存报表到日报路径下,如果日报路径下有当天的报表就直接加载报表
long return01=InfoFile( Filename, 1, \\local\$Minute );
if (return01==0)
{
//Report5指的是报表控件名称。可双击报表控件,就可以看到控件名称,也可设置。
ReportSetCellString2("Report5", 6, 1,29,11, "");
ReportSaveAs("Report5",FileName);
}
else
{
ReportLoad("Report5",FileName);
}
数据存储
为了方便记录数据,需要将数据存储到数据库,本项目用的是sql sever数据库,具体实现方式为:
-
sql server创建数据库和数据表时,需要和组态王中的变量类型保持一致
-
组态王记录体添加变量时,字段名称和sql server数据表中的列名名称、顺序、数量一致。
-
创建ODBC数据源时,注意关联的数据库和数据表。具体操作步骤如下:
4、编写脚本,将数据存储到sql server数据库。可使用应用程序命令语言,在程序运行时启动,频率可设置为1s。
// \\local\ZLKT_SqlDEviceID为创建的本地变量,类型为内存整型,ZLZXKTRSJZ为创建ODBC数据源的名称,
sqlconnect( \\local\ZLKT_SqlDEviceID, "dsn=ZLZXKTRSJZ;uid=sa;pwd=123456");
// 质量中心空调热水机组为记录体名称。
sqlinsert( \\local\ZLKT_SqlDEviceID, "ZLZXKTRSJZ", "质量中心空调热水机组" );
sqlconnect(\\local\OSD1空调热水_DeviceID, "dsn=OSD1KTRSJZ;uid=sa;pwd=123456");
sqlinsert(\\local\OSD1空调热水_DeviceID, "OSD1KTRSJZ", "固体制剂车间空调热水机组" );
sqlconnect(\\local\OSD1空调热水_DeviceID, "dsn=OSD1GYRSJZ;uid=sa;pwd=123456");
sqlinsert(\\local\OSD1空调热水_DeviceID, "OSD1GYRSJZ", "固体制剂车间工艺热水机组" );
sqlconnect(\\local\OSD1空调热水_DeviceID, "dsn=SteamDesuperheaterMachine;uid=sa;pwd=123456");
sqlinsert(\\local\OSD1空调热水_DeviceID, "SteamDesuperheaterMachine", "动力机修蒸汽减温装置" );
sqlconnect为组态王函数,连接组态王和数据库
[ResultCode=]SQLConnect(DeviceID, “dsn=;uid=;pwd=”);
属性 | 值 |
---|---|
DSN | ODBC中定义的数据源名 |
UID | 登录ID号 |
PWD | 密码,区分大小写 |
DATABASE | 所要访问的数据库名 |
sqlinsert为组态王函数。使用记录体中定义的连接在表格中插入一个新的记录
[ResultCode=]SQLInsert(DeviceID, “TableName”, “BindList”);
参数 | 描述 |
---|---|
DeviceID | SQLConnct()产生的连接号 |
TableName | 表格名 |
BindList | 记录体 |
项目拓展
目前项目只完成到这里,后续会增加web功能,关于web功能,目前想到的方案为:1、由于数据都存储到sql server中,后面可通过C#进行web开发。2、网上查资料组态王支持web功能,还支持webservice功能,可以直接使用组态王进行web开发。
唉,又要掉几根头发了。。。