当前位置:文档之家› IFIX经验总结

IFIX经验总结


/////////////////////////////////////////////////////////////////
关于 Proficy Portal 目录
有三种类型的目录:存储公共文件的公共目录,登录用户的个人目录和特定角色的目录。

主公共目录称为AllUsers。 缺省时,该目录在 \Program Files\GE Fanuc\Proficy Portal\webapps\infoAgentSrv下。AllUsers 目录包括以下子目录:

displays - 存放 Proficy Portal 中的公共画面,其它画面所有用户都可访问。

images - 存放Proficy Portal 画面所用到的公共图片。

symbols -存放Proficy Portal 画面所用到的符号文件。

个人目录存放在 Users 目录下。 缺省时,该目录在 \Program Files\GE Fanuc\Proficy Portalwebapps\infoAgentSrv\Users 下。Proficy Portal 根据用户的登录名为每个个人目录命名。 例如,用户以 jsmith 为名字登录,那么一个名为 jsmith 的个人目录就会被创建。 个人目录包括以下子目录:

displays - 存放由用户创建的画面。

eventgroups - 存放由用户创建的事件组。

pengroups - 存放由用户创建的笔组。

分配给特定角色的目录存放在 Roles 目录下。 缺省时,该目录在 \Program Files\GE Fanuc\Proficy Portal\webapps\infoAgentSrv下。特定角色的目录包括以下子目录:

displays -存放该角色的成员所能访问的画面。

eventgroups - 存放该角色的成员所能访问的事件组。

pengroups - 存放该角色的成员所能访问的笔组。

可以在路径 Program Files\GE Fanuc\Proficy Portal\webapps\infoAgentSrv下或其子目录下创建子目录来存放文件。 例如,在 AllUsers 下创建一个名为 Pengroups 的目录,那么所有的用户都可以访问 pengroups 了。

/////////////////////////////////////////////////////////////////////////////////////
禁用ifix冗余切换时弹出的对话框提示
当 iClient节点与活动节点建立连接后,开始从该节点读取数据。当活动节点无效时,显示节点丢失与活动节点间的会话,并弹出如下的消息框:

Node.Tag.Field Connection Not Established With Node

可以通过编辑 C:\Program Files\GE Fanuc\Proficy iFIX\Local目录下的FilteredErrors.ini文件, 屏蔽该消息,该消息的错误编号为1914。修改后需要重启Proficy iFIX工作台才能生效。
//////////////////////////////////////////////////////////////////////////////////////////////////////
iFIX画面实现多种语言切换
当画面在运行模式下可以实现多种语言切换。但必须自己翻译画面上的语言文本字符串,且不能切换如对话框标题、菜单、错误字符串等等语言。

实现方法:
iFIX工作台提供了一个"翻译工具栏",用于语言文件的导入导出。
1.添加"翻译工具栏",工具台->工具栏->选"画面"->勾上"翻译工具栏","翻译工具栏"就会出现在工具条上。
2.点击"翻译工具栏"

的"导出多个语言文件"按钮,选择要导出的画面和语言名称(替换时用)。导出的语言翻译文件为.CSV后缀的文件,用EXCEL打开后翻译相应的文本,然后保存。
3.导出的语言文件名请勿更改。文件名格式为:画面名_语言缩写.csv
缩写如下:
语言ID 语言代码 语言
9 EN 英语
1028 ZHTW 中文繁体
2052 ZHCH 中文简体
4.设置画面的LanguageDesired属性,设置成相应的语言代码。
5.在编辑模式时,点击"导入语言文件"按钮,即可直接导入翻译文本。
6.运行时语言切换代码:
picture1.SwitchLanguage(9)'切换到英语
picture1.SwitchLanguage(2052)'切换到中文-简体
picture1.SwitchLanguage(1028)'切换到中文-繁体

///////////////////////////////////////////////////////////////////////////////////////////////////////
网络冗余HOSTS文件设置
在每台计算机的SCU中启用网络冗余后,必须编辑每台计算机的HOSTS文件,输入每个网络路径。HOSTS文件通常在WINNT\System32\drivers\etc目录下。

需要输入每块网卡。分配给第2号网卡的名字除了-R的后缀,其它必须与第1号网卡的名字完全一致。例如在1号网上的网卡是PACKER1和PACKER2,则在2号网上的网卡是PACKER1-R和PACKER2-R,如下所示:

198.212.170.4 STATION1

198.421.103.6 PACKER1

1.1.1.2 STATION1-R

1.1.1.5 PACKER1-R

////////////////////////////////////////////////////////////////////////////////////
禁止未授权写登录
当accept_unauthorized_writes参数为OFF时,SCADA服务器将把所有失败的写尝试(未授权)作为操作员的报警和记录,在SCADA服务器中这些写尝试将把所用的报警激活。使用参数log_unauthorized_writes时,通过设置该参数为OFF来禁止登录失败的写入。该参数未出现在NETWORK.INI文件中或设置为ON时,SCADA服务器将记录所有未受权的写尝试。

要禁止登录未授权的写入,则配置NETWORK.INI文件:

[WRITEACCESS]

accept_unauthorized_writes=OFF

log_unauthorized_writes=OFF

writenode1=VIEW01

writenode2=VIEW10

一旦创建或修改了NETWORK.INI文件,的改变将立即生效。

通过分配安全区域中特殊组和用户,也能限制数据库的写访问。

1 限制数据库写入访问到SCADA服务器中:在SCADA服务器上使用文本编辑器打开NETWORK.INI文件。如果存在,则该文件存放在iFIX的本地路径下。如果不存在,在iFIX本地路径下使用文本编辑器创建该文件。

2输入下列文本:

[WRITEACCESS]

accept_unauthorized_writes=OFF

3如果想禁止登录未授权写入,则添加下列文本:

log_unauthorized_writes=OFF

4

添加能够访问本地SCADA服务器的浏览客户端。使用下面格式:

writenode#=nodename

5保存文件并确保存放在iFIX本地路径下。
//////////////////////////////////////////////////////////////////////////////
如何禁止非授权用户写操作
缺省状态下,iFIX SCADA服务器将从任意的远程节点上接受数据库写请求。但是,想防止未知或未授权的节点写入到一个SCADA服务器中,则在服务器的网络初始化文件NETWORK.INI中输入特定的设置。该文件包含一个参数为accept_unauthorized_writes,它将控制SCADA服务器是否接受从客户端进行数据库的写入。

当accept_unauthorized_writes参数没有出现在NETWORK.INI文件或设置为ON时,SCADA服务器将接受任意计算机的写请求。当参数设置为OFF时,访问所指定的客户端将被受到限制,无论谁登录到该远程节点上。通过列表显示,节点所访问的SCADA服务器数据库将被定义,在NETWORK.INI文件中使用下面的语句:

writenode#=nodename

例如,要想客户端View01和View05访问一个远程SCADA服务器,则配置服务器的NETWORK.INI文件为:

[WRITEACCESS]

accept_unauthorized_writes=OFF

writenode1=VIEW01

writenode2=VIEW05

如果只想限制数据库访问View01,则从该文件中删除View05。同样,如果想View10访问SCADA服务器的数据库,能添加下面一行:

writenode2=VIEW10

