将所有需要的数据组合成real数值之后,在citect项目程序中建立变量标签,对应PLC地址,再建立趋势标签,对应变量标签。趋势标签可以定义趋势数据窜访的路径、趋势文件生成时间,趋势文件的个数,趋势数据采集的频率,这几个参数可以根据硬盘分区的大小来灵活设定。如果有双硬盘的话,后面的脚本可以定时将趋势数据备份到第二硬盘,一定程度上可以保障五年的数据存储要求。
2. 对OCX控件注册,将空间文件拷贝到c:\windows\system32\路径下,使用regsvr32指令进行注册,还要运行一下注册表文件,那个注册表文件再我的其它博客有过介绍,使microsoft date and time picker控件和microsoft form 2.0 checkbox控件有效。
3. 在新建画面上放置microsoft date and time picker控件、microsoft form 2.0 checkbox控件、过程分析器控件。
4. 过程分析器控件上按照顺序配置趋势笔,这个简单不截图了。记下过程分析其的AN编号为4
5. 记下各checkbox控件的编号。
6. 新建citectVBA程序文件。新建过程分析器初始化sub
Sub PAIni() '趋势控件初始化,现时显示游标、数据板命名、趋势笔命名
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Dim hCursor As Object
Dim cb As Object
Set cb=HUANBAO_AN11
cb.value=true
Set cb=HUANBAO_AN13
cb.value=true
Set cb=HUANBAO_AN17
cb.value=true
Set cb=HUANBAO_AN19
cb.value=true
Set cb=HUANBAO_AN21
cb.value=true
Set cb=HUANBAO_AN23
cb.value=true
Set cb=HUANBAO_AN25
cb.value=true
Set cb=HUANBAO_AN27
cb.value=true
Set cb=HUANBAO_AN29
cb.value=true
Set cb=HUANBAO_AN31
cb.value=true
Set cb=HUANBAO_AN33
cb.value=true
Set cb=HUANBAO_AN35
cb.value=true
Set cb=HUANBAO_AN37
cb.value=true
Set cb=HUANBAO_AN39
cb.value=true
Set cb=HUANBAO_AN41
cb.value=true
Set cb=HUANBAO_AN43
cb.value=true
Set cb=HUANBAO_AN45
cb.value=true
Set cb=HUANBAO_AN47
cb.value=true
Set cb=HUANBAO_AN48
cb.value=true
Set pa=HUANBAO_AN4 '趋势控件
Set hCursor=pa.cursors.create("cursor1",500)
hCursor.visible=true
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
hPane.Name="1#2#焦炉干熄焦排放口数据"
Set hPens=hPane.Pens
Set hPen=hPens.item(1)
hCursor.PenlabelX(hPen)=100
hCursor.PenlabelY(hPen)=40
hPen.Name="颗粒物"
Set hPen=hPens.item(2)
hCursor.PenlabelX(hPen)=300
hCursor.PenlabelY(hPen)=40
hPen.Name="SO2"
Set hPen=hPens.item(3)
hCursor.PenlabelX(hPen)=100
hCursor.PenlabelY(hPen)=90
hPen.Name="O2"
Set hPen=hPens.item(4)
hCursor.PenlabelX(hPen)=300
hCursor.PenlabelY(hPen)=90
hPen.Name="流速"
Set hPen=hPens.item(5)
hCursor.PenlabelX(hPen)=100
hCursor.PenlabelY(hPen)=140
hPen.Name="温度"
Set hPen=hPens.item(6)
hCursor.PenlabelX(hPen)=300
hCursor.PenlabelY(hPen)=140
hPen.Name="压力"
Set hPen=hPens.item(7)
hCursor.PenlabelX(hPen)=100
hCursor.PenlabelY(hPen)=190
hPen.Name="湿度"
Set hPen=hPens.item(8)
hCursor.PenlabelX(hPen)=300
hCursor.PenlabelY(hPen)=190
hPen.Name="流量"
Set hPen=hPens.item(9)
hCursor.PenlabelX(hPen)=100
hCursor.PenlabelY(hPen)=240
hPen.Name="提升机作业时间"
Set hPen=hPens.item(10)
hCursor.PenlabelX(hPen)=300
hCursor.PenlabelY(hPen)=240
hPen.Name="提升机装载量"
Set hPen=hPens.item(11)
hCursor.PenlabelX(hPen)=100
hCursor.PenlabelY(hPen)=290
hPen.Name="1#提升机提升电流"
Set hPen=hPens.item(12)
hCursor.PenlabelX(hPen)=300
hCursor.PenlabelY(hPen)=290
hPen.Name="2#提升机提升电流"
Set hPen=hPens.item(13)
hCursor.PenlabelX(hPen)=100
hCursor.PenlabelY(hPen)=340
hPen.Name="1#提升机提升走行电流"
Set hPen=hPens.item(14)
hCursor.PenlabelX(hPen)=300
hCursor.PenlabelY(hPen)=340
hPen.Name="2#提升机提升走行电流"
Set hPen=hPens.item(15)
hCursor.PenlabelX(hPen)=100
hCursor.PenlabelY(hPen)=390
hPen.Name="预存室压力"
Set hPen=hPens.item(16)
hCursor.PenlabelX(hPen)=300
hCursor.PenlabelY(hPen)=390
hPen.Name="集尘电动阀开到位"
Set hPen=hPens.item(17)
hCursor.PenlabelX(hPen)=100
hCursor.PenlabelY(hPen)=440
hPen.Name="集尘电动阀关到位"
Set hPen=hPens.item(18)
hCursor.PenlabelX(hPen)=300
hCursor.PenlabelY(hPen)=440
hPen.Name="除尘风机电流"
pa.Objectview.visible=false
End Sub
这里面对趋势笔名称中文显示、趋势标签定位、复选框初始状态、显示游标及游标定位做了初始化。
在画面的“进入画面时”事件中使用cicode脚本调用这个citectVBA脚本
VbCallReturn(VbCallRun(vbcallopen("PAIni")))
7. “全选趋势”复选框编号为11,对选中和取消事件的citectVBA脚本如下:
Sub HUANBAO_AN11_Change() '全选趋势复选框
Dim cb As Object
Set cb= HUANBAO_AN11
If cb.value Then '如果可见
Set cb=HUANBAO_AN13
cb.value=true
Set cb=HUANBAO_AN17
cb.value=true
Set cb=HUANBAO_AN19
cb.value=true
Set cb=HUANBAO_AN21
cb.value=true
Set cb=HUANBAO_AN23
cb.value=true
Set cb=HUANBAO_AN25
cb.value=true
Set cb=HUANBAO_AN27
cb.value=true
Set cb=HUANBAO_AN29
cb.value=true
Set cb=HUANBAO_AN31
cb.value=true
Set cb=HUANBAO_AN33
cb.value=true
Set cb=HUANBAO_AN35
cb.value=true
Set cb=HUANBAO_AN37
cb.value=true
Set cb=HUANBAO_AN39
cb.value=true
Set cb=HUANBAO_AN41
cb.value=true
Set cb=HUANBAO_AN43
cb.value=true
Set cb=HUANBAO_AN45
cb.value=true
Set cb=HUANBAO_AN47
cb.value=true
Set cb=HUANBAO_AN48
cb.value=true
Else
Set cb=HUANBAO_AN13
cb.value=false
Set cb=HUANBAO_AN17
cb.value=false
Set cb=HUANBAO_AN19
cb.value=false
Set cb=HUANBAO_AN21
cb.value=false
Set cb=HUANBAO_AN23
cb.value=false
Set cb=HUANBAO_AN25
cb.value=false
Set cb=HUANBAO_AN27
cb.value=false
Set cb=HUANBAO_AN29
cb.value=false
Set cb=HUANBAO_AN31
cb.value=false
Set cb=HUANBAO_AN33
cb.value=false
Set cb=HUANBAO_AN35
cb.value=false
Set cb=HUANBAO_AN37
cb.value=false
Set cb=HUANBAO_AN39
cb.value=false
Set cb=HUANBAO_AN41
cb.value=false
Set cb=HUANBAO_AN43
cb.value=false
Set cb=HUANBAO_AN45
cb.value=false
Set cb=HUANBAO_AN47
cb.value=false
Set cb=HUANBAO_AN48
cb.value=false
End If
End Sub
这个脚本影响其它单个趋势选中/取消复选框的选择状态
8. 单个趋势选择框事件的citectVBA脚本如下
Sub HUANBAO_AN13_Change() '趋势笔1-颗粒无物显示和隐藏
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
Set hPen=hPens.item(1)
If HUANBAO_AN13.value Then '如果可见
hPen.Visible=true
Else
hPen.Visible=false
End If
End Sub
Sub HUANBAO_AN17_Change() '趋势笔2-SO2物显示和隐藏
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
Set hPen=hPens.item(2)
If HUANBAO_AN17.value Then '如果可见
hPen.Visible=true
Else
hPen.Visible=false
End If
End Sub
Sub HUANBAO_AN19_Change() '趋势笔3-O2显示和隐藏
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
Set hPen=hPens.item(3)
If HUANBAO_AN19.value Then '如果可见
hPen.Visible=true
Else
hPen.Visible=false
End If
End Sub
Sub HUANBAO_AN21_Change() '趋势笔4-流速显示和隐藏
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
Set hPen=hPens.item(4)
If HUANBAO_AN21.value Then '如果可见
hPen.Visible=true
Else
hPen.Visible=false
End If
End Sub
Sub HUANBAO_AN23_Change() '趋势笔5-温度显示和隐藏
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
Set hPen=hPens.item(5)
If HUANBAO_AN23.value Then '如果可见
hPen.Visible=true
Else
hPen.Visible=false
End If
End Sub
Sub HUANBAO_AN25_Change() '趋势笔6-压力显示和隐藏
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
Set hPen=hPens.item(6)
If HUANBAO_AN25.value Then '如果可见
hPen.Visible=true
Else
hPen.Visible=false
End If
End Sub
Sub HUANBAO_AN27_Change() '趋势笔7-湿度显示和隐藏
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
Set hPen=hPens.item(7)
If HUANBAO_AN27.value Then '如果可见
hPen.Visible=true
Else
hPen.Visible=false
End If
End Sub
Sub HUANBAO_AN29_Change() '趋势笔8-流量显示和隐藏
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
Set hPen=hPens.item(8)
If HUANBAO_AN29.value Then '如果可见
hPen.Visible=true
Else
hPen.Visible=false
End If
End Sub
Sub HUANBAO_AN31_Change() '趋势笔9-提升机作业时间显示和隐藏
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
Set hPen=hPens.item(9)
If HUANBAO_AN31.value Then '如果可见
hPen.Visible=true
Else
hPen.Visible=false
End If
End Sub
Sub HUANBAO_AN33_Change() '趋势笔10-提升机装载量显示和隐藏
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
Set hPen=hPens.item(10)
If HUANBAO_AN33.value Then '如果可见
hPen.Visible=true
Else
hPen.Visible=false
End If
End Sub
Sub HUANBAO_AN35_Change() '趋势笔11-1#提升电流显示和隐藏
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
Set hPen=hPens.item(11)
If HUANBAO_AN35.value Then '如果可见
hPen.Visible=true
Else
hPen.Visible=false
End If
End Sub
Sub HUANBAO_AN37_Change() '趋势笔12-2#提升电流显示和隐藏
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
Set hPen=hPens.item(12)
If HUANBAO_AN37.value Then '如果可见
hPen.Visible=true
Else
hPen.Visible=false
End If
End Sub
Sub HUANBAO_AN39_Change() '趋势笔13-1#走行电流显示和隐藏
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
Set hPen=hPens.item(13)
If HUANBAO_AN39.value Then '如果可见
hPen.Visible=true
Else
hPen.Visible=false
End If
End Sub
Sub HUANBAO_AN41_Change() '趋势笔13-2#走行电流显示和隐藏
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
Set hPen=hPens.item(14)
If HUANBAO_AN41.value Then '如果可见
hPen.Visible=true
Else
hPen.Visible=false
End If
End Sub
Sub HUANBAO_AN43_Change() '趋势笔14-预存室压力显示和隐藏
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
Set hPen=hPens.item(15)
If HUANBAO_AN43.value Then '如果可见
hPen.Visible=true
Else
hPen.Visible=false
End If
End Sub
Sub HUANBAO_AN45_Change() '趋势笔15-预存室电动阀开到位显示和隐藏
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
Set hPen=hPens.item(16)
If HUANBAO_AN45.value Then '如果可见
hPen.Visible=true
Else
hPen.Visible=false
End If
End Sub
Sub HUANBAO_AN47_Change() '趋势笔16-预存室电动阀开关到位显示和隐藏
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
Set hPen=hPens.item(17)
If HUANBAO_AN47.value Then '如果可见
hPen.Visible=true
Else
hPen.Visible=false
End If
End Sub
Sub HUANBAO_AN48_Change() '趋势笔16-除尘风机干流显示和隐藏
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
Set hPen=hPens.item(18)
If HUANBAO_AN48.value Then '如果可见
hPen.Visible=true
Else
hPen.Visible=false
End If
End Sub
9. 根据选择的开始时间和结束时间的查询citectVBA脚本如下,这里面要做一个容错检查,不能让开始日期晚于结束日期。由于脚本里面希望选择的时间默认为该日期的:0:0,系统里面又自动的+8小时,所以又一个根据选择的日期,将时间往昨天推8小时的脚本计算,由于查询历史趋势,不希望事件滚动,做了暂停功能。
'按照选择的时间查询趋势
Sub SearchTrend() '趋势按照开始时间和结束时间查询,趋势暂停
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Dim startDTPicker As Object
Dim endDTPicker As Object
Dim StartTime As date
Dim EndTime As date
Dim Year1 As Integer
Dim Month1 As Integer
Dim Day1 As Integer
Dim Year2 As Integer
Dim Month2 As Integer
Dim Day2 As Integer
Dim temp1 As Integer
Dim temp2 As Integer
Dim i As Integer
Set pa=HUANBAO_AN4 '趋势控件
Set startDTPicker =HUANBAO_AN7 '开始日期选择控件
Set endDTPicker =HUANBAO_AN9 '结束日期选择控件
If startDTPicker.value > endDTPicker.value Then
msgbox "开始日期不能晚于结束日期"
Else
'因为用户选择的日期时间属于UTC时间,与北京时间有8小时差距,这个版本的软件没有Citectvba函数直接转换,需要人工变成编程
Year1=startDTPicker.year
Month1=startDTPicker.month
day1=startDTPicker.day
Year2 = endDTPicker.year
Month2 =endDTPicker.month
Day2 =endDTPicker.day
temp1 = int(year1/4)
temp2=int(year2/4)
'计算开始时间前一天
If day1<>1 Then
day1=day1-1
End If
If day1=1 Then
Select Case month1
Case 1
day1=31
month1=12
Case 2
day1=31
month1=1
Case 4
day1=31
month1=3
Case 5
day1=30
month1=4
Case 6
day1=31
month1=5
Case 7
day1=30
month1=6
Case 8
day1=31
month1=7
Case 9
day1=31
month1=8
Case 10
day1=30
month1=9
Case 11
day1=31
month1=10
Case 12
day1=30
month1=11
Case 3
month1=2
If year1-temp1*4=0 Then '闰年
day1=29
Else '平年
day1=28
End If
End Select
End If
startTime=CDate(cstr(year1) & "-" & cstr(month1) & "-" & cstr(day1) & " 16:00:00")
'计算开始结束时间前一天
If day2<>1 Then
day2=day2-1
End If
If day2=1 Then
Select Case month2
Case 1
day2=31
month2=12
Case 2
day2=31
month2=1
Case 4
day2=31
month2=3
Case 5
day2=30
month2=4
Case 6
day2=31
month2=5
Case 7
day2=30
month2=6
Case 8
day2=31
month2=7
Case 9
day2=31
month2=8
Case 10
day2=30
month2=9
Case 11
day2=31
month2=10
Case 12
day2=30
month2=11
Case 3
month2=2
If year2-temp2*4=0 Then '闰年
day2=29
Else '平年
day2=28
End If
End Select
End If
EndTime=CDate(cstr(year2) & "-" & cstr(month2) & "-" & cstr(day2) & " 16:00:00")
'暂停刷新
pa.Autoscroll=false
Set hPanes=pa.panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
'设置1#趋势笔的开始时间和结束时间
For i=1 To 18
Set hPen=hPens.item(i)
hPen.PutHorizontalAxisTimeSpan startTime,0,EndTime,0
'设置2#趋势笔的开始时间和结束时间
'Set hPen=hPens.item(2)
'hPen.PutHorizontalAxisTimeSpan startTime,0,EndTime,0
Next
End If
End Sub
在趋势查询按钮鼠标事件使用cicode调用前面的脚本
VbCallReturn(VbCallRun(vbcallopen("SearchTrend")))
10。 跳转到当前时刻的citectVBA脚本如下:
Sub JumpToNow() '趋势跳转到当前
Dim pa As Object
Dim hPanes As Object
Dim hPane As Object
Dim hPens As Object
Dim hPen As Object
Dim i As Integer
Set pa = HUANBAO_AN4 '指向趋势控件
Set hPanes=pa.Panes
Set hPane=hPanes.item(1)
Set hPens=hPane.pens
For i=1 To 18
Set hPen=hPens.item(i)
hPen.GotoNow
'Set hPen=hPens.item(2)
'hPen.GotoNow
Next
pa.Autoscroll=true '自动滚动
End Sub
相关按钮的鼠标事件使用cicode调用上面的脚本
VbCallReturn(VbCallRun(vbcallopen("JumpToNow")))
11. 还做了一个复制趋势文件的功能,这个是用的是cicode脚本
FUNCTION FileBakup() //复制趋势文件到指定的路径
STRING sPath,sBak
//拷贝整个文件夹到目标文件夹
sPath=FileFind("C:\Program Files\Citect\CitectSCADA\Data\*.*", 0)
WHILE StrLength(sPath) > 0 DO
sBak ="E:\HISDATA"
FileCopy(sPath,sBak, 0); ! Find the next file
sPath =FileFind("", 0)
END
sPath=FileFind("C:\Program Files\Citect\CitectSCADA\Data\TRENDX\*.*", 0)
WHILE StrLength(sPath) > 0 DO
sBak ="E:\HISDATA\TRENDX"
FileCopy(sPath,sBak, 0); ! Find the next file
sPath =FileFind("", 0)
END
Message("注意","趋势数据备份到E:\HISDATA",0)
END
至此,功能就做完了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?