Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
en:sw:01-mervis:connecting-to-modbus-slave-device-hidden [2018/06/18 14:31]
martin_kudlacek [Connecting to ModbusRTU slave]
en:sw:01-mervis:connecting-to-modbus-slave-device-hidden [2021/08/05 12:23]
avsetula
Line 1: Line 1:
 ====== Connecting to Modbus slave ====== ====== Connecting to Modbus slave ======
 +<WRAP group>
 +<WRAP half column 81%>
 One of the most common thing todo in industrial automation, is setting up the communication via Modbus. One of the most common thing todo in industrial automation, is setting up the communication via Modbus.
 +</​WRAP>​ 
 +<WRAP half column 15%> 
 +;;# 
 +<​html><​span class="​dev-tag dev-patron">​Patron</​span></​html>​ \\ 
 +<​html><​span class="​dev-tag dev-neuron">​Neuron</​span></​html>​ \\ 
 +<​html><​span class="​dev-tag dev-gate">​Gate</​span></​html>​ \\ 
 +<​html><​span class="​dev-tag dev-unipi11">​Unipi&​nbsp1.1</​span></​html>​ \\ 
 +<​html><​span class="​dev-tag dev-axon">​Axon</​span></​html>​ 
 +;;# 
 +</​WRAP>​ 
 +</​WRAP>​
 ===== Connecting to ModbusRTU slave ===== ===== Connecting to ModbusRTU slave =====
 Let's assume you have a basic project in **Full mode**. You are attached to the controller, you have created **Executable project** with one **FBD** program and this program is set in PLC's **Tasks**. You also did a **Set Autogen** on the UniPi controller, and the **Build** and **Deploy** works without any problem. Let's assume you have a basic project in **Full mode**. You are attached to the controller, you have created **Executable project** with one **FBD** program and this program is set in PLC's **Tasks**. You also did a **Set Autogen** on the UniPi controller, and the **Build** and **Deploy** works without any problem.
Line 41: Line 53:
 </​WRAP>​ </​WRAP>​
  
 +===== Configuration of datapoints =====
 The basic configuration of the ModbusRTU device is done, now we can dive into much more complicated stuff - the register map. Double click on the name of the newly added device. In the **Main window** an empty list of Modbus registers will appear. The basic configuration of the ModbusRTU device is done, now we can dive into much more complicated stuff - the register map. Double click on the name of the newly added device. In the **Main window** an empty list of Modbus registers will appear.
  
Line 59: Line 72:
 Unfortunately,​ this is where it starts to be really complicated,​ mostly due to the various ways of how the Modbus protocol is implemented by different vendors. Unfortunately,​ this is where it starts to be really complicated,​ mostly due to the various ways of how the Modbus protocol is implemented by different vendors.
  
-As you can see, the register'​s addresses are in hexadecimal format. You can't tell from the **Voltage** register, because the address of 5000 could be both in hexadecimal and decimal format. But if you take a look on the **Current** register, the value 500A clearly shows it is in hexadecimal format.+As you can see, the register'​s addresses are in hexadecimal format. You can't tell from the **Voltage** register, because the address of 5000 could be both in hexadecimal and decimal format. But if you take a look on the **Current** register, the value 500 A clearly shows it is in hexadecimal format.
  
 The Mervis IDE accepts only decimal values for Modbus registers, so you need to manually convert the ones from the manual, e.g. with calculator application in Windows or in MS Excel. The Mervis IDE accepts only decimal values for Modbus registers, so you need to manually convert the ones from the manual, e.g. with calculator application in Windows or in MS Excel.
Line 111: Line 124:
 {{ :​en:​sw:​01-mervis:​connecting-to-modbus-slave-20-set-autogen-dialog.png?​direct |}} {{ :​en:​sw:​01-mervis:​connecting-to-modbus-slave-20-set-autogen-dialog.png?​direct |}}
  
