diff --git a/master/datagram.c b/master/datagram.c
index 0fe61111da2204ad3290a52c7f640b65c543a9c7..ae0379f594453799b603990b004fc0e101c64e05 100644
--- a/master/datagram.c
+++ b/master/datagram.c
@@ -63,6 +63,30 @@
 
 /*****************************************************************************/
 
+/** Array of datagram type strings used in ec_datagram_type_string().
+ *
+ * \attention This is indexed by ec_datagram_type_t.
+ */
+static const char *type_strings[] = {
+    "?",
+    "APRD",
+    "APWR",
+    "APRW",
+    "FPRD",
+    "FPWR",
+    "FPRW",
+    "BRD",
+    "BWR",
+    "BRW",
+    "LRD",
+    "LWR",
+    "LRW",
+    "ARMW",
+    "FRMW"
+};
+    
+/*****************************************************************************/
+
 /** Constructor.
  */
 void ec_datagram_init(ec_datagram_t *datagram /**< EtherCAT datagram. */)
@@ -473,3 +497,14 @@ void ec_datagram_output_stats(
 }
 
 /*****************************************************************************/
+
+/** Returns a string describing the datagram type.
+ */
+const char *ec_datagram_type_string(
+        const ec_datagram_t *datagram /**< EtherCAT datagram. */
+        )
+{
+    return type_strings[datagram->type];
+}
+
+/*****************************************************************************/
diff --git a/master/datagram.h b/master/datagram.h
index 41b6bd1a6b8cfd0496cb6c4bc3da6463c67ff3af..daf1b1ec38ef58908dbbeb7770817957162103ac 100644
--- a/master/datagram.h
+++ b/master/datagram.h
@@ -138,7 +138,8 @@ int ec_datagram_lwr(ec_datagram_t *, uint32_t, size_t, uint8_t *);
 int ec_datagram_lrw(ec_datagram_t *, uint32_t, size_t, uint8_t *);
 
 void ec_datagram_print_wc_error(const ec_datagram_t *);
-void ec_datagram_output_stats(ec_datagram_t *datagram);
+void ec_datagram_output_stats(ec_datagram_t *);
+const char *ec_datagram_type_string(const ec_datagram_t *);
 
 /*****************************************************************************/