需要注意的是View10将被分配与View05同样的号因为所有的节点号必须是连续的。在没有定义writenode2下也不能为writenode1和writenode3来定义。

///////////////////////////////////////////////////////////////////////////////////////////////////
iFIX允许组点击事件


iFIX允许在画面中成组对象,并将组作为一个单独的对象处理。可以象动画单个对象一样动画组。但默认设置中,iFIX不允许组中的对象执行VB编辑器中定义的事件,如消息脚本等。要允许组中的所有对象执行所需事件,在FixUserPreferences.ini文件中更改[AppRunPreferences]部分的 PassControlClickEvent参数,将其设置为1。

要允许组点击事件:

1.关闭iFIX。

2.在文本编辑器(如记事本)中编辑 FixUserPreferences.ini。

3.找到 [AppRunPreferences] 部分的PassControlClickEvent=0设置。

4.将此设置改为1。

5.保存 FixUserPreferences.ini文件并重启iFIX。


/////////////////////////////////////////////////////////////////////////////

iFIX运行模式时预装入画面


工作台以运行模式运行时,可以把经常使用的画面直接预载入到画面缓存中。为实现这步操作,需要修改位于C:\Program Files\GE Fanuc\Proficy iFIX\LOCAL目录中的FixUserPreferences.ini文件 可使用任何文本编辑器修改该文件。下面两个配置参数位

于FixUserPreferences.ini文件中[AppPreloadPicturePreferences]一节。这两个参数用来预载入画面。

TotalPreloadPicturePath=
PicturePath#0=Firstpicture.grf

TotalPreloadPicturePath表示预载入到缓存中的画面数。PicturePath#N表示想载入的每幅画面的名称。如想预载入两幅画面,则在FixUserPreferences.ini文件中输入下列行:

[AppPreloadPicturePreferences]
TotalPreloadPicturePath=2
PicturePath#0=Firstpicturename.grf
PicturePath#1=Secondpicturename.grf

注意:工作台只有在启用“画面缓存”及选择“运行模式”复选框时,才预载入画面。在工作台从“编辑模式”切换到“运行模式”时,并不预载入画面。确保在FixUserPreferences.ini中定义的预装入画面的数量不要超过工作台用户首选项定义画面缓存数。

修改完毕后保存并关闭FixUserPreferences文件。重新启动“工作台”,加载新的参数设置。一旦定义了预载入的画面,则这些画面一直被保存在内存中。不会在运行模式中从缓存中被删除。画面只有在工作台初始启动为“运行模式”时才被预载入。
////////////////////////////////////////////////////////////////////////////////////////////////////////
iFIX数据连接精度不准的解决方法


数据链接中与数据库管理器中显示的浮点精度有可能不同。要使它们一致,按下列方法修改 iFIX Local目录下的FixUserPreferences.ini文件设置:

[AppRunPerferences]
AllowPrecisionAdjustment=0

数值0表示数据链接没有特殊的精度调整,其与数据库管理器中显示的一致。默认值是允许数据链接精度调整。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
iFIX保存登陆信息的文件


iFIX安全可以实现与安全有关的、由iFIX用户所执行的动作的跟踪。此安全跟踪日志文件保存在iFIX配置的报警路径中,其名称格式为YYMMDD.LOG。例如,文件070131.LOG包含2007年01月31日的跟踪。如果配置了报警ODBC服务和关系型数据库,iFIX也会将这些消息写入关系型数据库。

通过查看跟踪日志文件,可以获悉:

1.登录与注销者
2.访问iFIX的失败尝试的时间。
3.操作者没有完成的登录过程的三次时间。
4.某人试图访问没有授权的安全区域或应用特性的时间。
5.某人成功或不成功地进行数据输入或报警确认动作的签名时间。
6.操作者超出其可以登录的停留时间期限。

注意:只有启用了安全才有此文件。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////


ifix报警一栏打印
先设好默认打印机



Dim obj As Object
Set obj = AlarmSummaryOCX1.GridPtr
obj.Action = 32





如果不支持请装补丁

////////////////////////////////////////////////////////////////////////////////////////////////////////
ifix打印画面代码
Dim Pic As Object

For Each Pic In Application.Documents
If https://www.doczj.com/doc/0718401364.html, <> "User" Then

If https://www.doczj.com/doc/0718401364.html, = "main1" Then
Pic.Active = True
Application.ActiveDocument.Printout
Exit For
End If
End If
Next Pic
//////////////////////////////////////////////////////////////////////////

IFIX从运行环境切换到配置模式及退出系统代码
Application.SwitchMode 1'切换到配置模式

Application.SwitchMode 4'切换到运行模式





直接退出系统代码:

Dim hw&, cnt&
hw& = FindWindow("iFix Startup", vbNullString)
If hw& = 0 Then
MsgBox ("无法关闭系统。请使用 Windows任务管理器将工作台关闭。")
else
cnt& = SendMessage(hw&, &H10, 0, 0&)
endif

//////////////////////////////////////////////////////////////////////
手动从IFIX老版本备份到IFIX4.0



不同版本间不能用“备份恢复向导”,即不能还原不同版本的.FBK文件。



解决方法:



备份老版本的文件如下:


1. 打开SCU,导出安全文件,存为Security.RPT文件。
2. 在SCU中关闭安全。
3. 手动备份Dynamics\HTR 目录下的.CSV, .CFG 和 .DAT 文件。
4. 手动备份Dynamics\HTRDATA目录下的.H04, .H08 和.H24文件。
5. 手动备份Dynamics\LOCAL目录下的Security.RPT(刚导出的安全文件)文件。
6. 手动备份Dynamics\PIC目录下的.GRF, .TGD, User.FXG, .FTB, .FDS文件。
7. 导出数据库配置和驱动配置,成 .CSV文件。手动备份Dynamics\PDB目录下的AlarmAreas.AAD, .PDB, *.ABR, *.MB1文件。
8. 手动备份Dynamics\RCC目录下的文件。
9. 手动备份Dynamics\RCM目录下的文件。
10. 重新启动安全。



复制到新版本的文件及配置如下:



1. 手动拷贝刚才的文件到相应的目录。
2. 新建的一个SCU,更改工程路径,导入安全文件Security.RPT,保存到LOCAL目录。
3. 启用安全。

///////////////////////////////////////////////////////////////////////////////////////////

iFix从其他画面添加本画面的PEN
Description

Adding a pen to a specific chart using a push button from any picture.


Resolution

Create a picture;
Call ChartPic1;
Insert a chart into the picture;
Call the chart Chart1;
Save the picture;
Put the following code behind the click event of the push button, once you move the push button, it will work from anywhere to add the pen to the chart.

On Error GoTo ErrHandle

Dim objPic As Object
Dim objChart As Object
Dim objPen As Object

'look for pic with chart
Set objPic = Syst

em.FindObject("Chartpic1")
If IsNull(objPic) Then
MsgBox "The pic containing the chart is not open!"
Exit Sub
End If
'find chart in pic
Set objChart = FindLocalObject(objPic, "Chart1")
'add pen to chart, datasource is Tag named "Ramp1", True means use it without checking whether it exists
Set objPen = objChart.addpen("Ramp1", True)

'maybe You want do additional things with the pen
'objpen.hilimit = 200
'...

