Gurux DLMS Conformance Test Tool

Join the Gurux Community or follow @Gurux for project updates.

Gurux.DLMS library is a high-performance component that helps you to read you DLMS/COSEM compatible electricity, gas or water meters. Component is available for csharp, Java, ANSI C, ANSI C++ and Delphi. So you can select what programming language you want to use. We have tried to make component so easy to use that you do not need understand protocol at all.

You should read FAQ first to get started. If you have an a idea how to improve Gurux DLMS Conformance Test Tool you can ask it on the Forum. You can report issues or improvements.

Gurux DLMS Conformance Test Tool

Purpose of Gurux DLMS Conformance Test Tool is that you can verify is your meter really DLMS compatible. There are a lot of new meter manufacturers who claims that their meters are supporting DLMS protocol. This has been a problem, because there is no tester for meter byers who wants to compare meters. Manufacturer can say that meters have passes DLMS Certificate tests. Using this tool you can verify is it true. In default It runs basic test that verifies is your supporting basic DLMS functionality. You can read more from this from DLMS Breen Book: 4.1.8.4 Mandatory contents of a COSEM logical device. It also reads all data from the meter and verifies that data structures are correct. Gurux Conformance Test Tool can't check is content of data correct. Tool can't know is value of active or reactive energy correct. As a result Gurux DLMS Conformance Test Tool will generate a report.
Note! All data is read from the meter and this will take some time.

Content of the tests

List of test cases can be found here.

Stating Conformance Test

First you need to add device(s) to GXDLMSDirector. After you have done this you can start Conformance Test. Make sure that Conformance Test is shown. You can show or hide Conformance Tests selecting "Conformance Tests" from "View" menu. Results of Conformance Test is show on bottom right of GXDLMSDirector. You can start new Conformance Test selecting "Run" from the pop-up window.
Select "Trace" from "View" menu if you want more information from the progress of Gurux Conformance Test.

Gurux DLMS CTT

Dialog windows opens and settings are show:
  • Concurrent testing creates own thread for each meter. If this is not selected meters are read one at the time.
  • Show Values shows read values on the report.
  • Re-read association View updates association view from the meter before tests are run.
  • Write testing will try to write read values back to the meter. Values are not saved. Note! Be careful with this.
  • Exclude Basic test will skip basic test. You can use this if you want only run external tests.
  • Delay can be used to set delay between tests.
  • External tests is the folder where external tests are get.
  • Invalid Password is used to test login using invalid password.
  • DelayConnection is time in seconds used to wait between connections.

Gurux DLMS Conformance Wizard

When OK is pressed, tests are starts. Each meter on the meter list is tested and own report is generated for all of the meters. Dialog is shown after tests are run. Results can be examine selecting "Show Report..." from the pop-up menu. Log can be check selecting "Show Log...". Read values are saved to values file and it can open selecting "Show Values...".

External tests

All tests are described as XML. This helps you to understand structure of DLMS messages and you can easily add own external tests for your needs. Easiest way to get started with your own tests is if you execute your test procedure with GXDLMSDirector (example read). Then paste send and received bytes to GuruxDLMSTranslator. Select "Messages" tab and paste bytes to Left size. Then press "To Messages". Copy xml to the file as save it to the file in "Tests" directory. This xml file is executed when tests are run.
Note! "External tests" must point to that folder where you save your test.
Strucure is like this:
<?xml version="1.0" encoding="utf-8"?>
<Messages>
  <GetRequest>
    <GetRequestNormal>
      <InvokeIdAndPriority Value="193" />
      <AttributeDescriptor>
        <!--DATA-->
        <ClassId Value="1" />
        <InstanceId Value="00002A0000FF" />
        <AttributeId Value="2" />
      </AttributeDescriptor>
    </GetRequestNormal>
  </GetRequest>
  <GetResponse>
    <GetResponseNormal>
      <InvokeIdAndPriority Value="193" />
      <Result>
        <Data>
          <None Value="*" />
        </Data>
      </Result>
    </GetResponseNormal>
  </GetResponse>
</Messages>


In reply packet you can describe that content of data can be anything by giving * as a value. Like this:
<UInt8 Value="*" />


If data type is ignored set data type to none like this:
<None Value="*" />
If you want that reply data is always type of Int16 and value is 10 you can describe it like this:
<Int16 Value="10" />