<
From version < 45.27 >
edited by Xiaoling
on 2024/08/06 11:16
To version < 45.1 >
edited by Karry Zhuang
on 2024/07/20 17:26
>
Change comment: There is no comment for this version

Summary

Details

Page properties
Author
... ... @@ -1,1 +1,1 @@
1 -XWiki.Xiaoling
1 +XWiki.karry
Content
... ... @@ -3,13 +3,10 @@
3 3  {{toc/}}
4 4  
5 5  
6 -
7 -
8 8  = 1. DR-ECK Water EC Probe =
9 9  
10 10  == 1.1 Specification: ==
11 11  
12 -
13 13  * **Power Input**: DC7~~30
14 14  * **Power Consumption** : < 0.5W
15 15  * **Interface**: RS485. 9600 Baud Rate
... ... @@ -24,22 +24,18 @@
24 24  * **IP Rated**: IP68
25 25  * **Max Pressure**: 0.6MPa
26 26  
27 -
28 28  == 1.2 Application for Different Range ==
29 29  
30 -
31 31  [[image:image-20240714173018-1.png]]
32 32  
33 33  
34 34  == 1.3 Wiring ==
35 35  
36 -
37 37  [[image:image-20240720172533-1.png||height="347" width="569"]]
38 38  
39 39  
40 40  == 1.4 Mechinical Drawing ==
41 41  
42 -
43 43  [[image:image-20240714174241-2.png]]
44 44  
45 45  
... ... @@ -46,19 +46,19 @@
46 46  == 1.5 Installation ==
47 47  
48 48  
49 -**Electrode installation form:**
42 +**Electrode installation form**
50 50  
51 -A: Side wall installation
44 +A:Side wall installation
52 52  
53 -B: Top flange installation
46 +B:Top flange installation
54 54  
55 -C: Pipeline bend installation
48 +C:Pipeline bend installation
56 56  
57 -D: Pipeline bend installation
50 +D:Pipeline bend installation
58 58  
59 -E: Flow-through installation
52 +E:Flow-through installation
60 60  
61 -F: Submerged installation
54 +F:Submerged installation
62 62  
63 63  [[image:image-20240718190121-1.png||height="350" width="520"]]
64 64  
... ... @@ -70,11 +70,11 @@
70 70  
71 71  [[image:image-20240718190204-2.png||height="262" width="487"]]
72 72  
73 -**Error cause:** The electrode joint is too long, the extension part is too short, the sensor is easy to form a dead cavity, resulting in measurement error.
66 +Error cause: The electrode joint is too long, the extension part is too short, the sensor is easy to form a dead cavity, resulting in measurement error.
74 74  
75 75  [[image:image-20240718190221-3.png||height="292" width="500"]]
76 76  
77 -**Error cause: **Measurement error or instability may occur due to water flow not being able to fill the pipe or air accumulation at high altitudes.
70 +Error cause: Measurement error or instability may occur due to water flow not being able to fill the pipe or air accumulation at high altitudes.
78 78  
79 79  B. Correct installation method
80 80  
... ... @@ -89,7 +89,6 @@
89 89  * Cleaning of conductivity electrodes: Organic stains on the electrode can be cleaned with warm water containing detergent, or with alcohol. Calcium and magnesium precipitates are best cleaned with 10% citric acid. The electrode plate or pole can only be cleaned by chemical methods or by shaking in water. Wiping the electrode plate will damage the coating (platinum black) on the electrode surface.
90 90  * The equipment should be calibrated before each use. It is recommended to calibrate it every 3 months for long-term use. The calibration frequency should be adjusted appropriately according to different application conditions (degree of dirt in the application, deposition of chemical substances, etc.).
91 91  
92 -
93 93  == 1.7 RS485 Commands ==
94 94  
95 95  
... ... @@ -99,31 +99,28 @@
99 99  
100 100  === 1.7.1 Query address ===
101 101  
94 +send
102 102  
103 -**send**
96 +(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:599.333px" %)
97 +|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Original address|=(% style="width: 72px; background-color: rgb(79, 129, 189); color: white;" %)Function code|=(% style="width: 64px; background-color: rgb(79, 129, 189); color: white;" %)Address high|=(% style="width: 68px; background-color: rgb(79, 129, 189); color: white;" %)Address low|=(% style="width: 70px; background-color: rgb(79, 129, 189); color: white;" %)Quantity high|=(% style="width: 72px; background-color: rgb(79, 129, 189); color: white;" %)Quantity low|=(% style="width: 56px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 low|=(% style="width: 56px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 high
98 +|(% style="width:99px" %)0XFE |(% style="width:72px" %)0X03|(% style="width:64px" %)0X00|(% style="width:68px" %)0X50|(% style="width:70px" %)0X00|(% style="width:72px" %)0X00|(% style="width:56px" %)0X51|(% style="width:56px" %)0XD4
104 104  
105 -(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:518px" %)
106 -|=(% style="width: 74px;background-color:#4F81BD;color:white" %)Original address|=(% style="width: 70px; background-color: rgb(79, 129, 189); color: white;" %)Function code|=(% style="width: 60px; background-color: rgb(79, 129, 189); color: white;" %)Address high|=(% style="width: 66px; background-color: rgb(79, 129, 189); color: white;" %)Address low|=(% style="width: 70px; background-color: rgb(79, 129, 189); color: white;" %)Quantity high|=(% style="width: 70px; background-color: rgb(79, 129, 189); color: white;" %)Quantity low|=(% style="width: 56px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 low|=(% style="width: 56px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 high
107 -|(% style="width:99px" %)0XFE |(% style="width:72px" %)0X03|(% style="width:64px" %)0X00|(% style="width:58px" %)0X50|(% style="width:54px" %)0X00|(% style="width:54px" %)0X00|(% style="width:56px" %)0X51|(% style="width:56px" %)0XD4
108 -
109 109  If you forget the original address of the sensor, you can use the broadcast address 0XFE instead. When using 0XFE, the host can only connect to one slave, which can be used as a method of address query.
110 110  
111 111  
112 -**response**
103 +response
113 113  
114 -(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:512px" %)
115 -|=(% style="width: 100px;background-color:#4F81BD;color:white" %)New address|=(% style="width: 110px;background-color:#4F81BD;color:white" %)Function code|=(% style="width: 106px; background-color: rgb(79, 129, 189); color: white;" %)Data length|=(% style="width: 93px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 low|=(% style="width: 104px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 high
105 +(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:561.333px" %)
106 +|=(% style="width: 50px;background-color:#4F81BD;color:white" %)New address|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Function code|=(% style="width: 106px; background-color: rgb(79, 129, 189); color: white;" %)Data length|=(% style="width: 93px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 low|=(% style="width: 104px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 high
116 116  |(% style="width:99px" %)0X01|(% style="width:112px" %)0X03|(% style="width:106px" %)0X00|(% style="width:93px" %)0X20|(% style="width:104px" %)0XF0
117 117  
118 -
119 119  === 1.7.2 Change address ===
120 120  
121 -
122 122  For example: Change the address of the sensor with address 1 to 2, master → slave
123 123  
124 -(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:518px" %)
125 -|=(% style="width: 75px; background-color: rgb(79, 129, 189); color: white;" %)Original address|=(% style="width: 60px; background-color: rgb(79, 129, 189); color: white;" %)Function code|=(% style="width: 65px; background-color: rgb(79, 129, 189); color: white;" %)Address high|=(% style="width: 66px; background-color: rgb(79, 129, 189); color: white;" %)Address low|=(% style="width: 71px; background-color: rgb(79, 129, 189); color: white;" %)Quantity high|=(% style="width: 71px; background-color: rgb(79, 129, 189); color: white;" %)Quantity low|=(% style="width: 55px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 low|=(% style="width: 54px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 high
126 -|(% style="width:67px" %)0X01|(% style="width:76px" %)0X06|(% style="width:62px" %)0X00|(% style="width:55px" %)0X50|(% style="width:65px" %)0X00|(% style="width:65px" %)0X02|(% style="width:57px" %)0X08|(% style="width:56px" %)0X1A
113 +(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:575.333px" %)
114 +|=(% style="width: 69px; background-color: rgb(79, 129, 189); color: white;" %)Original address|=(% style="width: 76px; background-color: rgb(79, 129, 189); color: white;" %)Function code|=(% style="width: 67px; background-color: rgb(79, 129, 189); color: white;" %)Address high|=(% style="width: 68px; background-color: rgb(79, 129, 189); color: white;" %)Address low|=(% style="width: 73px; background-color: rgb(79, 129, 189); color: white;" %)Quantity high|=(% style="width: 73px; background-color: rgb(79, 129, 189); color: white;" %)Quantity low|=(% style="width: 57px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 low|=(% style="width: 56px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 high
115 +|(% style="width:69px" %)0X01|(% style="width:76px" %)0X06|(% style="width:67px" %)0X00|(% style="width:68px" %)0X50|(% style="width:73px" %)0X00|(% style="width:73px" %)0X02|(% style="width:57px" %)0X08|(% style="width:56px" %)0X1A
127 127  
128 128  If the sensor receives correctly, the data is returned along the original path.
129 129  Note: If you forget the original address of the sensor, you can use the broadcast address 0XFE instead. When using 0XFE, the host can only connect to one slave, and the return address is still the original address, which can be used as a method of address query.
... ... @@ -134,7 +134,7 @@
134 134  
135 135  send
136 136  
137 -(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:518px" %)
126 +(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:676.25px" %)
138 138  |=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Function code|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address high|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address low|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Quantity high|=(% style="width: 1px; background-color: rgb(79, 129, 189); color: white;" %)Quantity low|=(% style="width: 50px;background-color:#4F81BD;color:white" %)CRC16 low|=(% style="width: 50px;background-color:#4F81BD;color:white" %)CRC16 high
139 139  |(% style="width:99px" %)0X01|(% style="width:112px" %)0X06|(% style="width:135px" %)0X00|(% style="width:126px" %)0X23|(% style="width:85px" %)0X00|(% style="width:1px" %)0X01|(% style="width:1px" %)0XF8|(% style="width:1px" %)(((
140 140  0X07
... ... @@ -144,7 +144,7 @@
144 144  
145 145  response
146 146  
147 -(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:518px" %)
136 +(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:676.25px" %)
148 148  |=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Function code|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address high|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address low|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Quantity high|=(% style="width: 1px; background-color: rgb(79, 129, 189); color: white;" %)Quantity low|=(% style="width: 50px;background-color:#4F81BD;color:white" %)CRC16 low|=(% style="width: 50px;background-color:#4F81BD;color:white" %)CRC16 high
149 149  |(% style="width:99px" %)0X01|(% style="width:112px" %)0X06|(% style="width:135px" %)(((
150 150  0X02
... ... @@ -155,15 +155,16 @@
155 155  === 1.7.4 Query data ===
156 156  
157 157  
147 +
158 158  Query the data (EC,temperature) of the sensor (address 11), host → slave
159 159  
160 -(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:518px" %)
150 +(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:599.333px" %)
161 161  |=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address|=(% style="width: 72px; background-color: rgb(79, 129, 189); color: white;" %)Function code|=(% style="width: 64px; background-color: rgb(79, 129, 189); color: white;" %)Starting register address high|=(% style="width: 68px; background-color: rgb(79, 129, 189); color: white;" %)Starting register address low|=(% style="width: 70px; background-color: rgb(79, 129, 189); color: white;" %)Register length high|=(% style="width: 72px; background-color: rgb(79, 129, 189); color: white;" %)Register length low|=(% style="width: 56px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 low|=(% style="width: 56px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 high
162 162  |(% style="width:99px" %)0X11|(% style="width:72px" %)0X03|(% style="width:64px" %)0X00|(% style="width:68px" %)0X00|(% style="width:70px" %)0X00|(% style="width:72px" %)0X02|(% style="width:56px" %)0XC6|(% style="width:56px" %)0X9B
163 163  
164 164  If the sensor receives correctly, the following data will be returned, slave → host
165 165  
166 -(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:518px" %)
156 +(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:599.333px" %)
167 167  |=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address|=(% style="width: 72px; background-color: rgb(79, 129, 189); color: white;" %)Function code|=(% style="width: 68px; background-color: rgb(79, 129, 189); color: white;" %)Data length|=(% style="width: 68px; background-color: rgb(79, 129, 189); color: white;" %)Register 0 Data high|=(% style="width: 70px; background-color: rgb(79, 129, 189); color: white;" %)Register 0 Data low|=(% style="width: 68px; background-color: rgb(79, 129, 189); color: white;" %)Register 1 Data high|=(% style="width: 70px; background-color: rgb(79, 129, 189); color: white;" %)Register 1 Data low|=(% style="width: 56px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 low|=(% style="width: 56px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 high
168 168  |(% style="width:99px" %)0X11|(% style="width:72px" %)0X03|(% style="width:68px" %)0X04|(% style="width:70px" %)0X02|(% style="width:72px" %)0XAE|(% style="width:56px" %)0X01|(% style="width:56px" %)0X64|(% style="width:56px" %)0X8B|(% style="width:56px" %)0XD0
169 169  
... ... @@ -176,13 +176,13 @@
176 176  
177 177  Query the data (EC,temperature) of the sensor (address 11), host → slave
178 178  
179 -(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:518px" %)
169 +(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:599.333px" %)
180 180  |=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address|=(% style="width: 72px; background-color: rgb(79, 129, 189); color: white;" %)Function code|=(% style="width: 64px; background-color: rgb(79, 129, 189); color: white;" %)Starting register address high|=(% style="width: 68px; background-color: rgb(79, 129, 189); color: white;" %)Starting register address low|=(% style="width: 70px; background-color: rgb(79, 129, 189); color: white;" %)Register length high|=(% style="width: 72px; background-color: rgb(79, 129, 189); color: white;" %)Register length low|=(% style="width: 56px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 low|=(% style="width: 56px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 high
181 181  |(% style="width:99px" %)0X12|(% style="width:72px" %)0X03|(% style="width:64px" %)0X00|(% style="width:68px" %)0X00|(% style="width:70px" %)0X00|(% style="width:72px" %)0X02|(% style="width:56px" %)0XC6|(% style="width:56px" %)0XA8
182 182  
183 183  If the sensor receives correctly, the following data will be returned, slave → host
184 184  
185 -(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:518px" %)
175 +(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:599.333px" %)
186 186  |=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address|=(% style="width: 72px; background-color: rgb(79, 129, 189); color: white;" %)Function code|=(% style="width: 68px; background-color: rgb(79, 129, 189); color: white;" %)Data length|=(% style="width: 68px; background-color: rgb(79, 129, 189); color: white;" %)Register 0 Data high|=(% style="width: 70px; background-color: rgb(79, 129, 189); color: white;" %)Register 0 Data low|=(% style="width: 68px; background-color: rgb(79, 129, 189); color: white;" %)Register 1 Data high|=(% style="width: 70px; background-color: rgb(79, 129, 189); color: white;" %)Register 1 Data low|=(% style="width: 56px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 low|=(% style="width: 56px; background-color: rgb(79, 129, 189); color: white;" %)CRC16 high
187 187  |(% style="width:99px" %)0X12|(% style="width:72px" %)0X03|(% style="width:68px" %)0X04|(% style="width:70px" %)0X02|(% style="width:72px" %)0XAE|(% style="width:56px" %)0X01|(% style="width:56px" %)0X64|(% style="width:56px" %)0XB8|(% style="width:56px" %)0XD0
188 188  
... ... @@ -201,7 +201,7 @@
201 201  The calibration steps are as follows:
202 202  (1) Place the electrode in distilled water and clean it. When mileage 1~~2000 uses 1413μS/cm standard solution, enter the following calibration command after the data is stable.
203 203  
204 -(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:518px" %)
194 +(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:676.25px" %)
205 205  |=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Function code|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address high|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address low|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Quantity high|=(% style="width: 1px; background-color: rgb(79, 129, 189); color: white;" %)Quantity low|=(% style="width: 139.083px; background-color: rgb(79, 129, 189); color: white;" %)Data length|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Data|=(% style="width: 50px;background-color:#4F81BD;color:white" %)CRC16 low|=(% style="width: 50px;background-color:#4F81BD;color:white" %)CRC16 high
206 206  |(% style="width:99px" %)0X12|(% style="width:112px" %)0X10|(% style="width:135px" %)0X00|(% style="width:126px" %)0X26|(% style="width:85px" %)0X00|(% style="width:1px" %)0X02|(% style="width:1px" %)0X04|(% style="width:1px" %)(((
207 207  0X00
... ... @@ -217,13 +217,13 @@
217 217  
218 218  response
219 219  
220 -(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:518px" %)
210 +(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:676.25px" %)
221 221  |=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Function code|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address high|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address low|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Quantity high|=(% style="width: 1px; background-color: rgb(79, 129, 189); color: white;" %)Quantity low|=(% style="width: 50px;background-color:#4F81BD;color:white" %)CRC16 low|=(% style="width: 50px;background-color:#4F81BD;color:white" %)CRC16 high
222 222  |(% style="width:99px" %)0X12|(% style="width:112px" %)0X10|(% style="width:135px" %)0X00|(% style="width:126px" %)0X26|(% style="width:85px" %)0X00|(% style="width:1px" %)0X02|(% style="width:1px" %)0XA2|(% style="width:1px" %)0XA0
223 223  
224 224  (2) Place the electrode in distilled water to clean it. Use 12.88mS/cm standard solution for the range of 10~~20000. After the data is stable, enter the following calibration command
225 225  
226 -(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:518px" %)
216 +(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:676.25px" %)
227 227  |=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Function code|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address high|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address low|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Quantity high|=(% style="width: 1px; background-color: rgb(79, 129, 189); color: white;" %)Quantity low|=(% style="width: 139.083px; background-color: rgb(79, 129, 189); color: white;" %)Data length|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Data|=(% style="width: 50px;background-color:#4F81BD;color:white" %)CRC16 low|=(% style="width: 50px;background-color:#4F81BD;color:white" %)CRC16 high
228 228  |(% style="width:99px" %)0X11|(% style="width:112px" %)0X10|(% style="width:135px" %)0X00|(% style="width:126px" %)0X26|(% style="width:85px" %)0X00|(% style="width:1px" %)0X02|(% style="width:1px" %)0X04|(% style="width:1px" %)(((
229 229  0X00
... ... @@ -239,17 +239,15 @@
239 239  
240 240  response
241 241  
242 -(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:518px" %)
232 +(% border="1" cellspacing="3" style="background-color:#f2f2f2; width:676.25px" %)
243 243  |=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Function code|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address high|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Address low|=(% style="width: 50px;background-color:#4F81BD;color:white" %)Quantity high|=(% style="width: 1px; background-color: rgb(79, 129, 189); color: white;" %)Quantity low|=(% style="width: 50px;background-color:#4F81BD;color:white" %)CRC16 low|=(% style="width: 50px;background-color:#4F81BD;color:white" %)CRC16 high
244 244  |(% style="width:99px" %)0X11|(% style="width:112px" %)0X06|(% style="width:135px" %)0X00|(% style="width:126px" %)0X26|(% style="width:85px" %)0X00|(% style="width:1px" %)0X02|(% style="width:1px" %)0XEB|(% style="width:1px" %)0X50
245 245  
246 -
247 -
248 248  = 2. DR-PH01 Water PH Sensor =
249 249  
238 +
250 250  == 2.1 Specification ==
251 251  
252 -
253 253  * **Power Input**: DC7~~30
254 254  * **Power Consumption** : < 0.5W
255 255  * **Interface**: RS485. 9600 Baud Rate
Copyright ©2010-2024 Dragino Technology Co., LTD. All rights reserved
Dragino Wiki v2.0