使用脚本访问iFIX数据库的几种方法 - 整理

今天分享几种使用脚本访问iFIX数据的方法。

使用过iFIX的朋友都知道,有时要实现某些功能,需要在脚本里处理如何读写数据库标签数值问题。大家可能常用的就是使用"="号了,或者使用"WriteValue"和"ReadValue"子程序。在这除了以上两种方式外,另外分享使用"FindObject方法"和"FixDataSystem对象"这两种方法。

1、使用Fix32对象读写数据库标签数值(也就是使用"="号)

脚本相对简单,不做详细说明,主要说些使用注意事项。

  •     做好错误处理跳转的原因:

        当出现iFIX与PLC通讯中断(数值为:????)、客户端与服务器通讯中断(数值为:@@@@)等此类情况时,软件会弹出错误,还有可能跳转到脚本编辑窗口,如图所示。

iFIX与PLC通讯中断(数值为:????)情况:

  

客户端与服务器通讯中断(数值为:@@@@)情况:

      

对于熟悉iFIX软件的工程师来说当然知道应该如何处理,但对于一般操作员来说任何错误弹窗(特别是跳转到脚本窗口)将会无法应对。

  • 错误处理

第一种处理方式:当发生错误时直接跳出;

Private Sub CommandButton1_Click()
On Error GoTo ErrorHandler
    Fix32.fix1.TAG_12.F_CV = 1
Exit Sub
ErrorHandler:  
End Sub

第二种处理方式:当发生错误时跳转到自定义错误提示窗口,告知操作员,但此窗口不会跳转到脚本编辑窗口:

Private Sub CommandButton1_Click()
On Error GoTo ErrorHandler
    Fix32.fix1.TAG_12.F_CV = 1
Exit Sub
ErrorHandler:
    MsgBox "Error " + Str(Err.Number) + " has occurred" + Chr(10) + Chr(13) + Err.Description + Chr(10) + Chr(13) + Chr(10) + Chr(13) + "请联系工程师处理!!!", vbCritical
End Sub

2、使用"WriteValue"和"ReadValue"子程序

与第一种方法一样需要做错误处理,下面提供一个简单例子参考:

WriteValue

Private Sub CommandButton3_Click()
On Error GoTo ErrorHandler
    WriteValue 1, "Fix32.Liang.TAG_12.F_CV", 1
Exit Sub
ErrorHandler:
    MsgBox "Error " + Str(Err.Number) + " has occurred" + Chr(10) + Chr(13) + Err.Description + Chr(10) + Chr(13) + Chr(10) + Chr(13) + "请联系工程师处理!!!", vbCritical
End Sub

自定义错误提示窗口:

ReadValue

Private Sub CommandButton5_Click()
On Error GoTo ErrorHandler
    Dim X As Single
    X = ReadValue("Fix32.Liang.TAG_12.F_CV", 1)
Exit Sub
ErrorHandler:
    MsgBox "Error " + Str(Err.Number) + " has occurred" + Chr(10) + Chr(13) + Err.Description + Chr(10) + Chr(13) + Chr(10) + Chr(13) + "请联系工程师处理!!!", vbCritical
End Sub

自定义错误提示窗口:

3、使用"FindObject"方法

Private Sub CommandButton7_Click()
On Error GoTo ErrorHandler
    Dim AI1 As Object
    Dim X As Single
    
    Set AI1 = System.FindObject("Fix32.Liang.TAG_12.F_CV")
    '读
    X = AI1
    '写
    AI1 = 1
    
Exit Sub
ErrorHandler:
    MsgBox "Error " + Str(Err.Number) + " has occurred" + Chr(10) + Chr(13) + Err.Description + Chr(10) + Chr(13) + Chr(10) + Chr(13) + "请联系工程师处理!!!", vbCritical
End Sub

4、使用"FixDataSystem"对象