Set objPic = Nothing
Set objChart = Nothing
Set objPen = Nothing

Exit Sub
ErrHandle:
handleerror
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
ifix中实现单选框
实现有两种方法
1:添加optionButton,将多个optionButton组成一个group,在optionbutton单击事件中添加以下代码

Dim obj As Object, objGroup As Object
On Error Resume Next
Set objGroup = FindlocalObject(Me, "GroupReportTypes")
For Each obj In objGroup.ContainedObjects
If https://www.doczj.com/doc/0718401364.html, <> "optCrossTab" Then obj.Value = False
Next
strReportType.CurrentValue = "mensal"

strReportType是一个局部变量,用来存放选择的单选名称。

2:添加microsoft Forms 2.0的Frame。右击frame,会出现一个编辑框架对象,点击后出现控件工具箱,将控件拖入。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
IFIX切换回主节点代码

IFIX冗余时,当主节点停机,客户端将自动切换到备份节点。一旦主节点重新启用,可以运用一下代码将IFIX切换回主节点。

此段代码可以加到 调度、定时器、按钮等。

添加步骤:

1. 打开VBA,在Project_User中插入一个新的模块。

2. 将代码加到模块中。

3. 在合适的地方添加调用的代码

――――――――――――――――模块中代码――――――――――――――――――

Public Function GetLocalNode() As String

On Error Resume Next

Dim strMyName As String * 9

Dim iErr As Integer

Dim lngLength As Long

iErr = eda_get_my_physical_name(strMyName)

lngLength = InStr(1, strMyName, Chr(0)) – 1

If lngLength > 0 Then

strMyName = Left(strMyName, lngLength)

GetLocalNode = Trim(strMyName)

End If

End Function

Public Sub FailOverToPrimary(ScadaID As String)

'ScadaID表示网络节点名

Dim strMyName As String '表示当前节点

Dim strActiveNode As String

Dim vActNode As Variant '表示活动节点 (0 = 主节点, > 1 = 备节点)

Dim vPrimStat

Dim strPrimStatus As String '表示主节点状态 (例如: "OK")

On Error Resume Next

strMyName = GetLocalNode '获得节点名

strActiveNode = "Fix32." & strMyName & ".nsd.f_curactivenode_" & ScadaID

vActNode = ReadValue(strActiveNode)

If vActNode <> 0 Then '当活动节点是备节点时,切换

strPrimStatus = "Fix32." & strMyName & ".nsd.a_primar

ystatus_" & ScadaID

vPrimStat = ReadValue(strPrimStatus)

If vPrimStat = "OK" Then writevalue "0", strActiveNode

End If

End Sub

―――――――――――以下是调用代码,以定时器为例―――――――――――――

Private Sub FixTimer3_OnTimeOut(ByVal lTimerId As Long)

FailOverToPrimary "0"


End Sub

――――――――――――――――――――――――――――――――――――――
///////////////////////////////////////////////////////////////////////////////////////////////////////
IFIX标签如何拆位使用 分类:Proficy iFix2006.11.27 10:41 作者:aiwdy | 评论:0 | 阅读:227
第一种方法:
1、定义标签QQ,类型选用AR(模拟量寄存器类型)
2、在画面中随意做一个开关量对象,比如Data Link
3、给对象赋数据源时选择该标签,但格式为
FIX32.nodename.QQ.F_0
F_0表示模拟量QQ的第一位,相对应F_15指第16位
4、切换到运行状态即可显示变化的位了

注意:
1、该方法必须使用AR类型
2、无法形成历史数据和报警数据
3、速度极快!省IO点。但不要滥用呦
4、取位的话,定义成DR类型


第二种方法:
Public Function BitValue(MyNumber As Long, BitNumber As Long) As Integer
Dim intValue1 As Long
Dim intValue2 As Long
Dim intValue3 As Integer
Dim intValue4 As Long
Dim intValue5 As Long

If (MyNumber > 65535 Or MyNumber < 0) Then
MsgBox "FUNCTION BITVALUE ERROR, OUT OF RANGE1.", vbCritical + vbOKOnly, "ERROR"
Exit Function
End If
If (BitNumber > 16 Or BitNumber <= 0) Then
MsgBox "FUNCTION BITVALUE ERROR, OUT OF RANGE2.", vbCritical + vbOKOnly, "ERROR"
Exit Function
End If
If BitNumber = 1 Then
intValue1 = MyNumber Mod 2
If intValue1 > 0.5 Then
intValue3 = 1
Else
intValue3 = 0
End If
Else
intValue1 = 2 ^ BitNumber
intValue2 = MyNumber Mod intValue1
intValue4 = 2 ^ (BitNumber - 1)
intValue5 = MyNumber Mod intValue4
intValue1 = intValue2 - intValue5
If intValue1 > 0.5 Then
intValue3 = 1
Else
intValue3 = 0
End If
End If
BitValue = intValue3
End Function



Public Function bit(DecimalValue As Long, bitN As Integer) As Boolean
Dim result As String
Dim ExtraDigitsNeeded As Integer
DecimalValue = Abs(DecimalValue)
Do
result = CStr(DecimalValue Mod 2) & result
DecimalValue = DecimalValue \ 2
Loop While DecimalValue > 0
'保留16位长度
ExtraDigitsNeeded = 16 - Len(result)
If ExtraDigitsNeeded > 0 Then
result = String(ExtraDigitsNeeded, "0") & result
End If
'取第几bit
result = Mid(result, Abs(bitN - 16), 1)
'返回数据
bit = result
End Function
////////////////////////////////////////////////////////////////

/////////////////////////////////
ifix利用XML实现报表(XML的VB操作类,转载) 分类:Proficy iFix2006.12.5 15:05 作者:aiwdy | 评论:0 | 阅读:372
Private fNode,fANode
Private fErrInfo,fFileName,fOpen
Dim XmlDom

'返回节点的缩进字串
Private Property Get TabStr(byVal Node)
TabStr=""
If Node Is Nothing Then Exit Property
If not Node.parentNode Is nothing Then TabStr=" "&TabStr(Node.parentNode)
End Property

'返回一个子节点对象,ElementOBJ为父节点,ChildNodeObj要查找的节点,IsAttributeNode指出是否为属性对象
Public Property Get ChildNode(byVal ElementOBJ,byVal ChildNodeObj,byVal IsAttributeNode)
Dim Element
Set ChildNode=Nothing

If IsNull(ChildNodeObj) Then
If IsAttributeNode=false Then
Set ChildNode=fNode
Else
Set ChildNode=fANode
End If
Exit Property
ElseIf IsObject(ChildNodeObj) Then
Set ChildNode=ChildNodeObj
Exit Property
End If

Set Element=Nothing
If LCase(TypeName(ChildNodeObj))="string" and Trim(ChildNodeObj)<>"" Then
If IsNull(ElementOBJ) Then
Set Element=fNode
ElseIf LCase(TypeName(ElementOBJ))="string" Then
If Trim(ElementOBJ)<>"" Then
Set Element=XmlDom.selectSingleNode("//"&Trim(ElementOBJ))
If Lcase(Element.nodeTypeString)="attribute" Then Set Element=Element.selectSingleNode("..")
End If
ElseIf IsObject(ElementOBJ) Then
Set Element=ElementOBJ
End If

