|
1
|
|
|
import asyncio |
|
2
|
|
|
import logging |
|
3
|
|
|
|
|
4
|
|
|
from asyncua import ua, uamethod, Server |
|
5
|
|
|
|
|
6
|
|
|
|
|
7
|
|
|
# method to be exposed through server |
|
8
|
|
|
def func(parent, variant): |
|
9
|
|
|
print("func method call with parameters: ", variant.Value) |
|
10
|
|
|
ret = False |
|
11
|
|
|
if variant.Value % 2 == 0: |
|
12
|
|
|
ret = True |
|
13
|
|
|
return [ua.Variant(ret, ua.VariantType.Boolean)] |
|
14
|
|
|
|
|
15
|
|
|
|
|
16
|
|
|
# method to be exposed through server |
|
17
|
|
|
async def func_async(parent, variant): |
|
18
|
|
|
if variant.Value % 2 == 0: |
|
19
|
|
|
print("Sleeping asynchronously for 1 second") |
|
20
|
|
|
await asyncio.sleep(1) |
|
21
|
|
|
else: |
|
22
|
|
|
print("Not sleeping!") |
|
23
|
|
|
|
|
24
|
|
|
|
|
25
|
|
|
# method to be exposed through server |
|
26
|
|
|
# uses a decorator to automatically convert to and from variants |
|
27
|
|
|
|
|
28
|
|
|
|
|
29
|
|
|
@uamethod |
|
30
|
|
|
def multiply(parent, x, y): |
|
31
|
|
|
print("multiply method call with parameters: ", x, y) |
|
32
|
|
|
return x * y |
|
33
|
|
|
|
|
34
|
|
|
|
|
35
|
|
|
@uamethod |
|
36
|
|
|
async def multiply_async(parent, x, y): |
|
37
|
|
|
sleep_time = x * y |
|
38
|
|
|
print(f"Sleeping asynchronously for {x * y} seconds") |
|
39
|
|
|
await asyncio.sleep(sleep_time) |
|
40
|
|
|
|
|
41
|
|
|
|
|
42
|
|
|
async def main(): |
|
43
|
|
|
# optional: setup logging |
|
44
|
|
|
logging.basicConfig(level=logging.WARN) |
|
45
|
|
|
# logger = logging.getLogger("asyncua.address_space") |
|
46
|
|
|
# logger.setLevel(logging.DEBUG) |
|
47
|
|
|
# logger = logging.getLogger("asyncua.internal_server") |
|
48
|
|
|
# logger.setLevel(logging.DEBUG) |
|
49
|
|
|
# logger = logging.getLogger("asyncua.binary_server_asyncio") |
|
50
|
|
|
# logger.setLevel(logging.DEBUG) |
|
51
|
|
|
# logger = logging.getLogger("asyncua.uaprocessor") |
|
52
|
|
|
# logger.setLevel(logging.DEBUG) |
|
53
|
|
|
# logger = logging.getLogger("asyncua.subscription_service") |
|
54
|
|
|
# logger.setLevel(logging.DEBUG) |
|
55
|
|
|
|
|
56
|
|
|
# now setup our server |
|
57
|
|
|
server = Server() |
|
58
|
|
|
await server.init() |
|
59
|
|
|
# server.set_endpoint("opc.tcp://localhost:4840/freeopcua/server/") |
|
60
|
|
|
server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/") |
|
61
|
|
|
server.set_server_name("FreeOpcUa Example Server") |
|
62
|
|
|
|
|
63
|
|
|
# setup our own namespace |
|
64
|
|
|
uri = "http://examples.freeopcua.github.io" |
|
65
|
|
|
idx = await server.register_namespace(uri) |
|
66
|
|
|
|
|
67
|
|
|
# get Objects node, this is where we should put our custom stuff |
|
68
|
|
|
objects = server.get_objects_node() |
|
69
|
|
|
|
|
70
|
|
|
# populating our address space |
|
71
|
|
|
await objects.add_folder(idx, "myEmptyFolder") |
|
72
|
|
|
myobj = await objects.add_object(idx, "MyObject") |
|
73
|
|
|
myvar = await myobj.add_variable(idx, "MyVariable", 6.7) |
|
74
|
|
|
await myvar.set_writable() # Set MyVariable to be writable by clients |
|
75
|
|
|
myarrayvar = await myobj.add_variable(idx, "myarrayvar", [6.7, 7.9]) |
|
76
|
|
|
await myobj.add_variable( |
|
77
|
|
|
idx, "myStronglytTypedVariable", ua.Variant([], ua.VariantType.UInt32) |
|
78
|
|
|
) |
|
79
|
|
|
await myobj.add_property(idx, "myproperty", "I am a property") |
|
80
|
|
|
await myobj.add_method(idx, "mymethod", func, [ua.VariantType.Int64], [ua.VariantType.Boolean]) |
|
81
|
|
|
|
|
82
|
|
|
inargx = ua.Argument() |
|
83
|
|
|
inargx.Name = "x" |
|
84
|
|
|
inargx.DataType = ua.NodeId(ua.ObjectIds.Int64) |
|
85
|
|
|
inargx.ValueRank = -1 |
|
86
|
|
|
inargx.ArrayDimensions = [] |
|
87
|
|
|
inargx.Description = ua.LocalizedText("First number x") |
|
88
|
|
|
inargy = ua.Argument() |
|
89
|
|
|
inargy.Name = "y" |
|
90
|
|
|
inargy.DataType = ua.NodeId(ua.ObjectIds.Int64) |
|
91
|
|
|
inargy.ValueRank = -1 |
|
92
|
|
|
inargy.ArrayDimensions = [] |
|
93
|
|
|
inargy.Description = ua.LocalizedText("Second number y") |
|
94
|
|
|
outarg = ua.Argument() |
|
95
|
|
|
outarg.Name = "Result" |
|
96
|
|
|
outarg.DataType = ua.NodeId(ua.ObjectIds.Int64) |
|
97
|
|
|
outarg.ValueRank = -1 |
|
98
|
|
|
outarg.ArrayDimensions = [] |
|
99
|
|
|
outarg.Description = ua.LocalizedText("Multiplication result") |
|
100
|
|
|
|
|
101
|
|
|
await myobj.add_method(idx, "multiply", multiply, [inargx, inargy], [outarg]) |
|
102
|
|
|
await myobj.add_method(idx, "multiply_async", multiply_async, [inargx, inargy], []) |
|
103
|
|
|
await myobj.add_method(idx, "func_async", func_async, [ua.VariantType.Int64], []) |
|
104
|
|
|
|
|
105
|
|
|
async with server: |
|
106
|
|
|
while True: |
|
107
|
|
|
await asyncio.sleep(1) |
|
108
|
|
|
|
|
109
|
|
|
|
|
110
|
|
|
if __name__ == "__main__": |
|
111
|
|
|
loop = asyncio.get_event_loop() |
|
112
|
|
|
# loop.set_debug(True) |
|
113
|
|
|
loop.run_until_complete(main()) |
|
114
|
|
|
loop.close() |
|
115
|
|
|
|