1+ import ctypes
2+ import snap7
3+ from snap7 .types import S7WLByte , S7DataItem , S7WLWord , S7WLReal , S7WLTimer
4+ from snap7 .types import areas , wordlen_to_ctypes
5+ from snap7 .util import set_int , set_real , set_word , get_int , get_real , get_s5time
6+
7+
8+ client = snap7 .client .Client ()
9+ client .connect ('192.168.100.100' , 0 , 2 )
10+
11+ items = []
12+
13+
14+ def set_data_item (area , word_len , db_number : int , start : int , amount : int , data : bytearray ) -> S7DataItem :
15+ item = S7DataItem ()
16+ item .Area = ctypes .c_int32 (area )
17+ item .WordLen = ctypes .c_int32 (word_len )
18+ item .DBNumber = ctypes .c_int32 (db_number )
19+ item .Start = ctypes .c_int32 (start )
20+ item .Amount = ctypes .c_int32 (amount )
21+ array_class = ctypes .c_uint8 * len (data )
22+ cdata = array_class .from_buffer_copy (data )
23+ item .pData = ctypes .cast (cdata , ctypes .POINTER (array_class )).contents
24+ return item
25+
26+
27+ int_values = [10 , 20 , 30 , 40 ]
28+ ints = bytearray (len (int_values ) * 2 )
29+ for i , value in enumerate (int_values ):
30+ set_int (ints , i * 2 , value )
31+
32+ real = bytearray (4 )
33+ set_real (real , 0 , 42.5 )
34+
35+ counters = 0x2999 .to_bytes (2 , 'big' ) + 0x1111 .to_bytes (2 , 'big' )
36+
37+ item1 = set_data_item (area = areas .DB , word_len = S7WLWord , db_number = 1 , start = 0 , amount = 4 , data = ints )
38+ item2 = set_data_item (area = areas .DB , word_len = S7WLReal , db_number = 1 , start = 8 , amount = 1 , data = real )
39+ item3 = set_data_item (area = areas .TM , word_len = S7WLTimer , db_number = 0 , start = 2 , amount = 2 , data = counters )
40+
41+ items .append (item1 )
42+ items .append (item2 )
43+ items .append (item3 )
44+
45+ client .write_multi_vars (items )
46+
47+ db_int = client .db_read (1 , 0 , 8 )
48+ db_real = client .db_read (1 , 8 , 12 )
49+ db_counters = client .ct_read (2 , 2 )
50+
51+ print (f'int values: { [get_int (db_int , i * 2 ) for i in range (4 )]} ' )
52+ print (f'real value: { get_real (db_real , 0 )} ' )
53+ print (f'counters: { get_s5time (counters , 0 )} , { get_s5time (counters , 2 )} ' )
0 commit comments