-Now you can **Build** and **Deploy** the solution. If everything goes well and the program is running, turn on the **Debugging**. Then switch to the **Variable Browser** tab in the **Main window** and under the name, search for the **voltage**. The only variable that shows up should be our datapoint with up-to-date information about the line's voltage.+Now you can **Build** and **Deploy** the solution. If everything goes well and the program is running, turn on the **Debugging**. Then switch to the **Variable Browser** tab in the **Main window** and under the name, search for the **voltage**. The only variable that should show up should be our datapoint with up-to-date information about the line's voltage.
  
 {{ :​en:​sw:​01-mervis:​connecting-to-modbus-slave-21-variable-browser.png?​direct |}} {{ :​en:​sw:​01-mervis:​connecting-to-modbus-slave-21-variable-browser.png?​direct |}}
  
 +To be able to continue with the tutorial, you need to fully understand, what we did with the **Voltage** and how to represent different data types in Modbus.
 +
 +The Modbus knows only 16bit registers (forget about the "​coils"​ for now). Therefor in one register, we can store only 65536 values. Those values can represent different types of numbers. It can represent unsigned integer number from 0 - 65535. It can represent signed integer from -32768 to 32767. Or we don't need to use all the possible values and covert it directly to "​char"​ number with values 0 - 255.
 +But if you need to exchange data type with slave, which needs more then 16bit of space, you need to use more than 1 Modbus register and then do the transformation of data in the Mervis. This is what we did with the **Voltage**. The **Voltage** is a real number which needs 32bit space. In the Inepro manual, you can see the data type is "​float"​ and the register'​s length is 2. This doesn'​t mean the register has different size other than 16bit, but rather tells us the **Voltage** is stored in 2 registers - on address 5000H and 5001H. In order to recreate the value in Mervis, we had to read 2 registers and put them together into one variable.
 +
 +This parsing of multiple registers into datapoint (variable) is done on two levels. First, we need to tell the Mervis to read more registers at once. This is done on the **Group** level. We specified **the first register number** we want to read (the **Starting Element**) and the number of registers we want to read from this number (the **Quantity of Elements**). As you can check above, we started reading from the register number 20481 and we read 12 consecutive 16bit registers = 24 bytes.
 +
 +Next thing we did, is that we specified the **Voltage** datapoint. We pointed this datapoint to the group, so it will be taking data from this group and transform it to some variable. To tell exactly, which data from the group the datapoint should use, we configured the **Modbus Data Point Parameters**. For reading data from group to datapoint, you need to set the **Data Offset (Parser)** and the **Multibyte Length (Parser)**. ​
 +
 +The **Data Offset (Parser)** indicates the first **byte** (not register!) from the group, and the **Multibyte Length (Parser)** is a number of **bytes** to parse into this variable. As you can check, we selected first 4 bytes from the group (Data Offset = 0, Multibyte Length = 4), which corresponds with 2 registers (4*8bit = 2*16bit). And by setting the **ST Type**, we set the transformation of this 32bit data space into a real number. It sounds a quite complicated,​ but with next datapoint, it will be a bit clearer hopefully.
 +
 +So let's add another datapoint - **Grid frequency**. As you can see from the Modbus register'​s map, the **Grid frequency** is on the address 5008 and the register'​s length (more like value length) is 2. We know, we already have the group **5000-500B** configured to cover these registers as well, therefor we can define the datapoint directly. Right click on the free space on the tab **energyMeterL1** on the **Main window** and from the context menu select **Add Data Point**. A new datapoint will appear and you can change its properties. The result should look like this:
  
 +{{ :​en:​sw:​01-mervis:​connecting-to-modbus-slave-22-grid-frequency.png?​direct |}}
  
 +  * We named the datapoint **GridFrequency**
 +  * We specified to take data from group **5000-500B**
 +  * The **Comm. Value Mapped Type** is **Builtin** and the **ST Type** is **real**
 +  * The **Data Offset (Parser)** = (address of the register - address of the first register in group) * 2 = (5008H-5000H) * 2 = 16
 +  * The **MultiByte Length (Parser)** is 4 (4 bytes = 2 16bit registers)
  
 +Because we added new datapoint, you need to run the **Set Autogen** on the device. Then **Deploy** the solution, turn on the **Debugging** mode and switch to **Variable Browser** tab in **Main window**. In the browser, search for the **energyMeterL1**. You should see this:
  
 +{{ :​en:​sw:​01-mervis:​connecting-to-modbus-slave-23-variable-browser.png?​direct |}}