If Element Is Nothing Then
Set ChildNode=XmlDom.selectSingleNode("//"&Trim(ChildNodeObj))
ElseIf IsAttributeNode=true Then
Set ChildNode=Element.selectSingleNode("./@"&Trim(ChildNodeObj))
Else
Set ChildNode=Element.selectSingleNode("./"&Trim(ChildNodeObj))
End If
End If
End Property

'读取最后的错误信息
Public Property Get ErrInfo
ErrInfo=fErrInfo
End Property

'给xml内容
Public Property Get xmlText(byVal ElementOBJ)
xmlText=""
If fopen=false Then Exit Property

Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false)
If ElementOBJ Is Nothing Then Set ElementOBJ=XmlDom

xmlText=ElementOBJ.xml
End Property

'=================================================================
'类初始化
Private Sub Class_Initialize()
Set XmlDom=CreateObject("Microsoft.XMLDOM")
XmlDom.preserveWhiteSpace=true

Set fNode=Nothing
Set fANode=Nothing

fErrInfo=""
fFileName=""
fopen=false
End Sub

'类释放
Private Sub Class_Terminate()
Set fNode=Nothing
Set fANode=Nothing
Set XmlDom=nothing
fopen=false
End Sub

'=====================================================================
'建立一个XML文件,RootElementName:根结点名。XSLURL:使用XSL样式地址
'返回根结点

Function Create(byVal RootElementName,byVal XslUrl)
Dim PINode,RootElement

Set Create=Nothing

If (XmlDom Is Nothing) Or (fopen=true) Then Exit Function

If Trim(RootElementName)="" Then RootElementName="Root"

Set PINode=XmlDom.CreateProcessingInstruction("xml", "version=""1.0"" encoding=""GB2312""")
XmlDom.appendChild PINode

