###################################################################################### # myOPC.py # ###################################################################################### ''' autor : Katarzyna Gebal Narrow Gate Logic www.nglogic.com''' ###################################################################################### ''' OPC Client project file''' ###################################################################################### import win32com.client import win32api import pythoncom import time import sys """ OPC FUNCTIONS """ # get items from OPC server def getOPCItems(server): # Get OPC servers and set the selected value serverList = getServerList() if serverList == None: Error('No servers available') elif server not in serverList: Error('Requested server not available') else: # connect to server (opcServer,group) = connectServer(self.main.deviceList[self.deviceText].server) # get the items available in OPC server try: itemList = getOPCItemsList(opcServer) except Exception: Error('Error obtaining server items') # disconnect try: disconnectServer(opcServer) except: self.Error('Error disconnecting server') return itemList # The function gets access to the the OPC automation object. # computerName parameter is given when we want to make remote connection by using DCOM. # The function returns OPCServer object. def connectCOMOPC(computerName=None): if computerName == None: opcServer = win32com.client.Dispatch('OPC.Automation.1') else: # can connect to remote computer opcServer = win32com.client.DispatchEx('OPC.Automation.1',computerName,clsctx=pythoncom.CLSCTX_ALL) return opcServer # The function returns the tuple of names (ProgIDs) of the registered OPC Servers. # This names are used when we connect to the server. # computerName parameter is given when we want to make remote connection by using DCOM. def getServerList(computerName=None): try: return connectCOMOPC(computerName).GetOPCServers() except Exception: return None # The function connects to an opc server. # It creates one private OPCGroup. This group will be used to to access items. # It returns the tuple of OPCServer object and the OPCGroup object. def connectServer(serverName,computerName=None): try: opcServer = connectCOMOPC(computerName) opcServer.Connect(serverName) groups = opcServer.OPCGroups group = groups.Add() group.IsActive = 1 group.IsSubscribed = 1 return (opcServer,group) except Exception: return (None,None) # The function disconects from the OPC Server. def disconnectServer(opcServer): opcServer.OPCGroups.RemoveAll() # cleaning up opcServer.Disconnect() opcServer = None # The function traverses recursively the hierarchical structure of item's namespaces. # It appends all found items to the list. def opcAppendLeafs(browser,list): browser.ShowLeafs() for leaf in browser: list.append(browser.GetItemID(leaf)) browser.ShowBranches() for branch in browser: browser.MoveDown(branch) opcAppendLeafs(browser,list) browser.MoveUp() # Function tries to get the items that exist in the opcServer. # It uses OPCbrowser object. # Sometimes it is not possible to get all existing item names. # The ability of browsing depends on the server configuration. def getOPCItemsList(opcServer): try: list = [] browser = opcServer.CreateBrowser() browser.AccessRights = 3 browser.MoveToRoot() opcAppendLeafs(browser,list) return list except Exception: return None # Adds item to the private group group def addItem(itemID,group): try: return group.OPCItems.AddItem(itemID,1) except Exception: return None # Function reads value quality and timestamp of the item # 0x1 means that values are read from the OPCcache # The second possible option (0x2) is reading directly from the device. # Function returns the tuple of the value, quality and the time stamp def readItemValue(opcItem): return opcItem.Read(0x1) # Function writes value to the opc server # An error appears if the conversion of value type to the required # item type is not possible. def writeItemValue(opcItem,value): opcItem.Write(value)