IFIX连接SQL读写数据和制作excel报表图文教程
- 格式:doc
- 大小:26.50 KB
- 文档页数:10
利用iFIX监控软件实现数据采集和输出报表
吴坚兰;崔绍文;高连艳;温艳艳;孙合明
【期刊名称】《电气传动》
【年(卷),期】2009(039)007
【摘要】随着工业水平的发展,自动控制系统对监控系统的要求变得越来越高.监控系统直接面向试验过程,完成逻辑连锁控制、试验数据的采集和存储、实现整个试验过程的顺序控制和连续调节控制.其中数据采集和存储成为一个难点.介绍了应用iFIX软件借助OPC技术实现数据的采集,并通过VBA编程查找SQL数据库实现数据存储到EXCEL表中的实例,对实例中遇到的具体问题进行了分析和解决.首先对数据库查找条件和查找方法进行了分析;再针对实际应用中第一组采样数据丢失问题提出了解决办法并圆满解决.
【总页数】6页(P53-58)
【作者】吴坚兰;崔绍文;高连艳;温艳艳;孙合明
【作者单位】天津电气传动设计研究所,天津,300180;中冶恒通冷轧技术有限公司,河北,唐山,063611;天津电气传动设计研究所,天津,300180;天津现代技术学院,天津,300222;河北承德钢铥公司,热轧卷板厂,河北,承德,067002
【正文语种】中文
【中图分类】TP274
【相关文献】
1.规划建筑竣工测量报表输出软件的开发与实现 [J], 吴献丰;钟玉林
2.利用iFIX技术实现煤粉制备系统的动态监控 [J], 马琴
3.利用EXCEL完善IFIX监控软件的报表功能 [J], 杨永奇
4.EXCEL在IFIX软件的报表实现 [J], 巩伟;宋勇江
5.基于IFIX组态软件的低压电流互感器检定流水线运行监控系统的设计与实现 [J], 葛福菀;王兆军;张曼
因版权原因,仅展示原文概要,查看原文内容请购买。
在iFix中采用ODBC制作历史报表具体步骤如下:Step 1: 打开SCU中的Task Configuration,增加HTC.EXE和WSQLODC.EXE两个任务,并将它们设置成为后台运行状态;Step 2: 启动iFix,点击工具栏上的按钮打开Historical Assign,添加所需监控的数据点,并设置历史数据的采样速度。
Step 3: 打开任务控制,查看是否已经启动HTC。
Step 4: 在Globals\User下面添加三个字符型(vtString)变量,分别命名为strStartTime, strEndTime 和Interval。
新建一幅画面,如图如示,在画面上布置3个DATALINK分别指向strStartTime, strEndTime 和Interval,并设置成In place(即允许修改)。
strStartTimestrEndTimeIntervalStep 5:为画面上的各个按钮写代码,最好先将各按钮注册——即将鼠标移到按钮上方,按右键弹出菜单,选择Edit Script。
在VB Editor的工具菜单中的Reference(引用)中选中Microsoft Excel 9.0 Object Library和Microsoft ActiveX Data Objects,如下图所示。
然后在各按钮的处理程序中添加相应代码。
内容如下(可将下列代码直接COPY到你的VB编辑器中,覆盖因为注册产生的空代码):‘运行状态画面初始化Private Sub CFixPicture_Initialize()CommandButton1_ClickCommandButton2_Clickuser.Interval.CurrentValue = "00:00:30"End Sub‘组态状态画面初始化Private Sub CFixPicture_InitializeConfigure()user.strEndTime.CurrentV alue = "报表结束时间"user.strStartTime.CurrentValue = "报表开始时间"End Sub'设当前时间为报表开始时间Private Sub CommandButton1_Click()Dim curTime As StringcurTime = NowDim curmonth, curday, curhour, curminute, cursecond As Stringcurmonth = IIf(Month(curTime) < 10, "0" & Month(curTime), Month(curTime)) curday = IIf(Day(curTime) < 10, "0" & Day(curTime), Day(curTime))curhour = IIf(Hour(curTime) < 10, "0" & Hour(curTime), Hour(curTime))curminute = IIf(Minute(curTime) < 10, "0" & Minute(curTime), Minute(curTime)) cursecond = IIf(Second(curTime) < 10, "0" & Second(curTime), Second(curTime)) user.strStartTime.CurrentValue = Year(curTime) & "-" & curmonth & "-" & curday _& " " & curhour & ":" & curminute & ":" & cursecond End Sub'设当前时间为报表结束时间Private Sub CommandButton2_Click()Dim curTime As StringcurTime = NowDim curmonth, curday, curhour, curminute, cursecond As Stringcurmonth = IIf(Month(curTime) < 10, "0" & Month(curTime), Month(curTime))curday = IIf(Day(curTime) < 10, "0" & Day(curTime), Day(curTime))curhour = IIf(Hour(curTime) < 10, "0" & Hour(curTime), Hour(curTime))curminute = IIf(Minute(curTime) < 10, "0" & Minute(curTime), Minute(curTime)) cursecond = IIf(Second(curTime) < 10, "0" & Second(curTime), Second(curTime)) user.strEndTime.CurrentV alue = Year(curTime) & "-" & curmonth & "-" & curday & " " _& curhour & ":" & curminute & ":" & cursecondEnd Sub'打印此前10分钟历史报表,只是设置时间值,打印仍要调用打印程序Private Sub CommandButton3_Click()Dim curTime As StringcurTime = NowDim curmonth, curday, curhour, curminute, cursecond As Stringcurmonth = IIf(Month(curTime) < 10, "0" & Month(curTime), Month(curTime))curday = IIf(Day(curTime) < 10, "0" & Day(curTime), Day(curTime))curhour = IIf(Hour(curTime) < 10, "0" & Hour(curTime), Hour(curTime))curminute = IIf(Minute(DateAdd("n", -10, curTime)) < 10, "0" & _Minute(DateAdd("n", -10, curTime)), Minute(DateAdd("n", -10, curTime))) cursecond = IIf(Second(curTime) < 10, "0" & Second(curTime), Second(curTime)) user.strStartTime.CurrentValue = Year(curTime) & "-" & curmonth & "-" & curday & _" " & curhour & ":" & curminute & ":" & cursecond curminute = IIf(Minute(curTime) < 10, "0" & Minute(curTime), Minute(curTime)) user.strEndTime.CurrentV alue = Year(curTime) & "-" & curmonth & "-" & curday & _" " & curhour & ":" & curminute & ":" & cursecond End Sub'打印当天报表,只是设置时间值,打印仍要调用打印程序Private Sub CommandButton4_Click()Dim curTime As StringcurTime = NowDim curmonth, curday, curhour, curminute, cursecond As Stringcurmonth = IIf(Month(curTime) < 10, "0" & Month(curTime), Month(curTime))curday = IIf(Day(curTime) < 10, "0" & Day(curTime), Day(curTime))user.strStartTime.CurrentValue = Year(curTime) & "-" & curmonth & "-" & curday _& " " & "00:00:00"user.strEndTime.CurrentV alue = Year(curTime) & "-" & curmonth & "-" & curday _& " " & "23:59:59"End Sub'打印当月报表,只是设置时间值,打印仍要调用打印程序Private Sub CommandButton5_Click()Dim curTime As StringcurTime = NowDim curmonth, BeginofMonth, EndofMonth As Stringcurmonth = IIf(Month(curTime) < 10, "0" & Month(curTime), Month(curTime)) BeginofMonth = Year(curTime) & "-" & curmonth & "-01" & " " & "00:00:00"user.strStartTime.CurrentValue = BeginofMonthEndofMonth = Day(DateAdd("s", -1, DateAdd("m", 1, CDate(BeginofMonth))))user.strEndTime.CurrentV alue = Year(curTime) & "-" & curmonth & "-" _& EndofMonth & " " & "23:59:59"End Sub‘根据输入条件,保存/打印报表到文件Private Sub CommandButton6_Click()'运行EXCEL,打开报表模板文件Dim msexcel As Excel.ApplicationSet msexcel = CreateObject("Excel.Application")With msexcel.Visible = True ‘如为FALSE,则不显示EXCEL。
写IFIX实时数据到ExcelDescription 描述Inserting FIX Dynamics data into an Excel worksheet.把FIX数据写入EXCEL工作表ResolutionThe following procedure will enable you to insert FIX Dynamics data into an Excel worksheet: 下面的程序可以让你把FIX数据写到EXCEL工作表中' Declare necessary API routines: 定义必要的APIPrivate Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As Long) As LongPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongSub DetectExcel()' Procedure dectects a running Excel and registers it.生成运行一EXCEL工作表并保存之Const WM_USER = 1024Dim hwnd As Long' If Excel is running this API call returns its handle.如果Excel运行这个API调用返回其句柄,hwnd = FindWindow("XLMAIN", 0)If hwnd = 0 Then ' 0 means Excel not running.0表示EXCEL没有运行Exit SubElse' Excel is running so use the SendMessage API function to enter it in the Running Object Table. EXCEL运行就用API的SendMessage功能发送到运行的工作表中SendMessage hwnd, WM_USER + 18, 0, 0End IfEnd SubPrivate Sub CommandButton2_Click()Dim msexcel As Excel.ApplicationSet msexcel = CreateObject("Excel.Application")With msexcel.Visible = True.Workbooks.Open "d:\fix32\Test1.xls", , FalseEnd WithEnd SubPrivate Sub CommandButton3_Click()Dim MyXL As Object ' Variable to hold reference to Microsoft Excel.Dim ExcelWasNotRunning As Boolean ' Flag for final release.' Test to see if there is a copy of Microsoft Excel already running.On Error Resume Next ' Defer error trapping.' Getobject function called without the first argument returns a reference to an instance of the application. If the application isn't running, an error occurs. Note the comma used as the first argument placeholder.Set MyXL = GetObject(, "Excel.Application")If Err.Number <> 0 Then ExcelWasNotRunning = TrueErr.Clear ' Clear Err object in case error occurred.' Check for Excel. If Excel is running,enter it into the Running Object table.DetectExcel'Set the object variable to reference the file you want to see.Set MyXL = GetObject("d:\fix32\test1.XLS")' Show Microsoft Excel through its Application property. Then show the actual window containing the file using the Windows collection of the MyXL object reference.MyXL.Application.Visible = TrueMyXL.Parent.Windows(1).Visible = True' Do manipulations of your file here.With MyXL.Application.ActiveWorkbook.ActiveSheet.Select.Goto reference:=.Range("D4").Selection = Fix32.Johnski2.AI1.F_CVEnd With' If this copy of Microsoft Excel was not already running when you started, close it using the Application property's Quit method. Note that when you try to quit Microsoft Excel, the Microsoft Excel title bar blinks and Microsoft Excel displays a message asking if you want to save any loaded files.If ExcelWasNotRunning = True ThenMyXL.Application.QuitEnd IfSet MyXL = Nothing ' Release reference to the application and spreadsheet.End Sub。
iFIX图文教程版本V0.01更新时间:2020年3月26日目录前言 (4)几点说明 (5)本教程软件需求 (5)软件对系统要求 (5)软件限制的说明 (5)软件原理说明 (5)软件安装 (6)iFIX安装 (6)IGS驱动安装 (12)Historian数据库安装 (18)一个简单的入门示例 (23)准备工作 (23)VSPD虚拟串口安装 (23)Modbus从站模拟软件安装 (26)Modbus从站模拟软件安装(2) (28)搭建下位机测试 (29)建立通讯 (35)添加标签 (51)创建画面 (59)系统运行 (64)iFIX与S7200的通讯 (65)S7200程序 (65)iFIX程序 (66)iFIX与TwinCAT2通讯 (73)iFIX创建新的项目 (78)过程数据库(PDB数据库) (88)过程数据库的数据类型(未完成) (92)语言切换 (92)标签组 (98)定时器控件 (105)VisiconX控件的使用 (107)vxData对象 (107)VBA 数据类型 (118)VBA 过程 (118)VBA 类与实例 (119)创建类 (119)创建实例 (124)Application的事件 (128)VBA 单链表 (130)使用Excel获取Historian中的数据 (136)VB数据结构(仅供参考,非完整实现) (139)一个特殊的类 (139)单向链表 (140)树形结构 (141)具体问题解答 (141)iFIX访问其它页面的控件? (141)修改磁盘空间需求保证iFIX稳定 (142)退出iFIX系统代码 (142)iFIX颜色设定 (142)曲线的显示与隐藏 (144)时间获取,精确到毫秒 (145)SQLServer数据库读写 (146)VB防止添加重复项到列表中 (147)Like用法 (147)修改磁盘空间需求保证iFIX稳定 (148)frm界面访问grf界面中的变量和对象 (148)获取用户名和组名的方法(调度的后台执行) (151)获取用户名和组名的方法(属性) (152)参考 (154)教程更新 (154)前言最近在编写软件设计文档,我们使用的是iFIX,iFIX的优势应该是扩展性最好,主要是因为它采用了微软的VBA脚本,同时也带来一些问题,如不容易上手和掌握,另外与之配套的教程也特别少,使用的过程中遇到了一些麻烦,做了一些总结,把这些总结整理了一下,希望能让更多的人入门。
Excel处理SQL数据库教程我们可以用Excel来处理SQl数据库,这样可以加快开发步伐。
Excel 有很强的显示效果,打印控制也比较简单,是计算机上必备的软件。
我们通过下面的步骤,一步步的学习如何通过Excel来控制和开发简单的程序。
作为一个入门的教程,力求从最简单的步骤开始。
学习本教程要求已经具备了比较初步的vba编程经验。
步骤一:打开Excel后,进入microsoft visual basic 编辑器(ALT+F11)步骤二:引用ADO。
方法是在vb编辑器中点击菜单栏中的“工具”菜单——“引用”,找到这项,勾选上。
我们对于数据库的操作基本最基本的操作就是“增加”,“删除”,“查询”等操作。
以下我们通过实例来说明。
1、如何向数据库增加记录以下代码中红色底纹部分文字是你需要修改的,比如这里的jszxfwq就是sql服务器名,database就是要进行处理的数据库名,本例是hszx;uid是登陆的用户名,这里是sa,pwd是登陆的密码,这里是空。
例子引用的表a只有两个字段,分别是a(文本类型),b(整数类型)Sub 增加记录()'首先是建立连接Dim cn As New ADODB.ConnectionDim strCn As String, sqlins As String ‘Dim rs As New ADODB.RecordsetstrCn = "Provider=sqloledb;Server=jszxfwq;Database=hszx;Uid=sa;Pwd=;"cn.Open strCn‘通过以上步骤就建立了一个连接,有了这个连接,表示你机器上的excel就连接上了sql所在的服务器,可以对hszx数据库进行操作了。
sqlins=”insert into a(a,b) values(‘hoo’,2)”cn.Execute sqlinsset cn=NothingEnd Sub运算结果如下进一步的,如果我们使用循环,就可以将电子表格中的数据导入到SQl数据库中。
第一部分数据存储[1] 运行iFix演示程序,添加数字量输出块(DO)DataLogTrig、DataLogEnable。
[2] 工作台开发环境中新建画面DataLog,右键点击选择编辑脚本添加程序:Fix32.Fix.DataLogEnabled.F_CV = 1[3] 菜单中选择插入〉OLE对象,对象类型列表中选择hmiReportDataLog.CtrlX插入到换面中,点击控件右键菜单中选择动画〉配置〉杂项,将控件的属性DataLogEnabled链接数据块 DATALOGENABLED ,属性DataLogTrig 链接数据块 DATALOGTRIG,数据转换选择”对象”。
可将控件参数TagValue001- TagValue120链接模拟量数据块的实时值(Fix32.FIX.IFIX1_BATCH_BULKFLOW.F_CV)作为采样点,控件参数TagDesc001- TagDesc120链接模拟量数据块的描述信息(Fix32.FIX.IFIX1_BATCH_BULKFLOW.A_DESC),数据块的描述信息不能为空,不能以数字开头,不能包含运算符号。
[4] 点击控件右键菜单中选择属性,将控件属性DataLogInterval设为1-7的整数值将控制控件的采样周期为5秒钟至1小时,设为8时停止自动采样。
画面中添加一个按钮[触发手动存储]按钮,按下时将数据块DATALOGTRIG 置1,释放时置0。
[5] 保存画面并切换至运行状态,选中[显示数据]可见设置的数据点名称和iFix传入的变量数据,按控件中[创建数据表]按钮,再按[存储数据]按钮,可在数据库中建立一个名为hmiDataLog的数据表并存储一行数据。
自动状态下控件按照选定的采样周期存储数据。
画面中按[触发手动存储]按钮触发一次数据存储,可实现由外部状态控制数据存储。
[6] 报表软件程序组中打开“数据检索”工具,选择数据表名hmiDataLog,可选字段中选择时标字段TSTAMP 和其它的数据点字段,按[数据检索]按钮可从数据库查询出已存入的历史数据。
2019.08摘There are many ways to realize the iFIX report This paper takes the combination of Excel and iFIX local da tabase as an example to illustrate the realization of the method It extracts data from iFIX through VBA script presents the da ta orderly in Excel table and achieves the purpose of report function Key words iFIX 方法namics Historical Data FIX Dynamics Real Time Da ”。
Real Time 方法通过脚本将数据存储到外部数据库),tion iFIX Inte gration Toolkit (。
(。
(。
(。
(。
(。
(Private Sub CommandButton1_Click ()Dim path As String *64Const tagnum =16path ="D:\XXXX\HTRDATA"TagNum1=tagnum \8TagNum2=tagnum Mod 8NTFTAG (0)="THISNODE"+":"+"TAG1"+"."+"F_CV"NTFTAG (1)="THISNODE"+":"+"TAG2"+"."+"F_CV"…NTFTAG (n-1)="THISNODE"+":"+"TAGn"+"."+"F_CV"sdate =Trim (InputBox ("输入报表时间:YYYY-MM-DD","选择时间",Date ))If sdate>""Then If IsDate (sdate )ThenSheet1.Range (Cells (4,1),Cells (2000,tag⁃num +1))=""Sheet1.Range (Cells (4,1),Cells (2000,tag⁃num +1)).Borders.LineStyle =xlNone Sheet1.Cells (1,1)=Format (sdate,"yyyy 年mm 月dd 日运行记录")For num =0To TagNum1If num =TagNum1Then kkkk =TagNum2-1Else kkkk =7End IfFor k =0To kkkk ntf =NTFTAG (num *8+k )Next kFor k =0To kkkk ReDim values (NumSamples )ReDim times (NumSamples )ReDim Stats (NumSamples )ReDim alarms (NumSamples )For i =0To NumSamples -1Sheet1.Cells (i +4,1)=SecondsToTime$(times (i ))If Stats (i )=0ThenSheet1.Cells (i +4,num *8+k +2)=values (i )ElseSheet1.Cells (i +4,num *8+k +2)=""End If Next i Next k Next num ·Sheet1.Range (Cells (4,1),Cells (3+NumSam⁃ples,tagnum +1)).Borders.LineStyle =1ElseMsgBox "错误的日期!"End If End If End Sub(下转第290页)2882019.08们表达自己的看法和感受到他人的想法;(;(3多中心理论应用到公共环境治理中在强调不同社会群体的多中心参与的同时如果说公地悲剧的产生是源于公共池塘资源的不可排他库iFIX 参考文献Proficy HMI/SCADA -iFIX GE Intelligent Plat [3]《iFIX 数据库参考书》,GE Intelligent Platforms ,Inc ,2013.(上接第288页)290。
Excel处理SQL数据库教程(二)接着写1)用编程的方式向excel中导入数据这个时候就要使用到了recordset这个东东了,Sub 显示数据()…建立一个连接Dim cn As New ADODB.ConnectionDim strCn As StringDim strCom As StringDim rs As New ADODB.RecordsetDim i …i是行号strCn = "Provider=sqloledb;Server=jszxfwq;Database=hszx;Uid=sa;Pwd=;"cn.Open strCn…连接建立完了以后将查询的结果产生一个数据集strCom=”select * from a”rs.Open strCom, cn…读取这个数据集i=1Do While Not rs.EOFSheets(“测试”).Cells(i,1).value=rs(“a”) …注意这里的字段名a可是加了引号的了Sheets(“测试”).Cells(i,2).value=rs(“b”)i=i+1rs.MoveNextLoopSet rs = Nothingcn.CloseEnd Sub在数据库中的内容如图在电子表格中的内容如下,注意这个工作表的名称你要自己改为”测试”2)同样用编程的方法还有不用数据集的方法,而是用代码使用查询,将结果返回到工作表中。
其实只要录制一个宏就可以了,以下是我对录制的宏进行的更改,只要你更改很少的部分就可以直接使用了。
Sub 用查询的方法显示数据()With ActiveSheet.QueryTables.Add(Connection:= _"ODBC;DRIVER=SQL Server;SERVER=JSZXFWQ;UID=sa;PWD=;APP=Microsoft Office XP;WSID=ZJTRUEKING;DATABASE=hszx" _, Destination:=Sheets("测试").Range("A1")) …这个A1表示的导入数据的开始位置.CommandText = Array("SELECT a,b from a") …写sql语句了,最简单的还是要学学的。
IFIX连接SQL读写数据和制作excel报表图文教程IFIX连接SQL数据库、制作excel报表详细教程一、 IFIX连接SQL数据库读写数据IFIX连接SQL数据库有多种方法,其中最为方便的两种方法是:(1)使用IFIX本身为SQL数据库提供的接口SQT和SQD;(2)VB+ADO。
下面分别介绍着两种方法的实现步骤。
1、使用SQT和SQD读写SQL数据库1.1 安装SQL2008(只列出关键步骤,其余直接点击“下一步”或“安装”) 打开SQL安装中心,点击“安装”;SQL2008简体中文版安装包下载链接:点击“全新SQL Server独立安装或向现有安装添加功能”;点击“输入产品密匙”,点击“下一步”:(根据版本选择)sql server2008密钥Developer: PTTFM-X467G-P7RH2-3Q6CG-4DMYBEnterprise: JD8Y6-HQG69-P9H84-XDTPG-34MBBMicrosoft SQL Server 2008 R2序列号密钥开发版32位:MC46H-JQR3C-2JRHY-XYRKY-QWPVM开发版64位:FTMGC-B2J97-PJ4QG-V84YB-MTXX8工组版:XQ4CB-VK9P3-4WYYH-4HQX3-K2R6QWEB版:FP4P7-YKG22-WGRVK-MKGMX-V9MTM数据中心版32位:PTTFM-X467G-P7RH2-3Q6CG-4DMYB数据中心版64位:DDT3B-8W62X-P9JD6-8MX7M-HWK38企业版32位:R88PF-GMCFT-KM2KR-4R7GB-43K4B企业版64位:GYF3T-H2V88-GRPPH-HWRJP-QRTYB标准版32位:CXTFT-74V4Y-9D48T-2DMFW-TX7CY标准版64位:B68Q6-KK2R7-89WGB-6Q9KR-QHFDW功能选择界面,选择安装全部功能,点击“下一步”;进入实例配置界面,选择默认实例,点击“下一步”;进入服务器配置界面,启动类型均选为“自动”;点击“对所有SQL Server服务使用相同的账户”,在弹出的界面中选择第一个账户,密码不用填;返回服务器配置界面点击下一步;进入数据库引擎配置界面,选择混合模式,输入自己设定的密码,点击“添加当前用户”,点击下一步,直至安装完成,关闭安装中心。
1.2 进入SQL server新建SQL登录名和数据库打开SQL,以Windows身份验证登录;连接完后,点击“安全性”-“登录名”,右击选择“新建登录名”:在弹出的界面中,点击左上角的“常规”,输入登录名、密码,不要勾选强制密码过期,之后点击左上角“服务器角色”;在弹出的界面中,根据需要勾选所需权限,这里全部勾选,再点击“用户映射”;在弹出的界面中,“映射到此登录名的用户”内勾选所有数据库,并在每个数据库的“数据库角色成员身份”中勾选db_owner和public,而后点击“确定”,完成新建登录名。
完成登录名创建后,断开当前连接或是退出SQL重新进入软件,以SQL身份验证登录,输入刚刚新建的登录名,点击“连接”;连接后,右击“数据库”,选择“新建数据库”,以默认配置完成新建,如这里新建数据库,取名为db1。
进入db1,新建三张表,新建右击“表”,选择“新建表”,输入如下图的列名及数据类型;点击保存,输入表名为sqllib,用于保存SQL命令;新建第二张表,列名及数据类型如下图,取名为sqlerr,用于保存各类错误: 新建第三张表,用于保存需要的工业历史数据,这里将表取名为data,添加两个列COL1和COL2,数据类型都为float。
接下来为sqllib表添加SQL命令,这里添加一条向data表的COL1、COL2写入数据的语句,右击“abo.sqllib”,选择“编辑前200行”;写入如下图的内容,点击保存。
注:如果要读取数据库内的数据,只要将该SQL命令换成相应的select语句。
1.3 创建ODBC数据源打开控制面板,依次点击“管理工具”-“数据源(ODBC)”,进入如下界面: 在点击“系统DSN”-点击“添加”按钮,在如下界面中选择“SQL Server”,点击“完成”。
在以下界面中填写名称命名数据源,服务器填写自己的计算机名(获取计算机名按照如下步骤:右击桌面的“计算机”-选择“属性”,在弹出的界面上就可以看到),点击“下一步”;按照下图配置,填入刚刚在SQL中新建的登陆名和密码,点击下一步;勾选“更改默认的数据库为”,在下拉框中选择刚刚新建的数据库名,点击下一步;直接点击“完成”按钮。
之后你可以在弹出的界面中点击“测试数据源”,若测试成功,则可以进入下一步骤。
1.4 在SCU内配置SQL打开IFIX,点击“SCU”,进入配置界面;在如下界面中点击“配置”-选择“SQL”,在弹出的界面中点击“增加”按钮,填入相应信息,点击“确定”。
选中刚刚添加的SQL账户,点击“配置SQL任务”;启用SQL支持,选择我们所创建的数据库ID,点击“确定”,完成配置。
1.5 在IFIX内创建SQT和SQD数据块打开IFIX的数据库管理器,创建数字量输入数据块DI1,当DI1的值发生变化时就触发SQT(当然也可以采用时间事件来触发SQT,下面也会有介绍),点击界面内的“高级”标签。
进入高级标签,勾选“启用输出”和“手动”;一般要保存到关系数据库的历史数据都是模拟量,因此本教程以模拟量为例子,将其存入SQL数据库。
创建模拟量寄存器数据块AR_1和AR_2: 创建数据块SQT,在数据库管理器中新建数据块,选择SQT类型,如下图;进入如下的界面,若要采用DI1数值变化来触发SQT,则如下图填写信息。
在刚刚创建的db1数据库中,我们建立了sqllib表,并在表内添加了sqlname为cmd1,sqlcmd为“Insert into data??”这条语句。
在如下界面中,SQL名填写“cmd1”,数据库ID填写“db1”(所建ODBC数据源名称),事件标签写入“DI1.F_CV”,事件类型勾选“值变化”,这样,当DI1的值变化时,SQT就会触发,找到db1数据库下的sqllib表内sqlname等于cmd1的这条语句,并执行。
在上图中的“下一块”中填写SQD_1,构成数据链,此时会弹出如下界面,点击“yes”;创建SQD数据块,如下图填写,因为是向数据库添加数据,所以方向选为OUT。
保存数据库管理器。
这样,就建立了一个DI1值变化触发的SQT和SQD。
如果我们希望以时间事件来触发SQT,应在建立SQT数据块的时候,设置触发时间,其余步骤相同。
例如,我们希望每天晚上23:00至23:59这段时间内,每5分钟记录一次数据到SQL数据库,建立SQT数据块时应如下图填写: 在IFIX主界面点“应用程序”,打开“任务控制”;验证SQL服务是否启动,如下图所示说明注册成功。
作进一步验证,在数据库管理器内更改DI1 的当前值,如将CLOSE 改为OPEN, 按 Ctrl + R, 观察到SQT_1 的当前值增加1,意味着SQT 被触发一次,打开SQL也可以发现data表增加了一行记录。
以上就是使用SQT和SQD读写SQL数据库的详细步骤。
2、使用ADO访问数据库2.1 定时向数据库添加记录首先,参照1.1-1.3的内容建立数据库(只需建立data表,sqllib和sqlerr不需创建),创建ODBC数据源。
打开IFIX,双击下图左下角的“数据定时写”,新建基于时间项;假设我们要在每晚23:00自动存数据,则如下图设置:点击“VB编辑器”,写入如下代码:填上代码后,一定要选择如下图这一步:点击“工具”-“引用”,在下图界面中,勾上microsoft activex data objects 2.1 library,否则会报错。
确定后保存。
右键点击FIXTIME8这一条,选择“调度程序属性”,在如下画面中选择“后台运行”,点确定;在后续弹出的窗口中都选择“是”,直至完成,fixtimer8激活,时间一到,程序就会自动添加记录。
2.2从数据库读数据从数据库读数据一般采用按钮触发,可以在ifix里新建一个画面,添加一个按钮,在按钮的脚本里添加代码,最后记得引用microsoft activex data objects 2.1 library。
代码基本和2.1相同,只是把相应的insert命令换成select语句。
二、 IFIX制作excel报表1、在建好数据库和数据源(参照1.1-1.3)后,新建一个ifix画面,添加一个ole对象,选择“Microsoft Web Browser”,用来显示报表;2、新建一张excel报表模板,放到工程目录的APP文件夹下,如“人工数据日报表.xls”;3、新建一个按钮,为其编写脚本,粘贴如下代码(覆盖新建画面原有的代码):Option ExplicitDim a As Single ‘定义中间变量,用来暂存从数据库中取出的数据 Dim bAs SingleDim rsADO As ADODB.Recordset ‘定义连接数据库的ADO变量Dim conn As New ADODB.ConnectionPublic CmdTruck As New mandPublic dbUpdata As New mandPublic rstUpdata As New RecordsetPrivate Sub CommandButton3_Click() ‘点击按钮的响应函数Call showbb ‘调用显示报表的函数showbbCall closeDB1 ‘调用关闭数据库的函数closeDB1End SubPrivate Sub showbb()Dim Rs As New ADODB.Recordset '定义连接数据库的ADO变量openDB1 ‘打开DB1数据库,该函数在后面有定义CmdTruck.ActiveConnection= connmandText = "select max(COL1) as COL1,max(COL2) as COL2 from data" ‘从data表读取COL1和COL2的最大值Set Rs = CmdTruck.Execute ‘执行SQL语句a = 0b = 0If Not (Rs.BOF Or Rs.EOF) Then ‘将读出来的数据传给中间变量a、b If (Rs!col1) Thena = Rs!col1b = Rs!col2End IfEnd IfDim xlApp As Object '定义报表对象Dim xlBook As ObjectDim xlSheet As ObjectOn Error GoTo errorhandleSet xlApp = New Excel.ApplicationSet xlBook = xlApp.Workbooks.Open(System.ProjectPath & "\app\人工数据日报表.xls") ‘打开报表模板 Set xlSheet =xlBook.Worksheets(1)xlApp.DisplayAlerts = False '警告禁用xlApp.Visible = False 'EXCEL隐藏xlSheet.Cells(10, 4) = a & "" ‘将中间变量的值写到对应excel的单元格 xlSheet.Cells(11, 4) = b& ""xlSheet.SaveAs System.ProjectPath & "\app\人工数据日报表.htm", FileFormat:=xlHtml '工作表另存为xlApp.DisplayAlerts = True '警告使能xlApp.QuitMe.WebBrowser1.Navigate System.ProjectPath & "\app\人工数据日报表.htm" ‘在WebBrowser控件上显示报表 xlApp.QuitSet xlSheet = Nothing'释放内存Set xlBook = NothingSet xlApp = NothingSet CmdTruck = NothingSet Rs = NothingExit Suberrorhandle:MsgBox "报表生成错误~", vbOKOnly + vbInformation, "信息..."Set xlSheet = Nothing'释放内存Set xlBook = NothingSet xlApp = NothingEnd SubPublic Sub openDB1() '定义打开数据库的函数openDB1If conn.State <> adStateOpen ThenWith conn.ConnectionString = "Provider=SQLOLEDB;server=2C68LK83W2F62AZ;database=db1; uid=operation; pwd=123456;" ‘连接数据源的相关信息.Mode = adModeReadWrite.OpenEnd WithEnd IfEnd SubPublic Sub closeDB1() '定义关闭数据库的函数closeDB1If conn.State = adStateOpen Thenconn.CloseEnd IfEnd Sub4、添加代码后点击“工具”-“引用”,在下图界面中,勾上microsoftactivex data objects2.1 library和Microsoft excel 12.0 object library,否则会报错。