Private Sub CommandButton8_Click()
    '创建 FixDataSystems OCX 对象
    
    Dim FDS As Object
    Dim Y As Single
    Dim Y1 As Single
    Set FDS = CreateObject("FixDataSystems.Intellution FD Data System Control")
    
    '添加组
    FDS.groups.Add ("DataGroup1")
    FDS.groups.Add ("DataGroup2")
    
    '为各个组添加iFIX标签,每一组可多个标签
    
    FDS.groups.Item("DataGroup1").dataitems.Add ("Fix32.Liang.TAG_12.F_CV")
    FDS.groups.Item("DataGroup2").dataitems.Add ("Fix32.Liang.TAG_13.F_CV")
    
'读==============================================================================
    '读取组内标签的数值
    FDS.groups.Item("DataGroup1").Read
    FDS.groups.Item("DataGroup2").Read
    
    '将读取到的标签数值,赋值给变量
    Y = FDS.groups.Item("DataGroup1").dataitems.Item(1).Value
    Y1 = FDS.groups.Item("DataGroup2").dataitems.Item(1).Value
    
'写==============================================================================
    '将变量数值传给每个组内对应的标签(在缓存中)
    FDS.groups.Item("DataGroup1").dataitems.Item(1).Value = Y1
    FDS.groups.Item("DataGroup2").dataitems.Item(1).Value = Y
    
    '将传给每个组内对应的标签的数值写到标签
    FDS.groups.Item("DataGroup1").Write
    FDS.groups.Item("DataGroup2").Write
    
    '释放对象
    Set FDS = Nothing
    
End Sub

注意:如果在读写前没有判断数据通讯状态是否正常(即:与PLC通讯状态、或者客户端与服务器通讯状态),则"FixDataSystems"将默认读写到有数值将为"0",这是不正常现象。

  • 添加判断与PLC通讯状态脚本处理:
Private Sub CommandButton8_Click()
    '创建 FixDataSystems OCX 对象
    
    Dim FDS As Object
    Dim Y As Single
    Dim Y1 As Single
    
    '判断与PLC的通讯状态
    If Fix32.liang.TAG_12.A_CUALM <> "COMM    " Then
    
    Set FDS = CreateObject("FixDataSystems.Intellution FD Data System Control")
    
    '添加组
    FDS.groups.Add ("DataGroup1")
    FDS.groups.Add ("DataGroup2")
    
    '为各个组添加iFIX标签,每一组可多个标签
    
    FDS.groups.Item("DataGroup1").dataitems.Add ("Fix32.Liang.TAG_12.F_CV")
    FDS.groups.Item("DataGroup2").dataitems.Add ("Fix32.Liang.TAG_13.F_CV")
    
'读==================================================================================================================
    '读取组内标签的数值
    FDS.groups.Item("DataGroup1").Read
    FDS.groups.Item("DataGroup2").Read
    
    '将读取到的标签数值,赋值给变量
    Y = FDS.groups.Item("DataGroup1").dataitems.Item(1).Value
    Y1 = FDS.groups.Item("DataGroup2").dataitems.Item(1).Value
    
'写==================================================================================================================
    '将变量数值传给每个组内对应的标签(在缓存中)
    FDS.groups.Item("DataGroup1").dataitems.Item(1).Value = Y1
    FDS.groups.Item("DataGroup2").dataitems.Item(1).Value = Y
    
    '将传给每个组内对应的标签的数值写到标签
    FDS.groups.Item("DataGroup1").Write
    FDS.groups.Item("DataGroup2").Write
    
    '释放对象
    Set FDS = Nothing
    
    End If
End Sub

添加判断客户端与服务器通讯状态脚本处理:

Private Sub CommandButton8_Click()
    '创建 FixDataSystems OCX 对象
    
    Dim FDS As Object
    Dim Y As Single
    Dim Y1 As Single
    
    '判断客户端与服务器的通讯状态
    If Fix32.liang.NSD.A_ACONNREASON_1 <> "已建立 " Then
    
    Set FDS = CreateObject("FixDataSystems.Intellution FD Data System Control")
    
    '添加组
    FDS.groups.Add ("DataGroup1")
    FDS.groups.Add ("DataGroup2")
    
    '为各个组添加iFIX标签,每一组可多个标签
    
    FDS.groups.Item("DataGroup1").dataitems.Add ("Fix32.Liang.TAG_12.F_CV")
    FDS.groups.Item("DataGroup2").dataitems.Add ("Fix32.Liang.TAG_13.F_CV")
    
