Wiki source code of 1 Communication

Version 30.1 by Ben on 2022/08/22 17:22

Hide last authors
Ben 25.1 1 = **Modbus RTU** =
Leo Wei 1.1 2
Stone Wu 10.1 3 === **V-BOX as master** ===
Leo Wei 1.1 4
5 Select the protocol “(% class="mark" %)Modbus RTU Slave(All Fuction)”,
6
7 (% class="mark" %)then set BaudRate,Port,Stop Bit,Data Bit,Parity
8
9 (% style="text-align:center" %)
Jim 6.1 10 [[image:1624342015914-382.png||height="486" width="800" class="img-thumbnail"]]
Leo Wei 1.1 11
Stone Wu 10.1 12 === **V-BOX as slave** ===
Leo Wei 1.1 13
14 Select the protocol “(% class="mark" %)**Modbus RTU Master”**,
15
16 (% class="mark" %)then set BaudRate,Port,Stop Bit,Data Bit,Parity
17
18 (% style="text-align:center" %)
Jim 6.1 19 [[image:1624348709622-711.png||queryString="width=809&height=493" height="488" width="800" class="img-thumbnail"]]
Leo Wei 1.1 20
21 **Address List**
22
23 (% class="table-bordered" %)
24 |**Type**|**Register**|**Function code & Description**
25 |(% rowspan="11" %)Word|(% rowspan="3" %)3|04 (read input register: read current binary value in one or more input registers)
26 |06 (write single register: write a binary value to a holding register)
27 |10 (write values to multiple addresses )
28 |(% rowspan="3" %)4|03 (read holding register: read current binary value in one or more holding registers)
29 |06 (write single register: write a binary value to a holding register)
30 |10 (write values to multiple addresses )
31 |(% rowspan="3" %)W6|03 (read holding register: read current binary value in one or more holding registers)
32 |06 (write single register: write a binary value to a holding register)
33 |10 (write values to multiple addresses )
34 |(% rowspan="2" %)W16|03 (read holding register: read current binary value in one or more holding registers)
35 |10 (write values to multiple addresses )
36 |(% rowspan="11" %)Bit|(% rowspan="3" %)0|01 (Read coil state)
37 |05 (Force a single coil to force the on/off state of a logic coil)
38 |0F (Write multiple bits, ie write continuously)
39 |(% rowspan="3" %)1|02 (Read the input state)
40 |05 (Force a single coil to force the on/off state of a logic coil)
41 |0F (Write multiple bits)
42 |(% rowspan="3" %)W5|01 (Read coil state to obtain the current state of a set of logic coils)
43 |05 (Force a single coil to force the on/off state of a logic coil)
44 |0F (Write multiple bits)
45 |(% rowspan="2" %)W15|01 (Read coil state to obtain the current state of a set of logic coils)
46 |0F (Write multiple bits)
47
Ben 24.1 48 = **WECON PLC** =
Leo Wei 1.1 49
Ben 20.1 50 Supported series: WECON LX2V/ LX2E/ LX3V/LX3VP/LX3VE/LX3VM
Leo Wei 1.1 51
Ben 20.1 52 **HMI Settings**
Leo Wei 1.1 53
Ben 20.1 54 |**Item**|**Settings**|**Note**
55 |Protocol|WECON LX2V/ LX2E/ LX3V/LX3VP/LX3VE/LX3VM|
56 |Connection|RS422/RS485|
57 |Baud rate|9600|
58 |Data bit|7|
59 |Parity|EVEN|
60 |Stop bit|1|
61 |PLC station No.|1|
Leo Wei 1.1 62
Ben 20.1 63 **Address List**
64
65 |**Type**|**Device registers**|**HMI registers**|**Format**|**Range**|**Note**
66 |(% rowspan="6" %)Bit|X|X|Xo|0~~303237|
67 |Y|Y|Y o|0~~303237|
68 |M|M|M d|0~~99999|
69 |T|T|T d|0~~99999|
70 |C|C|C d|0~~99999|
71 |S|S|S d|0~~99999|
72 |(% rowspan="8" %)Word|X|X|Xo|0~~303237|
73 |Y|Y|Y o|0~~303237|
74 |M|M|M d|0~~99999|
75 |T|T|T d|0~~99999|
76 |C|C|C d|0~~199|
77 |D|D|D d|0~~7999|
78 |S|S|S d|0~~99999|
79 |SD|SD|SD d|8000~~9999|
80
81 **Cable Wiring**
82
83 * **RS485**
84
Ben 30.1 85 [[image:image-20220822172124-1.png]]
Ben 20.1 86
87 * **RS422**
88
Ben 30.1 89 [[image:image-20220822172228-2.png]]
Ben 20.1 90
Ben 30.1 91
Ben 20.1 92 **✎Note:**
93
94 * HMI COM3 is available in PI8000 series and COM3 is in COM2(hardware PIN 7 and PIN 8) .
95 * If PLC <= 20 points,such as LX3V-1208/LX3V-0806 PLC,PLC RS485A and RS485B mean PLC COM2 RS485+ and RS485- .PLC COM2 can support modbus. Please refer to PLC COM2 setting manual.
96
97 [[https:~~/~~/drive.google.com/drive/folders/13rgso7oUlatZQN_SNEcJCcN4toEdDPoP?usp=sharing>>url:https://drive.google.com/drive/folders/13rgso7oUlatZQN_SNEcJCcN4toEdDPoP?usp=sharing]]
98
99
Ben 29.1 100 == **V-BOX and Wecon LX5V serial communication** ==
Ben 28.1 101
Ben 20.1 102 This example introduces the establishment of serial port communication between Wecon HMI and LX5V. It is introduced through three parts: PLC software configuration, HMI software configuration, and hardware wiring.
103
104 **Software configuration of PLC**
105
106 **1)PLC programming software**
107
108 [[image:image-20220810164710-1.png]]
109
Ben 28.1 110
Ben 20.1 111 **2)New PLC project**
112
113 Click New Project and select the PLC model.
114
115 [[image:image-20220810172412-1.png]]
116
Ben 28.1 117
Ben 20.1 118 **3)Set Serial port parameters**
119
120 Follow the steps below to configure Serial port parameters
121
122 Baud rate:115200
123
124 Data bit:8
125
126 Stop bit:1
127
128 Parity:No verification
129
130 [[image:image-20220810165759-3.png]]
131
Ben 28.1 132
Ben 20.1 133 **4)Registers list**
134
135 [[image:image-20220811102219-3.png]]
136
Ben 28.1 137
Ben 20.1 138 **HMI software configuration**
139
140 **1)HMI programming software**
141
142 [[image:image-20220810171237-4.png]]
143
144 **2)New HMI project**
145
146 Click New Project and select the HMI model.
147
148 [[image:image-20220810172010-5.png]]
149
Ben 28.1 150
Ben 20.1 151 **3)Set communication port parameters**
152
153 Click the communication configuration button on the left to find the communication protocol with LX5V. After selecting the protocol, configure the communication parameters of the COM port.
154
155 Baud rate:115200
156
157 Data bit:8
158
159 Stop bit:1
160
161 Parity:No verification
162
163 [[image:image-20220811104012-1.png]]
164
Ben 28.1 165
Ben 20.1 166 **hardware connection**
167
168 **1)Hardware wiring diagram**
169
170 This example introduces WeconHMI with LX5V PLC to establish communication through serial port. The connection diagram is as follows:
171
Ben 28.1 172
173
Ben 20.1 174 [[image:image-20220811103005-4.png]]
175
176 [[image:image-20220811103227-7.png]]
177
178 The above are all the steps for establishing serial port communication between Wecon HMI with LX5V PLC.
179
Ben 28.1 180 == **HMI and Wecon LX5V-N Ethernet communication** ==
Ben 20.1 181
182 This example introduces the establishment of Ethernet communication between Wecon HMI and LX5V. It is introduced through three parts: PLC software configuration, HMI software configuration, and hardware wiring.
183
184 **Software configuration of PLC**
185
186 **1)PLC programming software**
187
188 [[image:image-20220810164710-1.png]]
189
190 **2)New PLC project**
191
192 Click New Project and select the PLC model.
193
194 [[image:image-20220811115454-1.png]]
195
196 **3)Set Ethernet port parameters**
197
198 Follow the steps below to configure Ethernet parameters
199
200 PLC IP address:192.168.39.200
201
202 default gateway:192.168.39.1
203
204 subnet mask:255.255.255.0
205
206 [[image:image-20220811140530-2.png]]
207
208 **4)Registers list**
209
210 [[image:image-20220811102219-3.png]]
211
212 **HMI software configuration**
213
214 **1)HMI programming software**
215
216 [[image:image-20220810171237-4.png]]
217
218 **2)New HMI project**
219
220 Click New Project and select the HMI model.
221
222 [[image:image-20220810172010-5.png]]
223
224 **3)Set communication port parameters**
225
226 Click the project setting button on the left to configure the IP address of the HMI machine to ensure that the HMI and PLC IP remain in a local area network.
227
228 HMI IP address:192.168.39.201
229
230 default gateway:192.168.39.1
231
232 subnet mask:255.255.255.0
233
234 [[image:image-20220811170753-2.png]]
235
236 Next, click Communication Settings to configure the IP of the HMI communication object.
237
238 [[image:image-20220811163047-1.png]]
239
240 **hardware connection**
241
242 **1)Hardware wiring diagram**
243
244 This example introduces WeconHMI with LX5V-N PLC to establish communication through ethernet. The connection diagram is as follows:
245
246 [[image:image-20220811170248-1.png]]
247
248 The above are all the steps for establishing ethernet communication between Wecon HMI with LX5V PLC.
249
250 (% style="text-align:center" %)
Jim 6.1 251 [[image:1624348978863-771.png||queryString="width=812&height=494" height="487" width="800" class="img-thumbnail"]]
Leo Wei 1.1 252
Ben 23.1 253 = **Rockwell PLC** =
Ben 22.1 254
Ben 27.1 255 == **Communication with AB CompactLogix L1769** ==
Ben 11.1 256
257 (((
Ben 16.1 258 (((
Ben 11.1 259 This example introduces the establishment of Ethernet communication between Wecon V-box and Allen-Bradley L1769. It is introduced through three parts: PLC software configuration, V-box software configuration, and hardware wiring.
Ben 16.1 260 )))
Ben 15.1 261
262
Ben 11.1 263 )))
264
265 (((
Ben 15.1 266 (% class="wikigeneratedid" id="HSoftwareconfigurationofPLC" %)
267 (((
268 **Software configuration of PLC**
Ben 11.1 269 )))
270
Ben 15.1 271 (% class="wikigeneratedid" id="HPLCprogrammingsoftware" %)
Ben 11.1 272 (((
Ben 15.1 273 **1)PLC programming software**
274 )))
Ben 11.1 275
Ben 17.1 276 [[image:image-20220714162600-1.png]]
Ben 11.1 277
Ben 15.1 278 (% class="wikigeneratedid" id="HNewPLCproject" %)
Ben 11.1 279 (((
Ben 15.1 280 **2)New PLC project**
Ben 11.1 281 )))
282
283 (((
Ben 16.1 284 (((
Ben 15.1 285 Click New Project and select the PLC model.
Ben 11.1 286 )))
Ben 16.1 287 )))
Ben 11.1 288
289 (((
Ben 17.1 290 [[image:image-20220714162617-2.png]]
Ben 11.1 291 )))
292
293 (((
Ben 17.1 294
Ben 16.1 295
Ben 17.1 296 [[image:image-20220714162652-4.png]]
Ben 11.1 297 )))
298
299 (((
Ben 15.1 300 (% class="wikigeneratedid" id="HSetEthernetparameters" %)
301 (((
302 **3)Set Ethernet parameters**
303 )))
Ben 11.1 304
305 (((
Ben 15.1 306 (((
Ben 16.1 307 (((
Ben 11.1 308 Follow the steps below to configure Ethernet parameters
309 )))
Ben 15.1 310 )))
Ben 16.1 311 )))
Ben 11.1 312
313 (((
Ben 15.1 314 (((
Ben 16.1 315 (((
Ben 11.1 316 PLC IP address:192.168.40.101
317 )))
Ben 15.1 318 )))
Ben 16.1 319 )))
Ben 11.1 320
321 (((
Ben 15.1 322 (((
Ben 16.1 323 (((
Ben 11.1 324 default gateway:192.168.40.1
325 )))
Ben 15.1 326 )))
Ben 16.1 327 )))
Ben 11.1 328
329 (((
Ben 15.1 330 (((
Ben 16.1 331 (((
Ben 11.1 332 subnet mask:255.255.255.0
333 )))
Ben 15.1 334 )))
Ben 16.1 335 )))
Ben 11.1 336
337 (((
Ben 17.1 338 [[image:image-20220714162713-5.png]]
Ben 11.1 339 )))
340
341 (((
342
343 )))
344
345 (((
Ben 15.1 346 (% class="wikigeneratedid" id="HV-boxsoftwareconfiguration" %)
347 (((
348 **V-box software configuration**
349 )))
Ben 11.1 350
Ben 15.1 351 (% class="wikigeneratedid" id="HV-boxprogrammingsoftware" %)
352 (((
353 **1)V-box programming software**
354 )))
Ben 11.1 355
Ben 15.1 356 (% class="wikigeneratedid" %)
357 (((
Ben 17.1 358 [[image:image-20220714162725-6.png]]
Ben 15.1 359 )))
Ben 11.1 360
Ben 15.1 361 (% class="wikigeneratedid" id="HConfiguredevicenetwork" %)
362 (((
363 **2)Configure device network**
364 )))
Ben 11.1 365
366 (((
Ben 15.1 367 (((
Ben 16.1 368 (((
Ben 11.1 369 Click the Configuration Download button[[image:image-20220714115308-8.png||height="22" width="15"]], It is used to configure the device network, update the device time, obtain the device machine code, check the device network, etc.
370 )))
Ben 16.1 371
372 (((
373 In the example below, the IP address of V-Box is configured as 192.168.40.66, and the networking method is 4G connection
Ben 15.1 374 )))
Ben 16.1 375 )))
376 )))
Ben 11.1 377
378 (((
Ben 15.1 379 (((
Ben 17.1 380 [[image:image-20220714162737-7.png]]
Ben 16.1 381
382
Ben 11.1 383 )))
384 )))
385 )))
386 )))
387
Ben 15.1 388 (% class="wikigeneratedid" id="HV-netadddevice" %)
Ben 11.1 389 (((
Ben 15.1 390 **3)V-net add device**
Ben 11.1 391 )))
Ben 15.1 392 )))
Ben 11.1 393
394 (((
Ben 16.1 395 (((
Ben 21.1 396 Open VNET client software → add device. As shown in the figure below, click "+" in the order of steps, and the Add Device window will pop up, enter the device machine code/product code, device password, and device alias to add the device.   [[image:image-20220714162752-8.png]]
Ben 11.1 397 )))
398
399
400 )))
401
402 (((
Ben 15.1 403 (% class="wikigeneratedid" id="HSetcommunicationportparameters" %)
404 (((
405 **4)Set communication port parameters**
406 )))
Ben 11.1 407
Ben 16.1 408 (((
409 In the device list on the left, find the Vbox that communicates with the L1769, click it and select configuration,communication port configuration in the main interface to add a communication protocol.
Ben 11.1 410 )))
411
Ben 17.1 412 [[image:image-20220714162805-9.png]]
Ben 16.1 413 )))
414
415 (((
Ben 11.1 416 The communication port is selected as Ethernet, the device type is selected as Allen-Bradley, the protocol is Allen-BradleyMicro850_FreeTag EthemetIP, and the IP is the internal IP address of the L1769 PLC. The port number is 44818.
Ben 16.1 417 )))
Ben 11.1 418
Ben 17.1 419 [[image:image-20220714162814-10.png]]
Ben 11.1 420
421
Ben 16.1 422 (((
Ben 22.1 423 After adding the protocol Allen-BradleyMicro850_FreeTag, click[[image:image-20220714143838-2.png]]icon add label.[[image:image-20220714162827-11.png]]
Ben 16.1 424 )))
Ben 14.1 425
Ben 16.1 426 (% class="wikigeneratedid" id="HEngineeringproduction" %)
427 (((
428 **5)Engineering production**
429 )))
Ben 14.1 430
Ben 16.1 431 (% class="wikigeneratedid" %)
432 (((
433 (((
434 According to your own needs, use the V-NET client software to edit the required data monitoring points.
435 )))
Ben 14.1 436
Ben 17.1 437 [[image:image-20220714162841-12.png]]
Ben 14.1 438
Ben 16.1 439
440 (((
441 **hardware connection**
442 )))
443 )))
444
445 (((
446 **1)Hardware wiring diagram**
447 )))
448
449 (((
450 (((
451 This example introduces Wecon V-box with Allen-Bradley L1769 PLC to establish communication through Ethernet. The connection diagram is as follows:
452 )))
453
Ben 17.1 454 [[image:image-20220714162856-13.png]]
Ben 16.1 455
456 (((
457 The above are all the steps for establishing Ethernet communication between Wecon V-box with Allen-Bradley L1769 PLC.
Ben 26.1 458
459
460 == **Allen-Bradley Ethernet DF1** ==
461
462 [[download link>>https://ftp.we-con.com.cn/Download/WIKI/V-BOX/Demo/%E9%80%9A%E8%AE%AF%E6%A1%88%E4%BE%8B/Allen-Bradley%20Ethernet%20DF1.zip]]
463
464
465 = **Siemens PLC** =
Ben 16.1 466 )))
467 )))
468
Stone Wu 10.1 469 == **Siemens S7-1200** ==
Leo Wei 1.1 470
471 [[download link>>https://ftp.we-con.com.cn/Download/WIKI/V-BOX/Demo/%E9%80%9A%E8%AE%AF%E6%A1%88%E4%BE%8B/Communicate%20with%20S7-1200%20via%20Ehernet.zip]]
472
Stone Wu 10.1 473 == **Communication with S7-200 Smart** ==
Leo Wei 1.1 474
475 [[download link>>https://ftp.we-con.com.cn/Download/WIKI/V-BOX/Demo/%E9%80%9A%E8%AE%AF%E6%A1%88%E4%BE%8B/Communication%20with%20S7-200%20Smart.zip]]
476
Ben 26.1 477 = **Delta PLC** =
478
Stone Wu 10.1 479 == **Delta DVP Ethernet** ==
Leo Wei 1.1 480
481 [[download link>>https://ftp.we-con.com.cn/Download/WIKI/V-BOX/Demo/%E9%80%9A%E8%AE%AF%E6%A1%88%E4%BE%8B/Delta%20DVP%20Ethernet.zip]]
482
Stone Wu 10.1 483 == **Delta DVP Serial Protocol** ==
Leo Wei 1.1 484
485 [[download link>>https://ftp.we-con.com.cn/Download/WIKI/V-BOX/Demo/%E9%80%9A%E8%AE%AF%E6%A1%88%E4%BE%8B/Delta%20DVP%20Ethernet.zip]]
486
Stone Wu 10.1 487 == **Communicate with Mitsubishi FX Series** ==
Jim 6.1 488
489 [[download link>>url:https://ftp.we-con.com.cn/Download/WIKI/V-BOX/Demo/%E9%80%9A%E8%AE%AF%E6%A1%88%E4%BE%8B/Communicate%20with%20Mitsubishi%20FX%20Series.zip]]
490
Stone Wu 10.1 491 == **Communicate with VB inverter** ==
Jim 6.1 492
493 [[download link>>url:https://ftp.we-con.com.cn/Download/WIKI/V-BOX/Demo/%E9%80%9A%E8%AE%AF%E6%A1%88%E4%BE%8B/Communicate%20with%20VB%20inverter.zip]]
494
Stone Wu 10.1 495 == **Omron CP1 Series** ==
Jim 7.1 496
Jim 8.1 497 [[download link>>https://ftp.we-con.com.cn/Download/WIKI/V-BOX/Demo/%E9%80%9A%E8%AE%AF%E6%A1%88%E4%BE%8B/Communication%20with%20ORMON%20CP1%20Series.zip]]
Jim 7.1 498
Stone Wu 10.1 499 == **Omron CJ2M** ==
Jim 7.1 500
Jim 8.1 501 [[download link>>https://ftp.we-con.com.cn/Download/WIKI/V-BOX/Demo/%E9%80%9A%E8%AE%AF%E6%A1%88%E4%BE%8B/Communication%20with%20ORMON%20CJ2M.zip]]
Jim 7.1 502
Leo Wei 1.1 503 = **2 User define protocol** =
504
Stone Wu 19.1 505 More serial port script instruction,please refer manual:[[Lua script function>>doc:V-BOX.V-Net.Manual.04 Lua Script.01 Lua Functions.WebHome]]~-~-->[[3.Serial port operation>>url:http://docs.we-con.com.cn/wiki/vbox/view/HMI/04.Lua%20script%20%20function%20and%20operation/01.Lua%20script%20function/#H3.Serialportoperation]]
Leo Wei 1.1 506
Stone Wu 10.1 507 == **Read the temperature sensor.** ==
Leo Wei 1.1 508
509 the commond format is as beliow:
510
511 Send commond:01 03 02 00 00 03 04 73
512
513 Feedback commond:01 03 06 07 F7 0E 7E B7 35
514
515 Temperature data:07 F7,desimal = 2039,it means temperature is 20.39℃.
516
517 Humidity data:0E 7E,desimal = 3710, it mean humidity is 37.10%RH.
518
519 Script Demo:
520
521 ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--
522
523 function com.main()
524 ~-~-dosomething
525 openPlc()
526 end
527 function openPlc()
528 if obj then
529 ~-~- If the serial port opened,then read/write data by timing
530
531 local wri = string.pack(">HHHH",0X0103,0X0200,0X0003,0X0473)
532 local arr = reading(wri)
533 ~-~- if arr ~~=nil then
534 ~-~- if arr[1] ==33 and arr[2] ==v[2][2] and arr[3] ==v[2][3] then
535 ~-~- local A = arr[4]*256
536 ~-~- local B = A+arr[5]
537 ~-~- addr_setword(v[1],B)
538 ~-~- end
539 ~-~- end
540
541 else
542 ~-~-judge if there is a serial object, then initialize and open the serial port
543 local configs = {
544 name = 'COM1', ~-~-Select serial port COM1
545 mode = 485, ~-~-Communication mode RS485
546 baud_rate = 9600, ~-~-Baud rate 9600
547 stop_bit = 1, ~-~-stop bit 1
548 data_len = 8, ~-~-data length 8
549 check_bit = 'NONE', ~-~-no parity
550
551 }
552 obj,err = serial.open(configs) ~-~-Open serial port
553 if not obj then
554 print("serial open :failed", err) ~-~- Open serial port failed
555 end
556 end
557 end
558
559 function reading(wri)
560 obj:flush() ~-~- Clear serial port
561 obj:write(wri) ~-~- Write serial port
562 print(string.byte(wri,1,#wri))
563 obj:flush() ~-~- Clear serial port 
564 local readed =obj:read(9,1000) ~-~- Read 9 bytes, timeout 1 second
565 if readed and readed ~~= "" then 
566 ~-~- judge that a non-empty string is read
567 print(string.byte(readed,1,#readed))
568 a={string.byte(readed, 1, #readed)}
569 if nil ~~= a[4] and nil ~~= a[5] and nil ~~= a[6] and nil ~~= a[7] then
570 a1=a[4]*256+a[5]
571 a2=a[6]*256+a[7]
572 addr_setword("@HDW0",a1)
573 addr_setword("@HDW1",a2)
574 end
575 return {string.byte(readed, 1, #readed)}
576 elseif readed == nil then
577 print("serial read err:", err or "")
578 return nil
579 end
580 return nil
581 end
582
583 ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-