Wiki source code of 1 Communication

Version 31.1 by Ben on 2022/08/22 17:23

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