1+ # -------------------------------------------------------------------------
2+ # Copyright (c) PTC Inc. All rights reserved.
3+ # See License.txt in the project root for
4+ # license information.
5+ # --------------------------------------------------------------------------
6+
7+ # EGD Test - Test to exersice all GE EGD driver exchange related features
8+ # including, exchanges, ranges and name resolutions
9+
10+ import os , sys
11+ sys .path .append (os .path .dirname (os .path .dirname (os .path .abspath (__file__ ))))
12+ import kepconfig
13+ import kepconfig .connectivity
14+ import time
15+ import datetime
16+ import pytest
17+ # import connectivity, admin, iot_gateway, datalogger
18+
19+
20+ # Channel and Device name to be used
21+ ch_name = 'EGD'
22+ dev_name = 'Device1'
23+
24+ consumer_exchange = {
25+ "common.ALLTYPES_NAME" : "0" ,
26+ "common.ALLTYPES_DESCRIPTION" : "" ,
27+ "ge_ethernet_global_data.CONSUMER_EXCHANGE_ID" : 0 ,
28+ "ge_ethernet_global_data.CONSUMER_EXCHANGE_NUMBER" : 1 ,
29+ "ge_ethernet_global_data.CONSUMER_EXCHANGE_PRODUCER_ID" : "192.168.1.130" ,
30+ "ge_ethernet_global_data.CONSUMER_EXCHANGE_GROUP_ID" : 1 ,
31+ "ge_ethernet_global_data.CONSUMER_EXCHANGE_CONSUMED_PERIOD_MS" : 1000 ,
32+ "ge_ethernet_global_data.CONSUMER_EXCHANGE_UPDATE_TIMEOUT_MS" : 10000
33+ }
34+ consumer_exchange10 = {
35+ "common.ALLTYPES_NAME" : "10" ,
36+ "common.ALLTYPES_DESCRIPTION" : "" ,
37+ "ge_ethernet_global_data.CONSUMER_EXCHANGE_ID" : 10 ,
38+ "ge_ethernet_global_data.CONSUMER_EXCHANGE_NUMBER" : 10 ,
39+ "ge_ethernet_global_data.CONSUMER_EXCHANGE_PRODUCER_ID" : "192.168.1.130" ,
40+ "ge_ethernet_global_data.CONSUMER_EXCHANGE_GROUP_ID" : 1 ,
41+ "ge_ethernet_global_data.CONSUMER_EXCHANGE_CONSUMED_PERIOD_MS" : 1000 ,
42+ "ge_ethernet_global_data.CONSUMER_EXCHANGE_UPDATE_TIMEOUT_MS" : 10000
43+ }
44+ producer_exchange = {
45+ "common.ALLTYPES_NAME" : "0" ,
46+ "common.ALLTYPES_DESCRIPTION" : "" ,
47+ "ge_ethernet_global_data.PRODUCER_EXCHANGE_ID" : 0 ,
48+ "ge_ethernet_global_data.PRODUCER_EXCHANGE_NUMBER" : 0 ,
49+ "ge_ethernet_global_data.PRODUCER_EXCHANGE_CONSUMED_TYPE" : 1 ,
50+ 'ge_ethernet_global_data.PRODUCER_EXCHANGE_CONSUMED_ADDRESS_GROUP_ID' :0 ,
51+ "ge_ethernet_global_data.PRODUCER_EXCHANGE_CONSUMED_ADDRESS_IP" : "10.10.10.10" ,
52+ 'ge_ethernet_global_data.PRODUCER_EXCHANGE_CONSUMED_ADDRESS_NAME' : '' ,
53+ "ge_ethernet_global_data.PRODUCER_EXCHANGE_PRODUCER_INTERVAL_MS" : 10
54+ }
55+ producer_exchange10 = {
56+ "common.ALLTYPES_NAME" : "10" ,
57+ "common.ALLTYPES_DESCRIPTION" : "" ,
58+ "ge_ethernet_global_data.PRODUCER_EXCHANGE_ID" : 10 ,
59+ "ge_ethernet_global_data.PRODUCER_EXCHANGE_NUMBER" : 10 ,
60+ "ge_ethernet_global_data.PRODUCER_EXCHANGE_CONSUMED_TYPE" : 1 ,
61+ 'ge_ethernet_global_data.PRODUCER_EXCHANGE_CONSUMED_ADDRESS_GROUP_ID' :0 ,
62+ "ge_ethernet_global_data.PRODUCER_EXCHANGE_CONSUMED_ADDRESS_IP" : "10.10.10.10" ,
63+ 'ge_ethernet_global_data.PRODUCER_EXCHANGE_CONSUMED_ADDRESS_NAME' : '' ,
64+ "ge_ethernet_global_data.PRODUCER_EXCHANGE_PRODUCER_INTERVAL_MS" : 10
65+ }
66+
67+ range1 = {
68+ "common.ALLTYPES_NAME" : "Range_0" ,
69+ "common.ALLTYPES_DESCRIPTION" : "" ,
70+ "ge_ethernet_global_data.RANGE_INDEX" : 1 ,
71+ "ge_ethernet_global_data.RANGE_OFFSET" : 0 ,
72+ "ge_ethernet_global_data.RANGE_REFERENCE" : 0 ,
73+ "ge_ethernet_global_data.RANGE_LOW_POINT" : 0 ,
74+ "ge_ethernet_global_data.RANGE_HIGH_POINT" : 8
75+ }
76+
77+ range2 = {
78+ "common.ALLTYPES_NAME" : "Range_1" ,
79+ "common.ALLTYPES_DESCRIPTION" : "" ,
80+ "ge_ethernet_global_data.RANGE_INDEX" : 2 ,
81+ "ge_ethernet_global_data.RANGE_OFFSET" : 18 ,
82+ "ge_ethernet_global_data.RANGE_REFERENCE" : 6 ,
83+ "ge_ethernet_global_data.RANGE_LOW_POINT" : 0 ,
84+ "ge_ethernet_global_data.RANGE_HIGH_POINT" : 10
85+ }
86+
87+ name1 = {
88+ "common.ALLTYPES_NAME" : "PLC1" ,
89+ "common.ALLTYPES_DESCRIPTION" : "" ,
90+ "ge_ethernet_global_data.NAME_RESOLUTION_ALIAS" : "PLC1" ,
91+ "ge_ethernet_global_data.NAME_RESOLUTION_IP_ADDRESS" : "192.168.1.200"
92+ }
93+
94+ name2 = {
95+ "common.ALLTYPES_NAME" : "PLC2" ,
96+ "common.ALLTYPES_DESCRIPTION" : "" ,
97+ "ge_ethernet_global_data.NAME_RESOLUTION_ALIAS" : "PLC2" ,
98+ "ge_ethernet_global_data.NAME_RESOLUTION_IP_ADDRESS" : "192.168.1.201"
99+ }
100+
101+ def HTTPErrorHandler (err ):
102+ if err .__class__ is kepconfig .error .KepHTTPError :
103+ print (err .code )
104+ print (err .msg )
105+ print (err .url )
106+ print (err .hdrs )
107+ print (err .payload )
108+ else :
109+ print ('Different Exception Received: {}' .format (err ))
110+
111+ # This creates a server reference that is used to target all modifications of
112+ # the Kepware configuration
113+ kepware_server = kepconfig .connection .server (host = 'localhost' , port = 57412 , user = 'Administrator' , pw = '' , https = False )
114+
115+ egd_device = {
116+ "common.ALLTYPES_NAME" : ch_name ,
117+ "servermain.MULTIPLE_TYPES_DEVICE_DRIVER" : "GE Ethernet Global Data" ,
118+ "devices" : [{
119+ "common.ALLTYPES_NAME" : dev_name ,
120+ "servermain.MULTIPLE_TYPES_DEVICE_DRIVER" : "GE Ethernet Global Data"
121+ }]
122+ }
123+
124+ def initialize ():
125+ try :
126+ kepconfig .connectivity .channel .add_channel (kepware_server ,egd_device ) == True
127+ except Exception as err :
128+ HTTPErrorHandler (err )
129+
130+ def complete ():
131+ try :
132+ kepconfig .connectivity .channel .del_channel (kepware_server ,egd_device ['common.ALLTYPES_NAME' ])
133+ except Exception as err :
134+ HTTPErrorHandler (err )
135+
136+ def remove_projectid (DATA ):
137+ if type (DATA ) is dict :
138+ DATA .pop ('PROJECT_ID' , None )
139+ elif type (DATA ) is list :
140+ for item in DATA :
141+ if type (item ) is list :
142+ for x in item :
143+ x .pop ('PROJECT_ID' , None )
144+ else :
145+ item .pop ('PROJECT_ID' , None )
146+ return DATA
147+
148+ # Exchange Tests
149+ def create_exchange (exchange_type , exchanges ):
150+ assert kepconfig .connectivity .egd .exchange .add_exchange (kepware_server , ch_name + '.' + dev_name , exchange_type , exchanges [0 ])
151+
152+ # Delete
153+ assert kepconfig .connectivity .egd .exchange .del_exchange (kepware_server , ch_name + '.' + dev_name , exchange_type , exchanges [0 ]['common.ALLTYPES_NAME' ])
154+ # Add multiple Exchanges
155+ assert kepconfig .connectivity .egd .exchange .add_exchange (kepware_server , ch_name + '.' + dev_name , exchange_type , exchanges )
156+
157+ def get_exchange (exchange_type , exchanges ):
158+
159+ # Get a specific Exchange
160+ ret = kepconfig .connectivity .egd .exchange .get_exchange (kepware_server , ch_name + '.' + dev_name , exchange_type , exchanges [0 ]['common.ALLTYPES_NAME' ])
161+ assert type (ret ) == dict , 'Unexpected data type return. {}' .format (type (ret ))
162+ assert remove_projectid (ret ) == exchanges [0 ]
163+
164+ # Get All exchanges for exchange type
165+ ret = kepconfig .connectivity .egd .exchange .get_exchange (kepware_server , ch_name + '.' + dev_name , exchange_type )
166+ assert type (ret ) == list , 'Unexpected data type return. {}' .format (type (ret ))
167+ assert remove_projectid (ret ) == exchanges
168+
169+ # Get All exchanges for device
170+ ret = kepconfig .connectivity .egd .exchange .get_all_exchanges (kepware_server , ch_name + '.' + dev_name )
171+ assert type (ret ) == list
172+ if exchange_type == kepconfig .connectivity .egd .PRODUCER_EXCHANGE :
173+ assert remove_projectid (ret ) == [[],exchanges ]
174+ else :
175+ assert remove_projectid (ret ) == [exchanges ,[]]
176+
177+ def modify_exchange (exchange_type , exchange_name ):
178+
179+ assert kepconfig .connectivity .egd .exchange .modify_exchange (kepware_server , ch_name + '.' + dev_name , exchange_type ,
180+ {"ge_ethernet_global_data.CONSUMER_EXCHANGE_NUMBER" : 2 }, exchange_name )
181+ assert kepconfig .connectivity .egd .exchange .modify_exchange (kepware_server , ch_name + '.' + dev_name , exchange_type ,
182+ {"common.ALLTYPES_NAME" : exchange_name ,"ge_ethernet_global_data.CONSUMER_EXCHANGE_NUMBER" : 3 })
183+ assert kepconfig .connectivity .egd .exchange .modify_exchange (kepware_server , ch_name + '.' + dev_name , exchange_type ,
184+ {"common.ALLTYPES_NAME" : exchange_name ,"ge_ethernet_global_data.CONSUMER_EXCHANGE_NUMBER" : 4 }, force = True )
185+
186+ def delete_exchange (exchange_type , exchange_name ):
187+
188+ assert kepconfig .connectivity .egd .exchange .del_exchange (kepware_server , ch_name + '.' + dev_name , exchange_type , exchange_name )
189+
190+ # Exchange Range tests
191+ def create_range (exchange_type , exchange_name , ranges ):
192+ assert kepconfig .connectivity .egd .range .add_range (kepware_server , ch_name + '.' + dev_name , exchange_type , exchange_name , ranges [0 ])
193+
194+ # Delete
195+ assert kepconfig .connectivity .egd .range .del_range (kepware_server , ch_name + '.' + dev_name , exchange_type , exchange_name , ranges [0 ]['common.ALLTYPES_NAME' ])
196+ # Add multiple ranges
197+ assert kepconfig .connectivity .egd .range .add_range (kepware_server , ch_name + '.' + dev_name , exchange_type , exchange_name , ranges )
198+
199+ def get_range (exchange_type , exchange_name , ranges ):
200+
201+ # Get a specific range
202+ ret = kepconfig .connectivity .egd .range .get_range (kepware_server , ch_name + '.' + dev_name , exchange_type , exchange_name , ranges [0 ]['common.ALLTYPES_NAME' ])
203+ assert type (ret ) == dict , 'Unexpected data type return. {}' .format (type (ret ))
204+ assert remove_projectid (ret ) == ranges [0 ]
205+
206+ # Get All ranges for Exchange
207+ ret = kepconfig .connectivity .egd .range .get_range (kepware_server , ch_name + '.' + dev_name , exchange_type , exchange_name )
208+ assert type (ret ) == list , 'Unexpected data type return. {}' .format (type (ret ))
209+ assert remove_projectid (ret ) == ranges
210+
211+ def modify_range (exchange_type , exchange_name , range_name ):
212+
213+ assert kepconfig .connectivity .egd .range .modify_range (kepware_server , ch_name + '.' + dev_name , exchange_type , exchange_name ,
214+ {"ge_ethernet_global_data.RANGE_HIGH_POINT" : 10 }, range_name )
215+ assert kepconfig .connectivity .egd .range .modify_range (kepware_server , ch_name + '.' + dev_name , exchange_type , exchange_name ,
216+ {"common.ALLTYPES_NAME" : range_name ,"ge_ethernet_global_data.RANGE_HIGH_POINT" : 11 })
217+ assert kepconfig .connectivity .egd .range .modify_range (kepware_server , ch_name + '.' + dev_name , exchange_type , exchange_name ,
218+ {"common.ALLTYPES_NAME" : range_name ,"ge_ethernet_global_data.RANGE_HIGH_POINT" : 8 }, force = True )
219+
220+ def delete_range (exchange_type , exchange_name , range_name ):
221+
222+ assert kepconfig .connectivity .egd .range .del_range (kepware_server , ch_name + '.' + dev_name , exchange_type , exchange_name , range_name )
223+
224+ # Name Resolution Tests
225+ def create_name (names ):
226+ assert kepconfig .connectivity .egd .name .add_name_resolution (kepware_server , ch_name + '.' + dev_name , names [0 ])
227+
228+ # Delete
229+ assert kepconfig .connectivity .egd .name .del_name_resolution (kepware_server , ch_name + '.' + dev_name , names [0 ]['common.ALLTYPES_NAME' ])
230+ # Add multiple ranges
231+ assert kepconfig .connectivity .egd .name .add_name_resolution (kepware_server , ch_name + '.' + dev_name , names )
232+
233+ def get_name (names ):
234+
235+ # Get a specific range
236+ ret = kepconfig .connectivity .egd .name .get_name_resolution (kepware_server , ch_name + '.' + dev_name , names [0 ]['common.ALLTYPES_NAME' ])
237+ assert type (ret ) == dict , 'Unexpected data type return. {}' .format (type (ret ))
238+ assert remove_projectid (ret ) == names [0 ]
239+
240+ # Get All ranges for Exchange
241+ ret = kepconfig .connectivity .egd .name .get_name_resolution (kepware_server , ch_name + '.' + dev_name )
242+ assert type (ret ) == list , 'Unexpected data type return. {}' .format (type (ret ))
243+ assert remove_projectid (ret ) == names
244+
245+ def modify_name (name ):
246+
247+ assert kepconfig .connectivity .egd .name .modify_name_resolution (kepware_server , ch_name + '.' + dev_name ,
248+ {"ge_ethernet_global_data.NAME_RESOLUTION_IP_ADDRESS" : '192.168.1.50' }, name )
249+ assert kepconfig .connectivity .egd .name .modify_name_resolution (kepware_server , ch_name + '.' + dev_name ,
250+ {"common.ALLTYPES_NAME" : name ,"ge_ethernet_global_data.NAME_RESOLUTION_IP_ADDRESS" : '192.168.1.100' })
251+ assert kepconfig .connectivity .egd .name .modify_name_resolution (kepware_server , ch_name + '.' + dev_name ,
252+ {"common.ALLTYPES_NAME" : name ,"ge_ethernet_global_data.NAME_RESOLUTION_IP_ADDRESS" : '192.168.1.202' }, force = True )
253+
254+ def delete_name (name ):
255+
256+ assert kepconfig .connectivity .egd .name .del_name_resolution (kepware_server , ch_name + '.' + dev_name , name )
257+
258+
259+ #
260+ # MAIN TEST SET
261+ #
262+
263+ def test_consumer_exchange ():
264+ initialize ()
265+ create_exchange (kepconfig .connectivity .egd .CONSUMER_EXCHANGE ,[consumer_exchange , consumer_exchange10 ])
266+ get_exchange (kepconfig .connectivity .egd .CONSUMER_EXCHANGE , [consumer_exchange , consumer_exchange10 ])
267+
268+ # Range Tests
269+ create_range (kepconfig .connectivity .egd .CONSUMER_EXCHANGE , consumer_exchange ['common.ALLTYPES_NAME' ], [range1 , range2 ])
270+ get_range (kepconfig .connectivity .egd .CONSUMER_EXCHANGE , consumer_exchange ['common.ALLTYPES_NAME' ], [range1 , range2 ])
271+ modify_range (kepconfig .connectivity .egd .CONSUMER_EXCHANGE , consumer_exchange ['common.ALLTYPES_NAME' ], range1 ['common.ALLTYPES_NAME' ])
272+ delete_range (kepconfig .connectivity .egd .CONSUMER_EXCHANGE , consumer_exchange ['common.ALLTYPES_NAME' ], range1 ['common.ALLTYPES_NAME' ])
273+
274+ modify_exchange (kepconfig .connectivity .egd .CONSUMER_EXCHANGE , consumer_exchange ['common.ALLTYPES_NAME' ])
275+ delete_exchange (kepconfig .connectivity .egd .CONSUMER_EXCHANGE , consumer_exchange ['common.ALLTYPES_NAME' ])
276+ complete ()
277+
278+ def test_producer_exchange ():
279+ initialize ()
280+ create_exchange (kepconfig .connectivity .egd .PRODUCER_EXCHANGE ,[producer_exchange , producer_exchange10 ])
281+ get_exchange (kepconfig .connectivity .egd .PRODUCER_EXCHANGE , [producer_exchange , producer_exchange10 ])
282+
283+ # Range Tests
284+ create_range (kepconfig .connectivity .egd .PRODUCER_EXCHANGE , producer_exchange ['common.ALLTYPES_NAME' ], [range1 , range2 ])
285+ get_range (kepconfig .connectivity .egd .PRODUCER_EXCHANGE , producer_exchange ['common.ALLTYPES_NAME' ], [range1 , range2 ])
286+ modify_range (kepconfig .connectivity .egd .PRODUCER_EXCHANGE , producer_exchange ['common.ALLTYPES_NAME' ], range1 ['common.ALLTYPES_NAME' ])
287+ delete_range (kepconfig .connectivity .egd .PRODUCER_EXCHANGE , producer_exchange ['common.ALLTYPES_NAME' ], range1 ['common.ALLTYPES_NAME' ])
288+
289+ modify_exchange (kepconfig .connectivity .egd .PRODUCER_EXCHANGE , producer_exchange ['common.ALLTYPES_NAME' ])
290+ delete_exchange (kepconfig .connectivity .egd .PRODUCER_EXCHANGE , producer_exchange ['common.ALLTYPES_NAME' ])
291+ complete ()
292+
293+ def test_name_resolutions ():
294+ initialize ()
295+ create_name ([name1 , name2 ])
296+ get_name ([name1 , name2 ])
297+ modify_name (name1 ['common.ALLTYPES_NAME' ])
298+ delete_name (name1 ['common.ALLTYPES_NAME' ])
299+ complete ()
300+
301+ # runing the testing without pytest
302+ if __name__ == "__main__" :
303+ test_consumer_exchange ()
304+ test_producer_exchange ()
305+ test_name_resolutions ()
0 commit comments