加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

ABBAC900F学习笔记234:OPC通讯19

(2022-04-14 08:38:05)
标签:

abb

ac900f

freelance

opc

分类: ABBDCS
前面实际练习了在同一台计算机上,使用excel的VBA读写ABB freelance OPC server变量的方法,虽然有点阻碍,但还是顺利实现了。这一篇联系一下在同一台台计算机上,freelance作为OPC server,读写取系统消息怎么实现。

昨天做的ABB项目上加入功能块,做模拟量报警功能
ABBAC900F学习笔记234:OPC通讯19

ABBAC900F学习笔记234:OPC通讯19


ABBAC900F学习笔记234:OPC通讯19

ABBAC900F学习笔记234:OPC通讯19
可以看出这些报警限值是允许运行时修改的,后面OPC客户端写数值也就有了可能。

和昨天的练习一样,新建一个可以运行宏的excel文件,在开发工具VBA里面,先勾选
ABBAC900F学习笔记234:OPC通讯19

插入下面的代码:
Option Explicit
Dim Server As IOPCServerDisp '引用服务器对象
Dim ServerName As String '服务器名字
Dim Group As IOPCItemMgtDisp '引用组对象
Dim ServerUpdateRate As Long '更新速率
Dim ServerGroupHandle As Long '将包含服务器生成的组句柄
Dim NrOfItems As Long '本程序OPC项目的数量
Dim ItemIDs() As String 'OPC项名字数组
Dim ActiveStates() As Boolean 'OPC每个项的活动状态数组
Dim ClientHandles() As Long '每个项目的客户端句柄的数组
Dim AccessPaths() As String '每一个项目的访问路径的数组
Dim RequestedDataTypes() As Integer '每一个项目需求数据类型的数组
Dim ItemsErrors As Variant '每一个项目的错误代码
Dim ServerHandles As Variant '包含每一个项目的服务器句柄
Dim ItemObjects As Variant '将包含对每个项目的引用

Sub OPCExmpleMacro()
Dim i, ActualHour, ActualMinute, ActualSecond, WaitingTime '本地变量
NrOfItems = 7 '如果想读取更多的项目,就修改这个数值
'更新那些数组的daxiao
ReDim ItemIDs(NrOfItems)
ReDim AccessPaths(NrOfItems)
ReDim ClientHandles(NrOfItems)
ReDim AccessPaths(NrOfItems)
ReDim RequestedDataTypes(NrOfItems)
ReDim ActiveStates(NrOfItems)
ReDim ItemObjects(NrOfItems)
'开始配置服务器
ServerName = "Freelance2000OPCServer.24.1"
Set Server = CreateObject(ServerName)
'添加一个组到服务器
Set Group = Server.AddGroup("Group 1", True, 1000, 1, 0, &H409, ServerGroupHandle, ServerUpdateRate)
'设置项目名字
ItemIDs(0) = "LT1001_ANA/IN" '功能块输入数值
ItemIDs(1) = "LT1001_ANA/L1" '第1个限值设定值
ItemIDs(2) = "LT1001_ANA/L2" '第2个限值设定值
ItemIDs(3) = "LT1001_ANA/SL1" '第1个报警输出
ItemIDs(4) = "LT1001_ANA/SL2" '第2个报警输出
ItemIDs(5) = "LT1001_ANA/Mba" '量程上限
ItemIDs(6) = "LT1001_ANA/Mbe" '量程下限

'设置客户端句柄,激活项目状态
For i = 0 To NrOfItems - 1
       ClientHandles(i) = i + 1 '每个项目的客户端句柄不同
       ActiveStates(i) = True
Next

