Write an OPC client with VB to access WinCC

zhaozj2021-02-16  28

Write an OPC client with VB to access WinCC

OPC is an industrial standard that is established by some world-renowned automation systems and hardware, software companies and Microsoft (Microsoft). [O represents OLE (object links and embedded), P (Process Process), C (Control Control). OLE has been redefined from object-oriented to object and renamed Active X.

WinCC is a work control software that Siemens has adopted the most advanced technology and Microsoft companies in the automation field. WinCC is Windows Control Center. WinCC is a powerful and fully open monitoring system that can be used to complete small-scale simple process monitoring applications, or to complete complex applications. In any case, WinCC can generate a beautiful and convenient human-machine dialog interface that enables the operator to clearly manage and optimize the production process. It integrated OLE for Process Control servers allows process data to be accessed by other applications (OPC clients).

WinCC provides OPC client control: Siemens OPC Daautomation 2.0 (Sopcdauto.dll), this control is the control we want to use in VB, we can also use universal OPC client control: OPC Automation 2.0.

In WinCC, there is a shortcomings used by Siemens OPC Daautomation 2.0, but it is not very detailed. I have encountered a lot of problems in use, and I will write it together, and share it with you.

First, OPC connection

Join nearly Siemens OPC Daautomation 2.0 in "Reference" and then begin to define global variables. In this program, I used two OPC groups for OPC access, so defined global variables. We must first define the OPC service type and computer node name. Define the OPC group and the OPC tag group. And define the OPC's label array and value, note that the value group must be set to Variant.

'OPC processing: Only for WinCC

Const servername = "opcserver.wincc" 'OPC type

Const nodename = "guk" 'Name, ie computer name

'Dim NodeName as String

DIM WITHEVENTS MyOpcserVer AS OPCServer 'OPC Service

DIM MyOpcGroupColl as opcgroups'

DIM WITHEVENTS MyOpcGroupOut as opcgroup 'OPC group, this program uses two groups OPC connection

DIM WITHEVENTS MyOpcGroupin As Opcgroup

DIM MyOpciteMcollin As Opcitems' OPC Tag Group

DIM MyOpCItemcollout as opcitems

DIM ServerHandlesin () AS Long 'handle

DIM ServerHandLesout () As long

Dim Errorsin () AS Long 'error handle

Dim Errorsout () as long

Dim WatchDataReadItem (100) AS String 'Records OPC Label

DIM WATCHDATAREADVALUE (100) AS VARIANT 'Store OPC DIM WatchDataWriteItem (100) AS String' Record OPC Label

DIM WatchDataWriteValue (100) as variant 'Store the value of OPC

After defining all variables, we will perform an OPC connection. Before you want to configure the OPC tag name you want to access, our WatchDataReadItem, WatchDataWriteItem, join the appropriate label name, note: These two arrays must be 1 Start, can't start from 0.

After configuring the label, you have to connect OPC. As the face program:

1, ClientHandles1 first configure the list of the name, which will be used when reading the value of the OPC tag

2, generate an OPC object,

3, perform an OPC tag connection

To this: OPC connection is successful, we can read and write to OPC.

'------------------------------------- --------------------

'SUB STARTCLIENT ()

'Purpose: Connect to OPC_SERVER, create groups and add entries

'------------------------------------- --------------------

Private sub startclient ()

DIM ITEMNUM AS INTEGER

DIM TARNSCATIONID AS Long

DIM CANCEID AS Long

Dim ClientHandles1 (100) as long

DIM II AS INTEGER

ON Error Goto HandleError

FOR II = 0 to 100

ClientHandles1 (II) = II First configure the licensed index, which will be used when the value of the OPC tag is read

Next II

TARNSCATIONID = 1

'Nodename = xprofile.getvalue ("system", "nodename")

'Generate OPC objects,

Set myopcserver = new opcserver

Myopcserver.connect ServerName, Nodename

Set myopcgroupcoll = myopcserver.opcgroups

Myopcgroupcoll.defaultgroupisactive = true

Set myopcgroupin = myopcgroupcoll.add ("mygroupin")

Set myopcgroupout = myopcgroupcoll.add ("mygroupout")

Set myopcitemcollin = myopcgroupin.opcitems

Set myopcitemcollout = myopcgroupout.opcitems

'Connection to OPC tags

IF WRITEIDEX> 0 THEN

Myopcitemcollout.addItems WriteItemidex, WatchDataWriteItem, ClientHandles1, ServerHandLesout, Errorsout 'Initializing OCP connection

Myopcgroupout.issubscribed = true

End ifif readitemidex> 0 THEN

MyopcitemCollin.Additems ReadItemidex, WatchDataReadItem, ClientHandles1, ServerHandlesin, Errorsin 'initialization OCP connection

Myopcgroupin.issubscribed = true

END IF

EXIT SUB

HandleError:

Needopcrestart = TRUE

Xlog1.log "OPCL connection error"

End Sub

Second, OPC label reading and writing

Reads for OPC tags can be read through the MyopcGroupin group with myopcgroupout's DataChange event. The event has multiple parameters: where NumItems is the number of indicator changes, clientHandles is the label index of the value, ItemValues ​​is the data of the value, the specific meaning of ClientHandles (1) is its corresponding label array Index, the value of the OPC tag that it is referred to is in ItemVALUES (1). In general, when the event is just connected, the event will read all the OPC tag values ​​that all of them (the order is different, to pass the clientHandles index), which will only trigger the event when data changes. It also transmits data that has changed, without changing data does not appear in the itemValues ​​in this event.

Private sub myopcgroupout_datachange (Byval Numitems As Long, ClientHandles () As long, itemValues ​​() As Variant, Qualities () As long, timestamps () AS DATE

'Generate data changes to the next level, and the control of the roots is different.

For ii = 1 to NumItems

WatchDataWriteValue (ClientHandles (II) - 1) = ItemVALUES (II) 'Read the value of the changed value

Next II

End Sub

The write to OPC can have synchronous and asynchronous points, for a large number of data transfer, asynchronous is better, but for a small amount of data, synchronous performance is better.

To assign a value data, you must first assign value data. Note: The value data should be started by 0, that is, the value group and the tag data are not one, one correspondence, the value is more than the label, this, in WinCC Nothing in the description, but in my actual use, otherwise the data is misalign, see the procedure below.

This is a program that is returned after the cleaning is completed. Contains unpacking process,

Private Sub Showsuccess (MSG As String)

DIM Location As String

DIM NOWTIME AS STRING

Dim logstr as string

DIM Value () AS String

DIM II, TEMP AS INTEGER

DIM ISPACK AS BOOLEAN

DIM Shead, SDELIMITED, STAIL AS STRING

Location = Xprofile.GetValue (WatchPoint (Nowrunid), "location")

NOWTIME = now

Logstr = "Pull" & Location & "Success" & msgxlog1.log logstr

Logstr = "" & msg

Xlog2.log logstr 'record data

'Data upload

'If you have a package structure, the package structure is displayed.

ISPACK = Xprofile.GetValue (WatchPoint (Nowrunid), "IsRechead")

If WatchPointPointRbegin (NOWRUNID) <0 THEN EXIT SUB

IF ispack then

Shead = Xprofile.GetValue (WatchPoint (Nowrunid), "Rechead")

SDELIMITED = Xprofile.getValue (WatchPoint (Nowrunid), "RecDelimiter")

Stail = Xprofile.GetValue (WatchPoint (Nowrunid), "Recend")

Value = Split (MSG, SDELIMITED)

For ii = 0 to Ubound (value) - 1

Temp = WatchPointRbegin (NOWRUNID) II

IF Temp> WatchPointrend (NOWRUNID) THEN EXIT for

WatchDataReadValue (Temp - 1) = Value (II 1) 'Value begins with 0, less than Item 1, so minus one. There is a header, accounting for one, delayed back

Next II

Else

WatchDataReadValue (WatchPointRend (NOWRUNID) - 1) = msg

END IF

MyopcGroupin.syncWrite Readtemidex, ServerHandlesin, WatchDataReadValue, Errorsin 'data upload

'Record the time for successful execution

Xprofile.SetValue WatchPoint (NOWRUNID), "Lasttime", NOWTIME

End Sub

Third, the OPC connection is disconnected.

After the OPC client is connected, the server resource is to be taken, so if you do not need to use OPC, the OPC connection must be disconnected.

The disconnected program is quite simple, release the resource. as follows,

Sub stopclient ()

ON Error ResMe next

'----------- Release group and server object

MyopcgroupColl.removell

'----------- Disconnect with the server and clear

MyOpcserver.disconnect

Set myopcitemcollin = Nothing

Set myopcitemcollout = Nothing

Set myopcgroupin = Nothing

Set myopcgroupout = Nothing

Set myopcgroupcoll = Nothing

Set myopcserver = Nothing

End Sub

But in the actual use, it is found that frequent connections and disconnections will cause a large amount of resource of the server, and finally let the server errors. So minimize the unnecessary OPC connection and disconnection.

Conclusion:

The OPC use is used as a DCOM, so the OPC client can run on a computer running, but you must configure the access to DCOM, if you don't want to charge God, use the same username and password to log in with the same username with the client. Cheng. If you want to configure DCOM, please see the configuration of the DCOM. Reference:

"WinCC online help"

About the Author:

Gu Yu, senior programmer, Hunan University graduated, has been engaged in Linux kernel research, engaged in the development of enterprise information platform, currently engaged in SCADA development, mainly using different types of remote equipment through the same means to collect data collection, And integrated into the enterprise information platform. I like to form some integration in my work.

转载请注明原文地址:https://www.9cbs.com/read-27236.html

New Post(0)