版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、27.实时数据库27.实时数据库27-1序号内容页码27.1数据库优缺点27-227.2实时数据库模式27-227.3实时数据库结构27-327.4实时数据库选型27-327.5安装实时数据库27-427.6实时数据库连接27-1327.7实时数据库Excel报表27-2327.8实时数据库导出到数据库27-2727.9实时数据库数据27-3027.10使用脚本实时数据库27-3327.11使用API开发包实时数据库27-3427.12升级实时库加密狗27-4327.实时数据库27.1型数据库优缺点27.2实时数据库模式27-227.实时数据库27.3实时数据库结构(FameHistory)2
2、7.4实时数据库选型(FameHistory)27-327.实时数据库27.5 安装实时数据库(FameHistory)¨安装环境需求:¨支持 32 位和 64 位系统:o以 64 安装为例:文件列表:27-4FameHistory_ServerInstall_x64.exe必须安装.实时数据库服务器FameHistory_DataNode_x64.exe不单独安装.随服务器安装数据节点FameHistory_x64.exe根据需要.单独安装实时库客户端管理工具数较少(<10000 点)数较多(>=10000)硬件平台工作站,7200 转硬盘双核 CPU,内存
3、2G服务器,7200 转硬盘至少四核 CPU,内存 4G,建议 16G网络带宽百兆带宽千兆带宽平台Windows XP,Windows 7Windows Server 2008(32/64 位)Windows Server 2008(64 位)其他可与组态同机运行建议运行27.实时数据库o执行 FameHistory_ServerInstall.exe,安装实时库服务器:¨选择安装路径,缺省 C:FameHistory:¨选择单独或冗余服务器方式:27-527.实时数据库o选择并设置单独服务器:¨选择并设置冗余服务器(单网卡):网络检测 IP:可选项,建议选择,配
4、置主备服务器都能选择并设置冗余服务器(双网卡):的第IP,如网关 IP;¨27-627.实时数据库¨执行,开始安装:¨安装实时库服务器完成:¨执行完成按钮,继续初始化并安装本机数据节点:27-727.实时数据库¨执行:¨选择继续安装,执行:¨执行,设置数据节点服务端口(5678)及数据路径:27-827.实时数据库¨设置数据节点运行参数,这步很重要:建议参数:假设 10000 个,每分钟1 次,3 年,则估算设置如下:估算依据:27-9最大占用硬盘空间(N4)157680M(约 160G)估算:N4=10000*(
5、60*24)*(365*3)/100000数据文件大小(N2)2560M设置:N2=2560M数据文件个数(N3)60 个计算:N3=N4/N2=157680/2650操作系统32 位系统(建议)64 位系统(建议)内存缓冲大小(N1)512M1024M数据文件大小(N2)1280M2560M数据文件个数(N3)最大占用硬盘空间 N4=N2*N3;1M 硬盘空间大概能10 万条;27.实时数据库¨单服务器数据节点:¨多服务器数据节点:¨开始安装数据节点,安装完成后,重新启动计算机;27-1027.实时数据库¨有两个重要目录:1.Config 目录,存放实
6、时数据库组态内容,如等;可备份此目录内容,把实时数据库移植到其他计算机;尤其要备份 Kernel.db 和ServerCfg.xml 关键文件;2.Data 目录,存放实时数据库数据,备份整个目录内容可移植到其他计算机; 操作系统启动后,实时数据库服务会自动启动;¨¨能够手动停止或启动实时数据库服务1:执行安装目录下. executablehdServiceMgrTool.exe;2:通过组态管理器,实时数据库->客户端工具->本地服务管理工具;¨¨¨实时数据库通过加密狗实时数据库运行前后,才能正式使用;加密狗;无加密狗以演示方式运
7、行:30000 点,10 客户端,仅运行两小时;27-1127.实时数据库27.6 实时数据库连接o实时数据库概念:27-1227.实时数据库¨实时数据库连接示意图:o定制实时数据库连接:27-1327.实时数据库o选择实时数据库连接功能:o编辑数据库连接文件:o实时数据库参数:1.数据库类型,完全支持 FameHistory.V3x 实时库,有限支持 Alilor 和 Golden 实时库2.服务器地址,格式:IP;Uid=username;Pwd=password;3.TCP 端口,实时数据库服务使用 TCP 端, FameHistory 缺省 5673;4.连接超时,连接和实时
8、数据库服务的超时时间,取值范围 1-300 秒;5.连接间隔,服务器连接意外断开后,重新连接等待时间间隔,取值范围 1-600 秒;6.轮询间隔,取值范围 10-3000 毫秒,每隔设定时间段检查 1 次是否有数据需要;7.包容量,每次的最大数量,取值范围 1-10000 个,数值越大占用内存越大;8.数据节点,将添加到指定数据节点,不指定系统自动分配节点;27-14本地实时数据库(local)实时数据库192.168.1.100;Uid=admin;Pwd=admin;冗余实时数据库192.168.1.101|192.168.1.102;Uid=admin;Pwd=admin;27.实时数据
9、库o定义实时数据库:1.名称(TagName),实时数据库由多个组成,每隔对应唯一标识(TagID);如要支持通过 DOC变量,名称与DOC 变量名称一致;2.3.描述(TagDesc),对的进一步描述;类型(TagType),分为普通、统计、计算;4.普通5.统计可以对应某个运行数据库变量;的内容是对普通某时间段数据进行某种统计后的结果,组态界面:6.计算的内容是对某些普通计算后的结果, 组态界面:7.标识(TagID),不手动填写,正式运行前,通过<连接服务器>获得;8.对应变量,所对应的运行数据库变量(AI/AO/AR/DI/DO/DR/VA/VD/VT);9.数值类型,支持
10、 Byte/Short/Long/Real/Double/Bool/String;10.激活条件,只有满足设定的激活条件才,激活条件得表达式可以是:DI.DI1=1,DI.DI1=0,AI.AI1=10,AI.AI1>10,AI.AI1>=AI.AI2,DI.DI1+-,DI.DI1+11.时间触发,通过<开始时间>和<触发周期>定义在每天某些时刻定期数据;如果周期为 0,则循环,12.变化触发,对应变量值发生了某种变化,则进行; (1).变化值为 0, 当变量值发生任何变化,则进行Abs(x-x')>0,即:(2).变化值不为 0 且没选择&
11、lt;%>,当变量变化绝对值大于等于设定值时,则进行Abs(x-x') >= n,即:(3).变化值不为 0 且选择了<%>,当变量变化绝对值大于等于百分比设定值时,则进行Abs(x-x') >= n* x'/100持续时间,如果在某持续时间段内,变量值未发生任何变化,则到达持续时间时也进行取值范围为 0-86400 秒,为 0 时此参数无效;,13.通过<添加>、<修改>、<删除>按钮, 编辑列表;27-1527.实时数据库14.列表最多支持 60000 或 600000 个;15.使用菜单<Ex
12、cel 导出>和<Excel 导入>,可以通过Excel 进行高效编辑列表;16.实时数据库类似 DOC 历史数据库,使用菜单<DOC 变量导入>命令,可以从DOC 变量获取:o编辑完成的界面如下:27-1627.实时数据库o使用编辑菜单下的替换命令,快速批量替换表中的内容:o使用编辑菜单下的查找命令,快速查找某个名称:o,把所做名添加到实时数据库服务器,并获得标识(TagId):1.确信已启动并能正确连接到实时数据库服务;2.执行连接服务器按钮,显示下面界面:3.执行连接服务器按钮:27-1727.实时数据库4.连接服务器,则执行添加按钮,把添加到服务器,添度:
13、60-120 个/秒:5.添加,执行按钮,并获取标识(TagId),获取速度:50-100 个/秒:TagName:名称,TagType:类型(0-6),TagId:标识(1-5000000);TagStatus:获取标识过程状态:6.获得标识后,自动在连接文件,运行时根据此标识进行:7.如果实时服务器发生变化,须重新获取标识;27-181不添加而获得标识2已属性相同直接获得标识3已数值类型相同其他属性不同.修改属性并获得标识4已数值类型相同删除重新添加并获得标识5已类型不同删除重新添加并获得标识?获取失败27.实时数据库o应用实时数据库连接:1.选择实时数据库连接,执行应用实时数据库连接:2
14、.添加连接文件到列表中:3.只有被应用的连接文件才工作;4.最多应用 32 个连接文件;o启动实时数据库连接:1.选择"系统->设置"功能,执行<2.启动任务>:2. 从"系统任务"列表中选中"þ实时数据库连接"27-1927.实时数据库o监视实时数据库连接:1.运行状态,监视实时数据库连接:2.执行"监视实时数据库连接":3.建立开关变量(DR|VD)关联连接状态(0:断开,1:连接),变量名称格式"#连接名称"27-2027.实时数据库o通过 DOC 存档变量实时
15、数据库1.选择<关联并使用实时数据库>:2.选择此选项后,本地 DOC 存档变量不再;3.本地和Web 曲线数据,直接来自于实时数据库;27-2127.实时数据库27.7 实时数据库Excel 报表¨建立配置文件:1.选择<实时数据库连接>,执行<实时数据库|输出配置文件>:2.执行<新建>按钮,并选择<Excel 报表输出>:27-2227.实时数据库3.输入报表配置文件名称:执行<确定>按钮,组态安装目录下 RtlFile 子目录中建立Excel 格式的配置文件; 打开编辑配置文件,包含两个表 Report
16、和 Param:通过 Report 设计报表格式,必须设计两行:¨¨¨通过 Param 表设置数据源及报表格式参数:27-2327.实时数据库¨执行脚本函数输出报表:FameHistoryObj.ReportToExcel"",1,2,1,2,1,1,"选择.",-1,-1,"报表格式 1.xls","","",&H01¨FameHistoryObj.ReportToExcel,脚本函数说明:某时间段,以Excel格式打印、浏览、保存:F
17、ameHistoryObj.ReportToExcelstartTime,timeLength,timeUnit,intervalLength,intervalUnit,printMode,wndMode,wndTitle,wnos,wndYPos,templateFile,outputPath,outputFile,Options27-24startTime开始时间,格式"YYYY-mm-dd HH:MM:SS"startTime为空时,自动取当日零点作为开始时间,如"2012-12-01 00:00:00" 可以定制开始时间,格式为"%Y-
18、%m-%d %H:%M:%S":- 取当日8点作为开始时间,则startTime为"%Y-%m-%d 08:00:00"- 取当月1日零点作为开始时间,则startTime为"%Y-%m-01 00:00:00"timeLength时间长度timeUnit时间,0=分钟,1=小时,2=天,3=月27.实时数据库o速度测试:27-25普通笔记本计算机,2G内存本地实时数据库100个行数耗时6005秒120010秒intervalLength取值间隔长度intervalUnit取值间隔,0=秒,1=分钟,2=小时,3=天printMode打印方式,
19、0=打印,1=预览,2=文件dlgMode是否显示选择窗口 dlgMode=1弹出时间输入窗口dlgMode=0不弹出时间输入窗口,而使用缺省的时间参数dlgTitle选择窗口标题内容dlgXPos选择窗口缺省横坐标位置,为-1时居中显示dlgYPos选择窗口缺省竖坐标位置,为-1时居中显示templateFile模版文件,缺省在RtlFile子目录下具体格式参看安装目录下fmRealdbReport.xls文件outputPath输出路径,为空时,缺省为组态目录下的Temp子目录outputFile输出文件,为空时,缺省为当前的日期时间Options选项内容:Bit(0)=1显示提示,Bit
20、(0)=0安静方式27.实时数据库27.8 实时数据库导出到数据库¨建立配置文件:1.选择<实时数据库连接>,执行<实时数据库|输出配置文件>:2.执行<新建>按钮,并选择<导出数据库>:27-2627.实时数据库3.输入配置文件名称:执行确定按钮,组态安装目录下 RtlFile 子目录中建立Excel 格式的配置文件;打开配置文件,包含两个表 Data 和 Param:¨¨通过 Data 表设计实时数据库中多个的:¨通过 Param 表设置数据源及和字段的对应:名为"()"时,表示为计
21、算公式;名为""时,表示为固定内容;27-2727.实时数据库¨编写下面脚本函数实现报表:FameHistoryObj.ReportToDatabase "",1,2,1,2,0,"" ,-1,-1,"导出格式 1.xls",&H00执行上面脚本,可以把实时数据库数据导出到数据库:¨FameHistoryObj.ReportToDatabase,脚本函数说明:某时间段,导出到数据库(DB2DB):FameHistoryObj.ExportToDatabasestartTime,timeL
22、ength,timeUnit,intervalLength,intervalUnit,wndMode,wndTitle,wntemplateFile,optionsos,wndYPos,o速度测试:27-28普通笔记本计算机,2G 内存本地实时数据库100 个(字段),SQL Server 2000 数据库数(条)导出时间60010 秒120035 秒180050 秒startTime开始时间,格式"YYYY-mm-dd HH:MM:SS"startTime为空时,自动取当日零点作为开始时间,如"2012-12-01 00:00:00" 可以定制开始时间
23、,格式为"%Y-%m-%d %H:%M:%S":- 取当日8点作为开始时间,则startTime为"%Y-%m-%d 08:00:00"- 取当月1日零点作为开始时间,则startTime为"%Y-%m-01 00:00:00"timeLength时间长度timeUnit时间,0=秒,1=分钟,2=小时,3=天,4=月intervalLength取值间隔长度intervalUnit取值间隔,0=秒,1=分钟,2=小时,3=天dlgMode是否显示选择窗口:dlgMode=1弹出时间输入窗口dlgMode=0不弹出时间输入窗口,而使用缺
24、省的时间参数dlgTitle选择窗口标题内容dlgXPos选择窗口缺省横坐标位置,为-1时居中显示dlgYPos选择窗口缺省竖坐标位置,为-1时居中显示templateFile模版文件,缺省在RtlFile子目录下,具体格式参看安装目录下fmRealdb2db.xls文件options选项内容:Bit(0)=1显示提示,Bit(0)=0安静方式27.实时数据库27.9 实时数据库数据¨建立配置文件:1.选择<实时数据库连接>,执行<实时数据库|输出配置文件>:2.在显示的界面中,执行<新建>按钮,并选择<数据表>:27-2927.实时数
25、据库3.输入配置文件名称:执行<确定>按钮,组态安装目录下 RtlFile 子目录中建立ini 格式的配置文件;打开并编辑配置文件,格式如下:¨27-3027.实时数据库¨编写画面脚本:FameHistoryObj.ShowDataTableWindow "配置 1.ini"执行脚本后,界面如下:通过按钮设置时间:通过上页和下页按钮上下时间段数据:27-3127.实时数据库27.10 使用脚本实时数据库'连接FameHistory实时数据库:'参数分别为:服务器IP地址,端,登录用户名,口令,超时时间(秒)'连接返回1
26、,否则返回0,可用GetLastError得到错误代码n=FameHistoryObj.Connect("127.0.0.1",5673,"admin","admin",3)If n=1 Then'某段时间的:名称,开始时间,结束时间,秒间隔'参数分别为:'返回值为到的数量(1-30000条),失败则返回0,可用GetLastError得到错误代码startTime="2012-12-16 00:00:00"startTime="2012-12-17 00:00:00"n
27、Count=FameHistoryObj.QueryRecords("TAG1",startTime,endTime,60) If nCount>0 ThenTxtFileObj.OpenFile "c:temp20121216.txt"For j=0 To nCount-1'得到某条时间和数值strTime= FameHistoryObj.GetRecordTime(j) dblValue= FameHistoryObj.GetRecordValue(j) s=strTime&"="&CStr(dblV
28、alue)&vbCrLf TxtFileObj.WriteFile s,0NextTxtFileObj.ElseFileErrorCode= FameHistoryObj.GetLastError()MsgBox "End If'关闭连接失败:"&CStr(ErrorCode)FameHistoryObj.DisConnect ElseErrorCode= FameHistoryObj.GetLastError() MsgBox "连接失败:"&CStr(ErrorCode)End If'销毁对象Set Obj=N
29、othing27-3227.实时数据库27.11使用 API 开发包实时数据库¨¨以 VC+ 6.0 为例子;API 开发包以下文件:¨¨把 API 开发包文件拷贝到VC6 项目路径下;通过 Project->Add To Project->Files 菜单,把*.h 和*.lib 文件加入到项目中:27-3327.实时数据库¨数据的代码如下:#include "hdKingApi.h"/*/实时数据库原始int CXDlg:AccessRealtimeDatabase1(CTime startTime,CTim
30、e endTime)/连接实时数据库服务器CString srvIp="127.0.0.1" HD3Connection conn;memset(&conn,0,sizeof(HD3Connection); memcpy(conn.szAddress,srvIp,srvIp.GetLength(); conn.nPort=5673;conn.nTimeout=3;int32 nRe3_connect(&conn); if(nRet!=0) return 1;/登录实时数据库服务器,在本地ut3_set_request_timeout(3); nRet=sc3
31、_login("admin","admin"); if(nRet!=0)nt3_disconnect(); return 2;可不登录/根据变量名称,获取标识CString varName="TAG1"uint32 tagID=0;chartagName128;memset(tagName,0,128); memcpy(tagName,varName,varName.GetLength(); nRet=tag3_query_id_by_name(tagName,&tagID); if(nRet!=0)nt3_disconnec
32、t(); return 3;27-3427.实时数据库/设置CTime HDTime HDTimeCTimeSp的开始时间和结束时间m_InitTime(1970,1,1,8,0,0);/初始时间戳m_StartTime; /开始时间戳m_EndTime;/结束时间戳Span=startTime-m_InitTime;m_StartTime.nSec = timeSpan.GetTotalSeconds(); m_StartTime.nMsec = 0;timeSpan=endTime-m_InitTime;m_EndTime.nSec = timeSpan.GetTotalSeconds()
33、; m_EndTime.nMsec = 0;HD3TimeRegion timeRegion; timeRegion.left=n_StartTime; timeRegion.right=n_EndTime;timeRegion.bLeftd = true;timeRegion.bRightd = true;/时间段内的原始HD3Record pRecords10000;int32recordCount=10000;nRet= ar3_query_raw_records(tagId,&timeRegion,&recordCount,pRecords); if(nRet!=0)n
34、t3_disconnect(); return 4;nt3_disconnect();27-3527.实时数据库/分析或显示数据CString s,s1;for(int i=0;i<recordCount;i+)/获取时标CTimeSpSpan1(0,0,0,pRecordsi.nSec);CTime recordTime=m_InitTime+timeSpan1; s=recordTime.Format("%Y-%m-%d %H:%M:%S");s1.Format("%s.%.3i",s,pRecordsi.nMsec);/获取数据值for(;)
35、if(pRecordsi.nTagType=3)/32 位单精度浮点数s.Format("%.4f",pRecordsi.value.fFloat32);break;if(pRecordsi.nTagType=4)/64 位双精度浮点数s.Format("%.6f",pRecordsi.value.fFloat64);break;if(pRecordsi.nTagType=0)/8 位整数s.Format("%i",pRecordsi.value.nInt8);break;if(pRecordsi.nTagType=1)/16 位整数
36、s.Format("%i",pRecordsi.value.nInt16);break;if(pRecordsi.nTagType=2)/32 位整数s.Format("%i",pRecordsi.value.nInt32);break;break;return 0;27-3627.实时数据库/*/实时数据库插值int CXDlg:AccessRealtimeDatabase2(CTime startTime,CTime endTime)/连接实时数据库服务器CString srvIp="127.0.0.1" HD3Connectio
37、n conn;memset(&conn,0,sizeof(HD3Connection); memcpy(conn.szAddress,srvIp,srvIp.GetLength(); conn.nPort=5673;conn.nTimeout=3;int32 nRe3_connect(&conn); if(nRet!=0) return 1;/登录实时数据库服务器,在本地ut3_set_request_timeout(3); nRet=sc3_login("admin","admin"); if(nRet!=0)nt3_disconnec
38、t(); return 2;可不登录/根据变量名称,获取标识CString varName="TAG1"uint32 tagID=0;chartagName128;memset(tagName,0,128); memcpy(tagName,varName,varName.GetLength(); nRet=tag3_query_id_by_name(tagName,&tagID); if(nRet!=0)nt3_disconnect(); return 3;27-3727.实时数据库/设置CTime HDTime HDTimeCTimeSp的开始时间和结束时间m_I
39、nitTime(1970,1,1,8,0,0);/初始时间戳m_StartTime; /开始时间戳m_EndTime;/结束时间戳Span=startTime-m_InitTime;m_StartTime.nSec = timeSpan.GetTotalSeconds(); m_StartTime.nMsec = 0;timeSpan=endTime-m_InitTime;m_EndTime.nSec = timeSpan.GetTotalSeconds(); m_EndTime.nMsec = 0;/根据插值间隔设置插值时刻Int intHDRecord*int32*m_Interval=6
40、0;/间隔 60 秒m_RecordCount=(m_EndTime.nSec-m_StartTime.nSec)/m_Interval;/ pRecords=new HDRecordm_RecordCount;pErrorCodes=new int32m_RecordCount;数量for(int j=0;j<m_RecordCount;j+) pRecordsj.nSec=nStartTime+n_Interval*j; pRecordsj.nMsec=999;/时间段内的插值int32 nRet=ar3_query_interp_records_by_mode(HD3_REC_IN
41、TERP_QUERY_MODE_PREV,tagId,m_RecordCount,pRecords,pErrorCodes);if(nRet!=0 && nRet!=119611) / nt3_disconnect();return 4;Nt3_disconnect();失败27-3827.实时数据库/分析或显示数据CString s,s1;for(int i=0;i< m_RecordCount;i+)/获取时标CTimeSpSpan1(0,0,0,pRecordsi.nSec);CTime recordTime=m_InitTime+timeSpan1;s=recor
42、dTime.Format("%Y-%m-%d %H:%M:%S"); s1.Format("%s.%.3i",s,pRecordsi.nMsec);/获取数据值for(;)if(pRecordsi.nTagType=3)/32 位单精度浮点数s.Format("%.4f",pRecordsi.value.fFloat32);break;if(pRecordsi.nTagType=4)/64 位双精度浮点数s.Format("%.6f",pRecordsi.value.fFloat64);break;if(pReco
43、rdsi.nTagType=0)/8 位整数s.Format("%i",pRecordsi.value.nInt8);break;if(pRecordsi.nTagType=1)/16 位整数s.Format("%i",pRecordsi.value.nInt16);break;if(pRecordsi.nTagType=2)/32 位整数s.Format("%i",pRecordsi.value.nInt32);break;break;return 0;27-3927.实时数据库/*/实时数据库的当前数值int CXDlg:GetTagCurrentValye()/连接实时数据库服务器CString srvIp=&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 部编版高中历史一轮复习近现代史冲刺试卷及答案
- 2026年全民健身服务指导员专业能力模拟试卷及答案
- 云南省注册环保工程师考试环境影响评价师备考习题集及答案
- 护士资格证考试护理心理学高频考点复习习题及答案
- 年产5GWh新型电芯模组(无负极固态)产业化项目可行性研究报告模板申批拿地用
- 九年级语文上册《孤独之旅》课件
- 年产500万套绗缝家居产品生产线项目可行性研究报告模板-立项拿地
- 江西成考高升专数学理科真题附答案集
- 湖南成考高升专理化综合刷题自测库
- 2026酒店行业经营韧性与数字化报告
- 售后服务组织架构及人员岗位职责
- 食品加工厂安全生产手册
- 吉林大学《微积分AⅠ》2021-2022学年第一学期期末试卷
- 有限空间管理规章制度
- (高清版)AQ 1028-2006 煤矿井工开采通风技术条件
- DLT 572-2021 电力变压器运行规程
- 宅基地转让协议书
- DL-T1098-2016间隔棒技术条件和试验方法
- 慢性乙型肝炎防治指南(2019年版)
- CCAR-21简介教学课件
- 2014施工现场临时用电安全技术规范讲解(PPT)
评论
0/150
提交评论