# How to read a 32bit signed on ModBus

**URL:** <https://discourse.nodered.org/t/how-to-read-a-32bit-signed-on-modbus/21079>\
**Category:** General\
**Created:** [31 January 2020 11:12 UTC](https://discourse.nodered.org/t/how-to-read-a-32bit-signed-on-modbus/21079 "2020-01-31T11:12:53Z")\
**Posts on this page:** 16\
**Page:** 1

<div class="post-metadata">

**Author:** ![TheMisterA](https://avatars.discourse-cdn.com/v4/letter/t/ecb155/32.png) [@TheMisterA](https://discourse.nodered.org/u/TheMisterA)\
**Post date:** [31 January 2020 11:12 UTC](https://discourse.nodered.org/t/how-to-read-a-32bit-signed-on-modbus/21079/1 "2020-01-31T11:12:53Z")

</div>

Hi everyone !

I have a problem with a Socomec I31. It send me a DWord Signed on ModBus and I can't add the two Word for make a Decimal Value.

How I can read my S32 in decimal ?

Thank you !

---

<div class="post-metadata">

**Author:** ![Colin](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/colin/32/17040_2.png) [@Colin](https://discourse.nodered.org/u/Colin)\
**Post date:** [31 January 2020 11:27 UTC](https://discourse.nodered.org/t/how-to-read-a-32bit-signed-on-modbus/21079/2 "2020-01-31T11:27:53Z")

</div>

Feed the value into a debug node and post the result here so we can see exactly what you have

---

<div class="post-metadata">

**Author:** ![TheMisterA](https://avatars.discourse-cdn.com/v4/letter/t/ecb155/32.png) [@TheMisterA](https://discourse.nodered.org/u/TheMisterA)\
**Post date:** [31 January 2020 13:41 UTC](https://discourse.nodered.org/t/how-to-read-a-32bit-signed-on-modbus/21079/3 "2020-01-31T13:41:19Z")

</div>

Hi !

This is the result of my debug node :

> Blockquote :  
> msg.payload : array[2]  
> array[2]  
> 0: 65535  
> 1: 65534

Thanks !

---

<div class="post-metadata">

**Author:** ![Colin](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/colin/32/17040_2.png) [@Colin](https://discourse.nodered.org/u/Colin)\
**Post date:** [31 January 2020 15:07 UTC](https://discourse.nodered.org/t/how-to-read-a-32bit-signed-on-modbus/21079/4 "2020-01-31T15:07:19Z")

</div>

I should think you need something like

```auto
msg.payload = (msg.payload[0] << 16) + msg.payload[1]
return msg

```

---

<div class="post-metadata">

**Author:** ![TheMisterA](https://avatars.discourse-cdn.com/v4/letter/t/ecb155/32.png) [@TheMisterA](https://discourse.nodered.org/u/TheMisterA)\
**Post date:** [31 January 2020 15:33 UTC](https://discourse.nodered.org/t/how-to-read-a-32bit-signed-on-modbus/21079/5 "2020-01-31T15:33:21Z")

</div>

Your code return me :

> -2

---

<div class="post-metadata">

**Author:** ![dceejay](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dceejay/32/38_2.png) [@dceejay](https://discourse.nodered.org/u/dceejay)\
**Post date:** [31 January 2020 15:43 UTC](https://discourse.nodered.org/t/how-to-read-a-32bit-signed-on-modbus/21079/6 "2020-01-31T15:43:14Z")

</div>

which would be correct for a 32 bit signed int when passed that data.  
In hex that is FFFFFFFE which is -2.

---

<div class="post-metadata">

**Author:** ![TheMisterA](https://avatars.discourse-cdn.com/v4/letter/t/ecb155/32.png) [@TheMisterA](https://discourse.nodered.org/u/TheMisterA)\
**Post date:** [3 February 2020 13:29 UTC](https://discourse.nodered.org/t/how-to-read-a-32bit-signed-on-modbus/21079/7 "2020-02-03T13:29:06Z")

</div>

I create a function :

> msg.payload=parseInt(msg.payload[0]+msg.payload[1] \<\< 16);  
> return msg;

The message returned is : -3604480

With a Usigned 32 bits it's OK...

---

<div class="post-metadata">

**Author:** ![Colin](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/colin/32/17040_2.png) [@Colin](https://discourse.nodered.org/u/Colin)\
**Post date:** [3 February 2020 13:52 UTC](https://discourse.nodered.org/t/how-to-read-a-32bit-signed-on-modbus/21079/8 "2020-02-03T13:52:00Z")

</div>

I don't understand what you are saying. What result are you trying to get?

---

<div class="post-metadata">

**Author:** ![TheMisterA](https://avatars.discourse-cdn.com/v4/letter/t/ecb155/32.png) [@TheMisterA](https://discourse.nodered.org/u/TheMisterA)\
**Post date:** [3 February 2020 14:12 UTC](https://discourse.nodered.org/t/how-to-read-a-32bit-signed-on-modbus/21079/9 "2020-02-03T14:12:09Z")

</div>

![cap1](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/9/c/9cd63da0637416b9c14bf73899569adc9b8b550f.png)

In my test function :

> msg.payload=(msg.payload[1] \<\< 32)+msg.payload[0]  
> return msg;

In my simple add function :

> msg.payload=parseInt(msg.payload[0]+msg.payload[1] \<\< 16);  
> return msg;

---

<div class="post-metadata">

**Author:** ![Colin](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/colin/32/17040_2.png) [@Colin](https://discourse.nodered.org/u/Colin)\
**Post date:** [3 February 2020 14:13 UTC](https://discourse.nodered.org/t/how-to-read-a-32bit-signed-on-modbus/21079/10 "2020-02-03T14:13:29Z")

</div>

You have not made it clear whether everything is now working as you expect. If not the what output are you expecting?

---

<div class="post-metadata">

**Author:** ![TheMisterA](https://avatars.discourse-cdn.com/v4/letter/t/ecb155/32.png) [@TheMisterA](https://discourse.nodered.org/u/TheMisterA)\
**Post date:** [3 February 2020 14:38 UTC](https://discourse.nodered.org/t/how-to-read-a-32bit-signed-on-modbus/21079/11 "2020-02-03T14:38:21Z")

</div>

Sorry,

It does'nt work. I expected read 1 500w or even 2 000w...

---

<div class="post-metadata">

**Author:** ![Colin](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/colin/32/17040_2.png) [@Colin](https://discourse.nodered.org/u/Colin)\
**Post date:** [3 February 2020 14:49 UTC](https://discourse.nodered.org/t/how-to-read-a-32bit-signed-on-modbus/21079/12 "2020-02-03T14:49:21Z")

</div>

Well the problem is not in the conversion. The value 0xfffffffe as a 32 bit signed integer is -2. Considering it as an unsigned integer gives a huge number.

---

<div class="post-metadata">

**Author:** ![TheMisterA](https://avatars.discourse-cdn.com/v4/letter/t/ecb155/32.png) [@TheMisterA](https://discourse.nodered.org/u/TheMisterA)\
**Post date:** [3 February 2020 14:58 UTC](https://discourse.nodered.org/t/how-to-read-a-32bit-signed-on-modbus/21079/13 "2020-02-03T14:58:07Z")

</div>

Yeah, the MSB is : 65535, but, how do I read those two words correctly ?

---

<div class="post-metadata">

**Author:** ![TheMisterA](https://avatars.discourse-cdn.com/v4/letter/t/ecb155/32.png) [@TheMisterA](https://discourse.nodered.org/u/TheMisterA)\
**Post date:** [3 February 2020 15:06 UTC](https://discourse.nodered.org/t/how-to-read-a-32bit-signed-on-modbus/21079/14 "2020-02-03T15:06:33Z")

</div>

I have found the solution.

For me, I read with this function :

> msg.payload=(msg.payload[0])+(-msg.payload[1] \<\< 32)  
> return msg;

And it's work !

In output, it's my value in decimal.

Thanks @Colin

---

<div class="post-metadata">

**Author:** ![Colin](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/colin/32/17040_2.png) [@Colin](https://discourse.nodered.org/u/Colin)\
**Post date:** [3 February 2020 15:56 UTC](https://discourse.nodered.org/t/how-to-read-a-32bit-signed-on-modbus/21079/15 "2020-02-03T15:56:58Z")

</div>

Can you give an example of the data in and out for that formula, I would like to see why it works.

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/1X/d073cd938eafa2e558d7c2cd59003b3ef4963033.png) [@system](https://discourse.nodered.org/u/system)\
**Post date:** [17 February 2020 15:57 UTC](https://discourse.nodered.org/t/how-to-read-a-32bit-signed-on-modbus/21079/16 "2020-02-17T15:57:04Z")

</div>

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.
