Added support for optional display of signed 16/32-bit integer Modbus register data
authorcbontje <cbontje@gmail.com>
Mon, 6 Jul 2015 21:28:28 +0000 (15:28 -0600)
committerPascal Quantin <pascal.quantin@gmail.com>
Tue, 7 Jul 2015 19:57:15 +0000 (19:57 +0000)
Change-Id: I2a81fdf426fdc20db200596ccd2eae26936fc81a
Reviewed-on: https://code.wireshark.org/review/9526
Reviewed-by: Graham Bloice <graham.bloice@trihedral.com>
Petri-Dish: Graham Bloice <graham.bloice@trihedral.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
epan/dissectors/packet-mbtcp.c
epan/dissectors/packet-mbtcp.h

index fb9f47029abbaec0a32c596484a4a808ee0926a6..690b0c57003d7173146224d02b95001c80548595 100644 (file)
@@ -148,7 +148,9 @@ static int hf_modbus_next_object_id = -1;
 static int hf_modbus_object_str_value = -1;
 static int hf_modbus_object_value = -1;
 static int hf_modbus_reg_uint16 = -1;
+static int hf_modbus_reg_int16 = -1;
 static int hf_modbus_reg_uint32 = -1;
+static int hf_modbus_reg_int32 = -1;
 static int hf_modbus_reg_ieee_float = -1;
 static int hf_modbus_reg_modicon_float = -1;
 static int hf_mbrtu_unitid = -1;
@@ -389,7 +391,9 @@ static const value_string conformity_level_vals[] = {
 
 static const enum_val_t mbus_register_format[] = {
   { "UINT16     ", "UINT16     ",  MBTCP_PREF_REGISTER_FORMAT_UINT16  },
+  { "INT16      ", "INT16      ",  MBTCP_PREF_REGISTER_FORMAT_INT16   },
   { "UINT32     ", "UINT32     ",  MBTCP_PREF_REGISTER_FORMAT_UINT32  },
+  { "INT32      ", "INT32      ",  MBTCP_PREF_REGISTER_FORMAT_INT32  },
   { "IEEE FLT   ", "IEEE FLT   ",  MBTCP_PREF_REGISTER_FORMAT_IEEE_FLOAT  },
   { "MODICON FLT", "MODICON FLT",  MBTCP_PREF_REGISTER_FORMAT_MODICON_FLOAT  },
   { NULL, NULL, 0 }
@@ -763,6 +767,8 @@ dissect_modbus_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint8
                     gint payload_start, gint payload_len, guint8 register_format)
 {
     gint reported_len, data_offset, reg_num = 0;
+    gint16  data16s;
+    gint32  data32s;
     guint16 data16, modflt_lo, modflt_hi;
     guint32 data32, modflt_comb;
     gfloat data_float, modfloat;
@@ -812,6 +818,14 @@ dissect_modbus_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint8
                         register_item = proto_tree_add_uint(tree, hf_modbus_reg_uint16, next_tvb, data_offset, 2, data16);
                         proto_item_set_text(register_item, "Register %u (UINT16): %u", reg_num, data16);
 
+                        data_offset += 2;
+                        reg_num += 1;
+                        break;
+                    case MBTCP_PREF_REGISTER_FORMAT_INT16: /* Standard-size signed integer 16-bit register */
+                        data16s = tvb_get_ntohs(next_tvb, data_offset);
+                        register_item = proto_tree_add_int(tree, hf_modbus_reg_int16, next_tvb, data_offset, 2, data16s);
+                        proto_item_set_text(register_item, "Register %u (INT16): %d", reg_num, data16s);
+
                         data_offset += 2;
                         reg_num += 1;
                         break;
@@ -820,6 +834,14 @@ dissect_modbus_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint8
                         register_item = proto_tree_add_uint(tree, hf_modbus_reg_uint32, next_tvb, data_offset, 4, data32);
                         proto_item_set_text(register_item, "Register %u (UINT32): %u", reg_num, data32);
 
+                        data_offset += 4;
+                        reg_num += 2;
+                        break;
+                    case MBTCP_PREF_REGISTER_FORMAT_INT32: /* Double-size signed integer 2 x 16-bit registers */
+                        data32s = tvb_get_ntohl(next_tvb, data_offset);
+                        register_item = proto_tree_add_int(tree, hf_modbus_reg_int32, next_tvb, data_offset, 4, data32s);
+                        proto_item_set_text(register_item, "Register %u (INT32): %d", reg_num, data32s);
+
                         data_offset += 4;
                         reg_num += 2;
                         break;
@@ -1733,11 +1755,21 @@ proto_register_modbus(void)
             FT_UINT16, BASE_DEC, NULL, 0x0,
             NULL, HFILL }
         },
+        { &hf_modbus_reg_int16,
+            { "Register (INT16)", "modbus.register.int16",
+            FT_INT16, BASE_DEC, NULL, 0x0,
+            NULL, HFILL }
+        },
         { &hf_modbus_reg_uint32,
             { "Register (UINT32)", "modbus.register.uint32",
             FT_UINT32, BASE_DEC, NULL, 0x0,
             NULL, HFILL }
         },
+        { &hf_modbus_reg_int32,
+            { "Register (INT32)", "modbus.register.int32",
+            FT_INT32, BASE_DEC, NULL, 0x0,
+            NULL, HFILL }
+        },
         { &hf_modbus_reg_ieee_float,
             { "Register (IEEE Float)", "modbus.register.ieee_float",
             FT_FLOAT, BASE_NONE, NULL, 0x0,
index cf5d322c3eff2780f966540b7d9152d479c15cb3..bf81de720e2dccad12446f7db5fa1fbbdad58dc8 100644 (file)
 #define MBTCP_PREF_REGISTER_FORMAT_UINT32          1
 #define MBTCP_PREF_REGISTER_FORMAT_IEEE_FLOAT      2
 #define MBTCP_PREF_REGISTER_FORMAT_MODICON_FLOAT   3
+#define MBTCP_PREF_REGISTER_FORMAT_INT16           4
+#define MBTCP_PREF_REGISTER_FORMAT_INT32           5
 
 #define MBTCP_PREF_REGISTER_ADDR_RAW    0
 #define MBTCP_PREF_REGISTER_ADDR_MOD5   1