Set PINode=XMLDOM.CreateProcessingInstruction("xml-stylesheet", "type=""text/xsl"" href="""&XslUrl&"""")
XmlDom.appendChild PINode

Set RootElement=XmlDom.createElement(Trim(RootElementName))
XmlDom.appendChild RootElement

Set Create=RootElement

fopen=True
set fNode=RootElement
End Function

'开打一个已经存在的XML文件,返回打开状态
Function Open(byVal xmlSourceFile)
Open=false

xmlSourceFile=Trim(xmlSourceFile)
If xmlSourceFile="" Then Exit Function

XmlDom.async = false
XmlDom.load xmlSourceFile

fFileName=xmlSourceFile

If not IsError Then
Open=true
fopen=true
End If
End Function

'关闭
Sub Close()
Set fNode=Nothing
Set fANode=Nothing

fErrInfo=""
fFileName=""
fopen=false
End Sub

'读取一个NodeOBJ的节点Text的值
'NodeOBJ可以是节点对象或节点名,为null就取当前默认fNode
Function getNodeText(byVal NodeOBJ)
getNodeText=""
If fopen=false Then Exit Function

Set NodeOBJ=ChildNode(null,NodeOBJ,false)
If NodeOBJ Is Nothing Then Exit Function

If Lcase(NodeOBJ.nodeTypeString)="element" Then
set fNode=NodeOBJ
Else
set fANode=NodeOBJ
End If
getNodeText=NodeOBJ.text
End function

'插入在BefelementOBJ下面一个名为ElementName,Value为ElementText的子节点。
'IsFirst:是否插在第一个位置;IsCDATA:说明节点的值是否属于CDATA类型
'插入成功就返回新插入这个节点
'BefelementOBJ可以是对象也可以是节点名,为null就取当前默认对象
Function InsertElement(byVal BefelementOBJ,byVal ElementName,byVal ElementText,byVal IsFirst,byVal IsCDATA)
Dim Element,TextSection,SpaceStr
Set InsertElement=Nothing

If not fopen Then Exit Function

Set BefelementOBJ=ChildNode(XmlDom,BefelementOBJ,false)
If BefelementOBJ Is Nothing Then Exit Function

Set Element=XmlDom.CreateElement(Trim(ElementName))

'SpaceStr=vbCrLf&TabStr(BefelementOBJ)
'Set STabStr=XmlDom.CreateTextNode(SpaceStr)

'If Len(SpaceStr)>2 Then SpaceStr=Left(SpaceStr,Len(SpaceStr)-2)
'Set ETabStr=XmlDom.CreateTextNode(SpaceStr)

If IsFirst=true Then
'BefelementOBJ.InsertBefore ETabStr,BefelementOBJ.firstchild
BefelementOBJ.InsertBefore Element,BefelementOBJ.firstchild
'BefelementOBJ.InsertBefore STabStr,BefelementOBJ.firstchild
Else
'BefelementOBJ.appendChild STab

Str
BefelementOBJ.appendChild Element
'BefelementOBJ.appendChild ETabStr
End If

If IsCDATA=true Then
set TextSection=XmlDom.createCDATASection(ElementText)
Element.appendChild TextSection
ElseIf ElementText<>"" Then
Element.Text=ElementText
End If

Set InsertElement=Element
Set fNode=Element
End Function

'在ElementOBJ节点上插入或修改名为AttributeName,值为:AttributeText的属性
'如果已经存在名为AttributeName的属性对象,就进行修改。
'返回插入或修改属性的Node
'ElementOBJ可以是Element对象或名,为null就取当前默认对象
Function setAttributeNode(byVal ElementOBJ,byVal AttributeName,byVal AttributeText)
Dim AttributeNode
Set setAttributeNode=nothing

If not fopen Then Exit Function

Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false)
If ElementOBJ Is Nothing Then Exit Function

Set AttributeNode=ElementOBJ.attributes.getNamedItem(AttributeName)
If AttributeNode Is nothing Then
Set AttributeNode=XmlDom.CreateAttribute(AttributeName)
ElementOBJ.setAttributeNode AttributeNode
End If
AttributeNode.text=AttributeText

set fNode=ElementOBJ
set fANode=AttributeNode
Set setAttributeNode=AttributeNode
End Function

'修改ElementOBJ节点的Text值,并返回这个节点
'ElementOBJ可以对象或对象名,为null就取当前默认对象
Function UpdateNodeText(byVal ElementOBJ,byVal NewElementText,byVal IsCDATA)
Dim TextSection

set UpdateNodeText=nothing
If not fopen Then Exit Function

Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false)
If ElementOBJ Is Nothing Then Exit Function

If IsCDATA=true Then
set TextSection=XmlDom.createCDATASection(NewElementText)
If ElementOBJ.firstchild Is Nothing Then
ElementOBJ.appendChild TextSection
ElseIf LCase(ElementOBJ.firstchild.nodeTypeString)="cdatasection" Then
ElementOBJ.replaceChild TextSection,ElementOBJ.firstchild
End If
Else
ElementOBJ.Text=NewElementText
End If

set fNode=ElementOBJ
Set UpdateNodeText=ElementOBJ
End Function

'返回符合testValue条件的第一个ElementNode,为null就取当前默认对象
Function getElementNode(byVal ElementName,byVal testValue)
Dim Element,regEx,baseName

Set getElementNode=nothing
If not fopen Then Exit Function

testValue=Trim(testValue)
Set regEx=New RegExp
regEx.Pattern="^[A-Za-z]+"
regEx.IgnoreCase=true
If regEx.Test(testValue) Then testValue="/"&testValue
Set regEx=nothing

baseName=LCase(Right(ElementName,Len(ElementName)-InStrRev(ElementName,"/",-1)))

Set Element=XmlDom.SelectSingleNode("//"&ElementName&testValue)

If Element Is Nothing Then
'Response.write ElementName&testValue
Set getElementNo

de=nothing
Exit Function
End If

Do While LCase(Element.baseName)<>baseName
Set Element=Element.selectSingleNode("..")
If Element Is Nothing Then Exit Do
Loop

If LCase(Element.baseName)<>baseName Then
Set getElementNode=nothing
Else
Set getElementNode=Element
If Lcase(Element.nodeTypeString)="element" Then
Set fNode=Element
Else
Set fANode=Element
End If
End If
End Function

'删除一个子节点
Function removeChild(byVal ElementOBJ)
removeChild=false
If not fopen Then Exit Function

Set ElementOBJ=ChildNode(null,ElementOBJ,false)
If ElementOBJ Is Nothing Then Exit Function

'response.write ElementOBJ.baseName

If Lcase(ElementOBJ.nodeTypeString)="element" Then
If ElementOBJ Is fNode Then set fNode=Nothing
If ElementOBJ.parentNode Is Nothing Then
XmlDom.removeChild(ElementOBJ)
Else
ElementOBJ.parentNode.removeChild(ElementOBJ)
End If
removeChild=True
End If
End Function

'清空一个节点所有子节点
Function ClearNode(byVal ElementOBJ)
set ClearNode=Nothing
If not fopen Then Exit Function

Set ElementOBJ=ChildNode(null,ElementOBJ,false)
If ElementOBJ Is Nothing Then Exit Function

ElementOBJ.text=""
ElementOBJ.removeChild(ElementOBJ.firstchild)

Set ClearNode=ElementOBJ
Set fNode=ElementOBJ
End Function

'删除子节点的一个属性
Function removeAttributeNode(byVal ElementOBJ,byVal AttributeOBJ)
removeAttributeNode=false
If not fopen Then Exit Function

Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false)
If ElementOBJ Is Nothing Then Exit Function

Set AttributeOBJ=ChildNode(ElementOBJ,AttributeOBJ,true)
If not AttributeOBJ Is nothing Then
ElementOBJ.removeAttributeNode(AttributeOBJ)
removeAttributeNode=True
End If
End Function

'保存打开过的文件,只要保证FileName不为空就可以实现保存
Function Save()
On Error Resume Next
Save=false
If (not fopen) or (fFileName="") Then Exit Function

XmlDom.Save fFileName
Save=(not IsError)
If Err.number<>0 then
Err.clear
Save=false
End If
End Function

'另存为XML文件,只要保证FileName不为空就可以实现保存
Function SaveAs(SaveFileName)
On Error Resume Next
SaveAs=false
If (not fopen) or SaveFileName="" Then Exit Function
XmlDom.Save SaveFileName
SaveAs=(not IsError)
If Err.number<>0 then
Err.clear
SaveAs=false
End If
End Function

'检查并打印错误信息
Private Function IsError()
If XmlDom.ParseError.errorcode<>0 Then
fErrInfo="

Error"&XmlDom.ParseError.errorcode&"

"
fErrInfo=fErrInfo&"Reason :"&XmlDom.ParseError.reason&"

"
fErrInfo=fErrInfo&"URL    :"&XmlDom.ParseError.url&"
"
fErrInfo=fErrInfo&"Line   :"&XmlDom.ParseError.line&"
"
fErrInfo=fErrInfo&"FilePos:"&XmlDom.ParseError.filepos&"
"
fErrInfo=fErrInfo&"srcText:"&XmlDom.ParseError.srcText&"
"
IsError=True
Else
IsError=False
End If
End Function
/////////////////////////////////////////////////////////////////////////////
iFix客户端节点上的画面加载速度加快方法

通过调整 FixUserPreferences.ini 文件中的参数设置可以让你精确调整 VBA 脚本语言的运行性能,并加快画面在浏览节点上的打开速度。
FixUserPreferences.ini 文件在目录\Dynamics\Local 下,在此文件的 [Scripting] 部分参数ScriptIdleTimeProcessingDelayCount 缺省值设置在 –1。
在这一缺省设置下,你的 VBA 脚本语言的执行将优先于画面的打开,若将此设定改为 0 或 1,你可以提高画面的打开速度。你可以使用的一个办法是在你的 SCADA节点上将参数设为 –1,使 VBA脚本运行速度较快,而在客户端将参数设为 0 或 1,加快画面的打开速度。
注意:不要将参数设为大于 1,这并不能提高你的系统性能。

///////////////////////////////////////////////////////////////////////////
iFix的画面间的共享

iFix中,一个画面对应的是一个VBA工程,一般画面间不相互操作。如果要实现画面间操作,需要在一个VBA工程中添加“引用”另一个画面。还有,IFIX提供了一个公用的VBA工程-USER工程,其实就是引用的!
///////////////////////////////////////////////////////////////
iFix中报警一览中点击弹出窗口

用代码读出报警队列的报警,弹出个窗口显示新的报警信息?


ifix提供的报警摘要控件AlarmSummaryOCX就是报警的现实窗口,因此要想提取报警信息也可以通过对AlarmSummaryOCX控件进行编程操作。下面是一个简单例子,更详细的说明文档建议看看AlarmSummaryOCX帮助。
Private Sub AlarmSummaryOCX1_Click()
Dim strPic As String
Dim strBlank As String
Dim blnSuccess As Boolean
blnSuccess = AlarmSummaryOCX1.GetSelectedAlmExt(strPic, strBlank)
openpicture strPic, , 0, 0, 0
End Sub
'This will open the picture defined for the tag whose alarm you selected in the alarm summary
另外通过integrate toolkit也可以实现报警信息的获取,不过相对来说比较麻烦。


关于新报警触发:Me.AlarmSummaryOCX1.CheckForNewAlarms = True这个值设定之后,对应的AlarmSummaryOCX1每产生一个新报警就会触发一次AlarmSummaryOCX1_NewAlarm事件。这里不同的是确认报警有专门的函数,而读取每一行的报警(还有每一行中各个列的信息)的话需要自己写代码的。



///////////////////////////////////////////////////////////////////////////////////////////

//
iFix 通过DDE 读写EXCEL 数据



1、 新建一个EXCEL 文档,保存为DDE.XLS。
2、 在DDE.XLS 的第一行第一列输入50,然后保存。
3、 运行iFix 系统配置,如下:
4、 点击SCADA按钮,进入SCADA 组态窗口。

5、 添加DDE 驱动,然后保存系统配置文件。
6、 运行iFix,打开数据库管理器。
7、 添加AI 数据块,驱动器选择DDE 驱动,在I/O 地址栏输入:EXCEL|[DDE.xls]sheet1!R1C1。
8、 数据块允许输出,保存数据库。
9、 在iFix 画面上添加一个数据连接,连接到该AI 数据块。
10、运行DDE.XLS,然后运行C:\Dynamics\Ddeclnt.exe,启动画面就可以读写该EXCEL 了。
注:用同样的方法可以读写其他DDE 数据源。

/////////////////////////////////////////////////////////////////////////////////////////////////////
ifix退出工作台和最小化工作台


Application.Quit---退出工作台,但IFIX仍然在采集数据,即SCADA还在运行!

Application.WindowState = 2---最小化工作台!
/////////////////////////////////////////////////////////////////
iFix中隐藏画面但不关闭画面



Dim objPicture As Object


Set objPicture = System.FindObject("PictureName")

objPicture.runtimevisible = False





可以用于没有定义用户全限情况 但想不让某些用户看到画面内容,或画面中有代码在运行且要继续运行等

//////////////////////////////////////////////////////////////////////////////////////////////////////////
iFix中调度对运行效率的影响

iFix调度执行模式可以分前景和背景执行。

通常在开发阶段或初次投入运行时建议采用前景模式,因为排错比较方便。

当执行一段时间确定程序稳定后,建议改为背景模式,因为可以避免调度造成Workspace.exe进程负担增加,切换画面也会更加顺畅,而且因为程序进程分开,就不会因为调度错误导致workspace出错。

调度在背景模式执行较有效率,整体CPU负载会降低。

通常基于事件的调度消耗较大,最好不要写太多。

当然使用背景模式时,由于调度进程为FixBackgroundServer.exe,和Workspace.exe分别为两个进程,调度也就不能使用project_User内的全局变量,此时可以考虑SIM驱动的标签!

/////////////////////////////////////////////////////////////////////////////////////////////////
如何用iFix看电脑中所有的OPC服务器


运行c:\dynamics\dataserverinstaller.exe,其他的自己看吧!

如果不需要报警和历史曲线功能,iFix作为客户端就不需要安裝OPC Clinet Dirver. 先用 Dataserverinstaller.exe 指定opc server name, 不必建立Tag, 直接由表达式编辑器-> DataServer 內选取即可监视数值。这种方式不会计算点数。

如果需要报警与历史曲线功能,那就需要安裝OPC

Clinet Dirver.再來建立Tag, 然后在图片上DataLink 加入该Tag。即可监视数值。这种方式需计算点数。

接下来就是想尽办法减少点数了!

//////////////////////////////////////////////////////////////////////////////////////////////////////////
备份和恢复Proficy Portal文件

为防止断电、硬件损坏或意外数据丢失,请有计划的定期备份Proficy Portal数据。 建议在升级/安装新版本的Proficy Portal时也要做备份。

以下示例脚本可用来自动备份和恢复。 服务器上必须安装有WinZip脚本才能工作,一定要按照要求更新路径。 使用第一个脚本 ( backupProficyPortalData.cmd)备份文件,第二个脚本 ( restoreProficyPortalData.cmd) 恢复文件。

backupProficyPortalData.cmd

@echo offrem ---------------------------------------------------------------------------rem Steps:rem Copy this file in your Proficy Portal folderrem Fill up the addresses where Proficy Portal is installed and where the WinZip32.exe file is.rem ---------------------------------------------------------------------------set WINZIPADDRESS="C:\Program Files\WinZip"rem Enter the folder in which the file wzzip.exe is situated echo Preparing to create the zip file...set PROFICYPORTALADDRESS="C:\Program Files\GE Fanuc\Proficy Portal"%WINZIPADDRESS%\wzzip.exe -a -r -P WinBackUp.zip %PROFICYPORTALADDRESS%\webapps\infoAgentSrv\AllUsers\*.*echo AllUsers folder added...%WINZIPADDRESS%\wzzip.exe -a -r -P WinBackUp.zip %PROFICYPORTALADDRESS%\webapps\infoAgentSrv\QED\*.*echo QED folder added...%WINZIPADDRESS%\wzzip.exe -a -r -P WinBackUp.zip %PROFICYPORTALADDRESS%\webapps\infoAgentSrv\Roles\*.*echo Roles folder added...%WINZIPADDRESS%\wzzip.exe -a -r -P WinBackUp.zip %PROFICYPORTALADDRESS%\webapps\infoAgentSrv\Users\*.*echo Users folder added...%WINZIPADDRESS%\wzzip.exe -a -r -P WinBackUp.zip %PROFICYPORTALADDRESS%\webapps\infoAgentSrv\config\datasources\Alarms\*.*echo Alarms folder added...%WINZIPADDRESS%\wzzip.exe -a -r -P WinBackUp.zip %PROFICYPORTALADDRESS%\webapps\infoAgentSrv\config\datasources\EDA\*.*echo EDA folder added...%WINZIPADDRESS%\wzzip.exe -a -r -P WinBackUp.zip %PROFICYPORTALADDRESS%\webapps\infoAgentSrv\config\datasources\iHistorian\*.*echo iHistorian folder added...%WINZIPADDRESS%\wzzip.exe -a -r -P WinBackUp.zip %PROFICYPORTALADDRESS%\webapps\infoAgentSrv\config\datasources\OPC\*.*echo OPC folder added...%WINZIPADDRESS%\wzzip.exe -a -r -P WinBackUp.zip %PROFICYPORTALADDRESS%\webapps\infoAgentSrv\config\datasources\PeHistPt\*.*echo PeHistPt folder added...%WINZIPADDRESS%\wzzip.exe -a -r -P WinBackUp.zip %PROFICYPORTALADDRESS%\webapps\infoAgentSrv\config\datasources\PeRtp\*.*echo PeRtp folder added...%WINZIPADDRESS%\wzzip.exe -a -r -P WinBackUp.zip %PROFICYPORTALADDRESS%\webapps\infoAgentSrv\config\datasources\PI\*.*echo PI folder added...%WINZIPADDRESS%\wzzip.exe -a -r -P WinBackUp.zip %PROFICYPORTALADDRESS%\webapps\i

nfoAgentSrv\config\datasources\SQL\*.*echo SQL folder added...%WINZIPADDRESS%\wzzip.exe -a -r -P WinBackUp.zip %PROFICYPORTALADDRESS%\webapps\infoAgentSrv\config\datasources\VisualSPC\*.*echo VisualSPC folder added...%WINZIPADDRESS%\wzzip.exe -a -r -P WinBackUp.zip %PROFICYPORTALADDRESS%\webapps\infoAgentSrv\maps\*.*echo maps folder added...%WINZIPADDRESS%\wzzip.exe -a -r -P WinBackUp.zip %PROFICYPORTALADDRESS%\webapps\infoAgentSrv\WEB-INF\Policy.xmlecho Policy.xml added... restoreProficyPortalData.cmd

@echo offrem ---------------------------------------------------------------------------rem Steps:rem Fill up the addresses where Proficy Portal is installed and where the WinZip32.exe file is.rem ---------------------------------------------------------------------------set WINZIPADDRESS="C:\Program Files\WinZip"rem Enter the folder in which the file wzunzip.exe is situatedset PROFICYPORTALADDRESS=C:\ rem Enter the directory in which Proficy Portal is installedecho Extracting the files from the zip file...%WINZIPADDRESS%\wzunzip.exe -e -d WinBackUp.zip %PROFICYPORTALADDRESS%echo All files extracted程序是帮助文档里拷来的,如有错误请参考帮助文档!PS:1.运行的电脑上要装WINZIP9.0以上版本,并装有WINZIP COMMAND LINE SPORT ADD-ON。 2.将上面程序复制到记事本,然后改后缀为“.bat”,作为批处理执行。PS:使用VBScrip也可实现。其他方法就不详述。 VBScrip方法:(DOS窗口不出现) Set WshShell = Wscript.CreateObject("Wscript.Shell") WshShell.Run "e:\wzzip.exe e:\Test.zip E:\TEST", 0, TRUE msgbox "完成" 注:这段程序是将“E:\TEST”文件夹备份为“e:\Test.zip”文件。 Set WshShell = Wscript.CreateObject("Wscript.Shell") WshShell.Run "e:\WZUNZIP.EXE e:\Test.zip E:\TEST", 0, TRUE msgbox "完成" 注:这段程序是将“e:\Test.zip”文件还原为“E:\TEST”文件夹。 PS:对应要备份还原的文件和文件夹即可。

////////////////////////////////////////////////////////////////////////////////////////////////////////////
iFix画面导入Portal的条件

在使用iFIX画面导出功能之前,确保已经安装下列软件(最低要求):

§ Proficy HMI/SCADA - iFIX version 3.5

§ Proficy HMI/SCADA - iFIX35_SP1 SIM

§ Proficy HMI/SCADA - iFIX35_117410305 SIM

§ Proficy HMI/SCADA - iFIX35_294667 SIM


/////////////////////////////////////////////////////////////////////////////////////////////
Portal中改变Java虚拟机内存


为了提高Proficy Portal的性能和可测量性,可以改变Java 虚拟机(VM)可用的内存。

为了改变Java 虚拟机内存限制:

1.访问Java插件控制面板(选择开始|设置|控制面板)并双击Java插件。

2.点击高级页签。

3.将最大和最小堆值设为256MB,添加以下内容到Java运行时参数框:

-Xmx256m -Xmx256m

4.点击应用按钮。


5.退出Java插件控制面板。

////////////////////////////////////////////////////////////////////////
关于Portal启用安全时无密码用户不能登录
在Windows 2000中:

1.点击开始,再点击控制面板。

2.打开管理工具控制面板。

3.双击本地安全策略。

4.打开帐户策略文件夹并选择密码策略。

5.双击密码长度最小值并将其设置为零。

在Windows XP中:

1.点击开始,再点击控制面板。

2.打开管理工具控制面板。

3.双击本地安全策略。

4.打开帐户策略文件夹并选择密码策略。

5.双击密码长度最小值并将其设置为零。

6.打开本地策略文件夹并选择安全选项。

7.确认已停用限制本地用户使用空密码登录到控制台。
///////////////////////////////////////////////////////////////////////////////
使用OLEDB连Historian的实例列表(帮助文档中的)


WHERE Clauses
Example 1: Searching for All Single Float Tags

Example 2: Specifying Query Parameters in a WHERE Clause to Obtain String Data

Example 3: Using a WHERE Clause Specify a Time Range

Example 4: Using a Complex WHERE Clause – All Tags Matching a Given Tagname and Description Pattern

Result Sorting
Example 1: Retrieving Collectors in Descending Ordering, Sorted by CollectorName Column

Example 2: Retrieving Messages in Ascending Order, Sorted by Time and Other Columns

TOP Percent
Example 1: Returning the Top 40 Tags in Alphabetical Order

Example 2: Returning the Top 10 Most Recent Messages

Example 3: Returning the Top 10 Percent, RowCount Disabled

LIKE Expression
Example 1: Using the LIKE Expression with Multiple Character Replacement

Example 2: Using the LIKE Expression with Single Character Replacement

AS Condition
Example: Setting the Output Column Name

Eliminating Duplicate Return Rows
Example 1: Retrieving the Set of Unique Data Types Used in the Archive

Example 2: Retrieving the Set of Tags with Raw Data Samples on a Specific Date

Grouping Records
Example: Grouping Messages by User Name and Topic

SQL Aggregate Functions
Example 1: Retrieving the Total Number of Tags

Example 2: Calculating Values for Multiple Tags

Table Joins
Example 1: Performing an Inner Join to Retrieve Only Data with Associated Comments

Example 2: Performing a Left Outer Join to Retrieve All Data With and Without Comments

Example 3: Performing a Right Outer Join to Retrieve All Comments and Their Accompanying Data

Example 4: Performing a Cross Join

Example 5: Performing a Cross Join (Older Syntax)

Example 6: Joining the ihMessages and ihArchives Tables

Example 7: Interleaving Data and Messages by Timestamp

Example 8: Retrieving the Greatest Values Across All Simulation Tags

Example 9: Joining the ihComments and ihRawData Tables

Example 10: Reporting by Tag Description

Example 11: Joining Three Tables

Example 12: Performing a Ri

ght Join (Older Syntax)

Example 13: Performing a Left Join (Older Syntax)

Quotation Marks
Example: Using Quotes When a Text String Contains a Space

Timestamp Formats
Example 1: Using the System Short Date and Time

Example 2: Using the SQL Date and Time

Example 3: Using the ODBC Date and Time

Example 4: Setting the Start Time to 4AM Today

Date/Time Shortcuts
Example 1: Setting the Starting Time to the First Day of the Month

Example 2: Retrieving Messages Dated Today

Relative Date/Time Shortcuts
Example 1: Setting the Start Time to 10 Days Before Yesterday and End Time to Today

Example 2: Retrieving the Previous 24 Hours of Messages

Example 3: Selecting Data Starting at 1AM Yesterday and Ending Now

Example 4: Retrieving Raw Data With a 1 Hour (3600000 Milliseconds) Interval Between Returned Samples

Example 5: Retrieving This Weeks Output to Date

Comparison Operators
Example 1: Retrieving Tags with a High EGU Greater Than 300

Example 2: Retrieving Tags with a Given Description

Example 3: Retrieving All Samples Where the Value Exceeds Query Supplied Values

Example 4: Retrieving All Samples Where the Value is Between Query Supplied Values

Example 5: Retrieving All Tag Names Starting with an A or B

Logical Operators
Example 1: Using the AND Logical Operator

Example 2: Using the OR Logical Operator

Example 3: Using the NOT Logical Operator

Example 4: Using the NOT Logical Operator with a LIKE Expression

Parenthetical Expressions
Example 1: Using Parentheses

Example 2: Using Parentheses with Logical Operators and Timestamps

Example 3: Using Multiple Sets of Parentheses

SET Statement Examples
Example 1: Performing a Simple SET

Example 2: Performing Multiple SETs

Example 3: Preparing for a RawByTime Query

Example 4: Preparing for a RawByNumber Query

Example 5: Preparing for One Hour Minimums

Example 6: Preparing for a Filtered Data Query

Example 7: Throttling Results with a SET Statement

Separating Lines of Syntax
Example 1: Using a SET and SELECT STATEMENT on the Same Line

Example 2: Using a SET and SELECT STATEMENT on Different Lines

Using Microsoft System Stored Procedures
Example 1: Configuring a Linked Server Definition Using sp_addlinkedserver

Example 2: Browsing the Set of Linked Server Definitions Using sp_linkedservers

Example 3: Deleting Linked Server Definitions Using sp_dropserver

Using OPENQUERY to Access a Linked Server
Example 1: Returning a List of Tags from the Historian

Example 2: Performing a Complex Query That Extracts Values from the Historian

Using Four Part Name Syntax
Example: Accessing the ihTrend Table via a Linked Server

Using OPENROWSET and OPENDATASOURCE to Access a Linked Server
Example 1: Using the OPENROWSET Command with a SQL Query

Example 2: Using the OPENDATASOURCE Command to Access a Table

Example 3: Using the OPENDATASOURCE Command with a SQL Query and Security

Advanced Linked

Server Examples
Example 1: Joining Historian Data with iFIX Alarms Logged via AlarmODBC

Example 2: Accessing Linked Server Data with a Stored Procedure

Visual Basic Examples
Example 1: Retrieving Milliseconds

Example 2: Throttling Results with the MaxRecords Property in ADO

ihTags Examples
Example 1: Finding All Tags that Belong to a Particular Collector

Example 2: Finding All Tags with a Certain Poll Rate, or Range of Poll Rates, or Ones with Polling Disabled

Example 3: Retrieving All Tags Collected by Each Collector

Example 4: Retrieving All Tags with a Certain Poll Rate

Example 5: Retrieving All Tags with Subsecond Collection

Example 6: Retrieving All Tags with Polling Disabled

Example 7: Counting the Number of Tags, Grouping by Collector Name

Example 8: Counting the Number of Tags, Grouping by Collector Type

ihArchives Examples
Example 1: Retrieving the Archive List, Sorted by StartTime

Example 2: Retrieving All Properties of the Current Archive

ihCollectors Examples
Example 1: Retrieving All Collectors and Their Statuses

Example 2: Retrieving All Collectors Not Running

ihMessages Examples
Example 1: Retrieving All Messages and Alerts for Today

Example 2: Retrieving All Alert Messages for a User Name and Time

Example 3: Retrieving All Messages in Your Archive

Example 4: Retrieving All Messages for a Specific User

Example 5: Counting of All Messages by User

ihRawData Examples
Example 1: Retrieving All Samples Where a Value Was Outside the Query Supplied Values

Example 2: Retrieving All Bad Samples (Raw Data)

Example 3: Counting the Number of Bad Samples (Raw Data)

Example 4: Retrieving All Bad Samples Over the Last Day (Interpolated Data)

Example 5: Using an Explicit Time Zone

Example 6: Performing a Simple Sequence of Events

Example 7: Reporting the Busiest Tags

Example 8: Retrieving All Bad Samples Over the Last Day

Example 9: Retrieving All Bad Samples, Ignoring End of Collection Markers

Example 10: Counting the Number of Bad Samples, Ignoring End of Collection Markers

Example 11: Obtaining All Raw Samples from Yesterday with Comments

Example 12: Determining the Number of Good Milliseconds Per Interval

Example 13: Retrieving Raw Minimum and Maximum Values per Interval

ihComments Examples
Example 1: Retrieving All Comments for a Tag for This Month

Example 2: Retrieving Comments Containing a Substring

Example 3: Retrieving All Comments in an Archive

ihTrend Examples
Example 1: Retrieving the Value and Quality of the First 50 Tags

Example 2: Retrieving the Value for the First 100 Tags

Example 3: Retrieving the Values of All Tags Matching a Certain Pattern

Example 4: Retrieving the Hourly Interpolated Values for TagNames Matching *0001

Example 5: Retrieving the Maximum Values of All TagNames Matching *0001

Example 6: Selecting Interpolated Values for All Single Float Tags

Example 7: Selecting Interpolated Dat

a for TagNames Matching sim*

ihQuerySettings Examples
Example 1: Showing All Settings for the Current Session

Example 2: Showing the Selected Session Settings

ihCalculationDependencies Examples
Example 1: Displaying the Dependencies for a Specified Tag

Example 2: Showing All Dependencies for Specified a Dependent Tag

ihAlarms Examples
Example 1: Show all alarms for the last two hours, including vendor attributes

Example 2: Show alarm history

Example 3: Show Tracking and System Events

Example 4: Return all closed events

Example 5: Return all closed events for a specific tag

//////////////////////////////////////////////////////////////////////////////////////////////////////////

某些OPC Server返回TRUE值为-1时Historian的EGU设置


Hi Engineering Units = 0
Lo Engineering Units = 1
Hi Scale Value = 0
Lo Scale Value = - 1
Input Scaling = Enabled
/////////////////////////////////////////////////////////////////////////

使用Web Administrator时IE的设置


工具\Internet选项\常规设置\选择每次启动IE时检查。

用BROWSER FROM COLLECTOR时显示不正确的时候,清除IE临时文件即可!

/////////////////////////////////////////////////////////////////////////////////////
Historian防火墙问题


远程客户端要访问通过防火墙的Historian Server时,在防火墙中开端口14000。

//////////////////////////////////////////////////////////////////////////////////////
Historian关于同一台机配置多个PI采集器


1.运行regedit.exe。

2.找到HKEY_LOCAL_MACHINE\SOFTWARE\Intellution, Inc.\iHistorian\Services\PICollector。

3.新建一个键,命名为PI01(任意不重复)。

4.在PI01中增加一个STRING值,命名为InterfaceName;在InterfaceName中输入OSI PI服务器名。

5.在PI01中增加一个STRING值,命名为HistorianNodeName;在HistorianNodeName中输入Historian服务器名.

6.保存退出。

7.运行“iHPICollector.exe -multiple REG=PI01”即可,重复1-5可再添加。

PS:同一台机配置多个PI Distributor的方法相同。找到HKEY_LOCAL_MACHINE\SOFTWARE\Intellution, Inc.\iHistorian\Services\PIdistributor。添加方法相同。然后运行“iHPIdistributor.exe -multiple REG=PI01”。



////////////////////////////////////////////////////////////////////////////////////////////
Historian中把数据写入iFix中的代码


用的是iFIX的FDS(放到Caculation Tag的Caculation中):
Dim FDS
Dim the_sec
on error resume next
the_sec = Second(CurrentTime())
Set FDS = CreateObject("FixDataSystems.Intellution FD Data System Control")
if err.number = 0 then
FDS.Groups.Add ("Group1")
FDS.Groups.Item("Group1").DataItems.Add "Fix32.T20.TAG1.F_CV"
FDS.Groups.Item("Group1").DataItems.Item(1).Value = the_sec
FDS.Groups.Item("Group1").Write
FDS.Groups.Clear
Result = the_sec
SET F

DS = Nothing
else
返回值不在0-50,无效
result = 99
end if

///////////////////////////////////////////////////////////////////////////////////////////////////////
Proficy Historian数据采集器自动启动的几种方法


1.作为WINDOWS服务启动(开始\控制面板\管理工具\服务)。但有的不能作为服务启动,例如iFix、Cimplicity等。iFix可以放入其任务列表中(ihFixCollector.exe),,命令行输入“runasdos”。随iFix启动;Cimplicity随Project启动。

2.放入开始菜单的启动内,开机启动。

3.作为WINDOWS的任务计划启动(控制面板\计划任务)。也可用此种方法backup Archive,只要添加计划“ihArchiveBackup.EXE”就可以了。



肯定有种方法适合你!

////////////////////////////////////////////////////////////////////////////////////////////////////






相关主题
文本预览
相关文档 最新文档