Wiki source code of 1 Communication

Version 26.1 by Ben on 2022/08/20 11:58

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