Skip to main content
7-Bedrock
November 7, 2017
Solved

How to figure out at which memory address each data from the sensors is being stored in?

  • November 7, 2017
  • 3 replies
  • 6972 views

Hey all, I'm playing around with the SigmaTile and KepServerEX.

I imported the KepServerEX project and it is working fine but I'm trying to understand how it works under the surface.

I wanted to replicate the Channel, Device and Tags to set them up myself from scratch, however I don't know which addreses to set for the tags.

How to figure out at which memory address each data from the sensors is being stored in on the modbus emulation on the Raspberry Pi?

In the original project settings I see for example for the Humidity tag there is the Address 40003. Where is this set/defined, where can I look it up?

I searched through the Sigma Tile python code but could not find the answer.

Anyone can help with that?

 

Thanks

Boris

Best answer by bblajevici

Thanks for your reply Milan.

I think I got the idea but I'm not sure 100%.

I did some research on modbus to understand better how memory addresses are managed.

Is following logic correct?

- Sensors data is stored in holding registers (hr) starting at 40001 to 49999 (modbus architecture) (?)

- When you update the datastore consecutiveley the memory addresses are being written in the order given by the Python script (2 adresses for each float value)

     1 - temperature (400001, 400002) - 400001 being the one to trigger from Kepware in order to get the tag value

     2 - humidity (400003, 400004) - 400003

     3 - pressure (400005, 400006) - 400005   

     4 - acceleration_x(400007, 400008) - 400008

     ...

      this goes on for acceleration, vibration, gyrosocope

- Then there are some more values written for screen control, bad count, good count... where you explicitly specify the address in the setvalue function

for example for screencontrol you provide the address 0x18 which is 24, then added to 400001 results in 400025 which is the address triggered by KEPServerEX

Thanks

Boris

3 replies

12-Amethyst
November 7, 2017

You should able to find it from Quick Client. Open the device (usually Channel_Name.Device_Name). On the Right side window, you will see the properties associated with that device. Right Click and Select Properties. Last line will give you the address. Its value is what you are looking for.

I hope this helps.

Thanks,

Varathan

7-Bedrock
November 8, 2017

Hi Varathan,

thanks for your reply.

Yes, I had already found that in the demo project. The question was if I haven''t had the demo project and I would just want to set up everything from scratch in KEPServerEX, where should I look up the exact memory address information for each sensor data (on the tile)?

I see Milan has replied also, I will read through the python code and see if I can figure it out.

Thanks

Boris

5-Regular Member
November 7, 2017

Hey Boris,

Varathan tackled the Kepware (client) side of things, but on the server side (the tile) you should look into the Python script called SigmaTile_SenseHat.  There's a thread called update_sensor_datastore which queries the sensors and updates the datastore.

There's a little bit of hacking in this function - I couldn't initialize the modbus datastore to hold 32 bit floats, so I took that float and split it into two uint16s which are then stored in the datastore consecutively.  Kepware can then pack those two uint16s back to a 32 bit float, so that it interprets the number correctly.

Let me know if you have any questions!

Milan

bblajevici7-BedrockAuthorAnswer
7-Bedrock
November 8, 2017

Thanks for your reply Milan.

I think I got the idea but I'm not sure 100%.

I did some research on modbus to understand better how memory addresses are managed.

Is following logic correct?

- Sensors data is stored in holding registers (hr) starting at 40001 to 49999 (modbus architecture) (?)

- When you update the datastore consecutiveley the memory addresses are being written in the order given by the Python script (2 adresses for each float value)

     1 - temperature (400001, 400002) - 400001 being the one to trigger from Kepware in order to get the tag value

     2 - humidity (400003, 400004) - 400003

     3 - pressure (400005, 400006) - 400005   

     4 - acceleration_x(400007, 400008) - 400008

     ...

      this goes on for acceleration, vibration, gyrosocope

- Then there are some more values written for screen control, bad count, good count... where you explicitly specify the address in the setvalue function

for example for screencontrol you provide the address 0x18 which is 24, then added to 400001 results in 400025 which is the address triggered by KEPServerEX

Thanks

Boris

10-Marble
October 9, 2018

SigmaTile

 

Hi Boris,

the adresses are defined in hexadecimal format in the phyton script. Search please for the corresponding variables

You will find 0x1c for the VibrationAlert

0x1C = 28 (from hexa to dec)

add one because of modbus so you get 29

In Modbus the registers 40001-49999 are typically used for analog output holding

So it looks like 40029 for the VibrationAlert.

You can apply the same mechanism for all the other variables / sensor values

Hope it helps you

Christoph C.

 

 

14-Alexandrite
February 15, 2019

Hi ccertain,

 

I'm trying to read VibrationAlert by reading 40029.

But it reads only once and never update.

The value is 1 and update count is also 1.

If you have working opf file, please share it with me.

Or could you tell me which point I should check, please?

 

Best regards

Akira