'添加项目到组
Group.AddItems NrOfItems, ItemIDs, ActiveStates, ClientHandles, ServerHandles, ItemsErrors, ItemObjects, AccessPaths, RequestedDataTypes
'没有按下Ctrl+Break,那么每2秒更新一次数据
Worksheets(1).Visible = True
While True
    ActualHour = Hour(Now())
    ActualMinute = Minute(Now())
    ActualSecond = Second(Now()) + 2
    WaitingTime = TimeSerial(ActualHour, ActualMinute, ActualSecond)
    Application.Wait WaitingTime
    Worksheets(1).Cells(3, 1) = "服务器名:"
    Worksheets(1).Cells(3, 2) = ServerName
    Worksheets(1).Cells(4, 1) = "标签名:"
    Worksheets(1).Cells(4, 2) = ItemObjects(0).ItemID
    Worksheets(1).Cells(4, 3) = "访问权限:"
    Worksheets(1).Cells(4, 4) = ItemObjects(0).AccessRights
    Worksheets(1).Cells(4, 5) = "输入数值:"
    Worksheets(1).Cells(4, 6) = ItemObjects(0).Value
    Worksheets(1).Cells(4, 7) = "质量:"
    Worksheets(1).Cells(4, 8) = ItemObjects(0).Quality
    Worksheets(1).Cells(4, 9) = "时间戳:"
    Worksheets(1).Cells(4, 10) = ItemObjects(0).TimeStamp
       
    Worksheets(1).Cells(5, 1) = "标签名:"
    Worksheets(1).Cells(5, 2) = ItemObjects(1).ItemID
    Worksheets(1).Cells(5, 3) = "访问权限:"
    Worksheets(1).Cells(5, 4) = ItemObjects(1).AccessRights
    Worksheets(1).Cells(5, 5) = "第一个限定数值:"
    Worksheets(1).Cells(5, 6) = ItemObjects(1).Value
    Worksheets(1).Cells(5, 7) = "质量:"
    Worksheets(1).Cells(5, 8) = ItemObjects(1).Quality
    Worksheets(1).Cells(5, 9) = "时间戳:"
    Worksheets(1).Cells(5, 10) = ItemObjects(1).TimeStamp
       
    Worksheets(1).Cells(6, 1) = "标签名:"
    Worksheets(1).Cells(6, 2) = ItemObjects(2).ItemID
    Worksheets(1).Cells(6, 3) = "访问权限:"
    Worksheets(1).Cells(6, 4) = ItemObjects(2).AccessRights
    Worksheets(1).Cells(6, 5) = "第二个限定数值:"
    Worksheets(1).Cells(6, 6) = ItemObjects(2).Value
    Worksheets(1).Cells(6, 7) = "质量:"
    Worksheets(1).Cells(6, 8) = ItemObjects(2).Quality
    Worksheets(1).Cells(6, 9) = "时间戳:"
    Worksheets(1).Cells(6, 10) = ItemObjects(2).TimeStamp
       
    Worksheets(1).Cells(7, 1) = "标签名:"
    Worksheets(1).Cells(7, 2) = ItemObjects(3).ItemID
    Worksheets(1).Cells(7, 3) = "访问权限:"
    Worksheets(1).Cells(7, 4) = ItemObjects(3).AccessRights
    Worksheets(1).Cells(7, 5) = "第一个报警输出:"
    Worksheets(1).Cells(7, 6) = ItemObjects(3).Value
    Worksheets(1).Cells(7, 7) = "质量:"
    Worksheets(1).Cells(7, 8) = ItemObjects(3).Quality
    Worksheets(1).Cells(7, 9) = "时间戳:"
    Worksheets(1).Cells(7, 10) = ItemObjects(3).TimeStamp
       
    Worksheets(1).Cells(8, 1) = "标签名:"
    Worksheets(1).Cells(8, 2) = ItemObjects(4).ItemID
    Worksheets(1).Cells(8, 3) = "访问权限:"
    Worksheets(1).Cells(8, 4) = ItemObjects(4).AccessRights
    Worksheets(1).Cells(8, 5) = "第二个报警输出:"
    Worksheets(1).Cells(8, 6) = ItemObjects(4).Value
    Worksheets(1).Cells(8, 7) = "质量:"
    Worksheets(1).Cells(8, 8) = ItemObjects(4).Quality
    Worksheets(1).Cells(8, 9) = "时间戳:"
    Worksheets(1).Cells(8, 10) = ItemObjects(4).TimeStamp
       
    Worksheets(1).Cells(9, 1) = "标签名:"
    Worksheets(1).Cells(9, 2) = ItemObjects(5).ItemID
    Worksheets(1).Cells(9, 3) = "访问权限:"
    Worksheets(1).Cells(9, 4) = ItemObjects(5).AccessRights
    Worksheets(1).Cells(9, 5) = "量程下限:"
    Worksheets(1).Cells(9, 6) = ItemObjects(5).Value
    Worksheets(1).Cells(9, 7) = "质量:"
    Worksheets(1).Cells(9, 8) = ItemObjects(5).Quality
    Worksheets(1).Cells(9, 9) = "时间戳:"
    Worksheets(1).Cells(9, 10) = ItemObjects(5).TimeStamp
       
    Worksheets(1).Cells(10, 1) = "标签名:"
    Worksheets(1).Cells(10, 2) = ItemObjects(6).ItemID
    Worksheets(1).Cells(10, 3) = "访问权限:"
    Worksheets(1).Cells(10, 4) = ItemObjects(6).AccessRights
    Worksheets(1).Cells(10, 5) = "量程上限:"
    Worksheets(1).Cells(10, 6) = ItemObjects(6).Value
    Worksheets(1).Cells(10, 7) = "质量:"
    Worksheets(1).Cells(10, 8) = ItemObjects(6).Quality
    Worksheets(1).Cells(10, 9) = "时间戳:"
    Worksheets(1).Cells(10, 10) = ItemObjects(6).TimeStamp
  
Wend
End Sub

执行这些代码,可以看到标签LT1001_ANA中的参数被读取过来了
ABBAC900F学习笔记234:OPC通讯19

在freelance中修改数值,相应的客户端里面数值也发生了变化。

仔细看上面的表格,可以发现时间戳比计算机时间,也就是北京时间差了8小时,这个是时区差距造成的。在上面的程序里面修改时间戳语句,小时那里+8/24就可以了,比如:
Worksheets(1).Cells(4, 10) = ItemObjects(0).TimeStamp + 8 / 24
这样一来,表格就是这样子了
ABBAC900F学习笔记234:OPC通讯19


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有