Wiki source code of 1 Communication

Version 33.1 by Ben on 2022/08/22 17:28

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