'读==================================================================================================================
    '读取组内标签的数值
    FDS.groups.Item("DataGroup1").Read
    FDS.groups.Item("DataGroup2").Read
    
    '将读取到的标签数值,赋值给变量
    Y = FDS.groups.Item("DataGroup1").dataitems.Item(1).Value
    Y1 = FDS.groups.Item("DataGroup2").dataitems.Item(1).Value
    
'写==================================================================================================================
    '将变量数值传给每个组内对应的标签(在缓存中)
    FDS.groups.Item("DataGroup1").dataitems.Item(1).Value = Y1
    FDS.groups.Item("DataGroup2").dataitems.Item(1).Value = Y
    
    '将传给每个组内对应的标签的数值写到标签
    FDS.groups.Item("DataGroup1").Write
    FDS.groups.Item("DataGroup2").Write
    
    '释放对象
    Set FDS = Nothing
    
    End If
End Sub

5、总结(摘自iFIX电子书)

第一:使用FIX32对象这个方法简单容易,但从性能来说它会占用较多的资源。每次执行一行使用Fix32对象的代码提取或设置数值时,iFIX工作台将做如下4步工作:

        ①声明一个新的数据项; 
        ②确认该数据项;
        ③读/写数值; 
        ④释放对象。

如果访问的是远程节点标签,可能会更慢。

第二:使用"FindObject"方法要比使用Fix32对象访问速度快,因为该对象只当FindObject执行和返回一个数据项时做自身验证。只要该变量没被释放或没被赋给新的对象,就能被读取和写入,而无需工作台重新验证。

第三:使用"FixDataSystem"对象,配置起来相对复杂。但这是最有效访问数据库的方法。该方法要比使用FindObject方法速度快,因为数据项都以组的形式读取和写入。换言之,当执行FixDataSystem对象组的读取方法时,它将在一次调用中读取所有添加的标签。当从数据项集内提取数据项值时,它实际上是从缓存区中读取的,而不是从数据库中请求数据。如果连续读取或写入大量标签,应该考虑使用FixDataSystem对象。

 

个人建议:

①标签数量只有几个时,使用"WriteValue"和"ReadValue"子程序方法;

②标签数量大时,使用"FixDataSystem"对象方法。

 

 

 

 

 

 

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IFIX是一种常用的组态软件,用于监控和控制工业过程。它提供了一个可视化界面,使用户能够实时监测和操作各种设备和系统。语音报警是IFIX中的一个功能,可以通过语音方式向操作员发送报警信息。 在IFIX中实现语音报警的代码主要包括以下几个步骤: 1. 配置语音报警设备:首先需要将语音报警设备与IFIX系统进行连接。这可以通过配置设备的通信参数,如IP地址、端口号等来实现。 2. 创建报警标签:在IFIX中,需要为每个需要进行语音报警的变量或状态创建一个对应的报警标签。这可以通过在IFIX的标签库中创建一个新的标签,并设置其相关属性,如名称、数据类型、报警条件等。 3. 设置报警条件:针对每个报警标签,需要设置相应的报警条件。这可以通过在IFIX的报警设置界面中,选择对应的标签,并设置其报警条件,如上限、下限、变化率等。 4. 编写报警脚本:为了实现语音报警功能,需要编写相应的脚本代码。这可以通过使用IFIX提供的脚本编辑器,编写一段脚本代码来实现。在脚本中,可以通过判断报警标签的状态,触发语音报警设备进行报警。 5. 配置语音报警设备参数:最后,需要配置语音报警设备的相关参数,如报警音频文件、音量、播放方式等。这可以通过在IFIX的配置界面中,选择对应的设备,并设置其相关参数来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值