Rozdział 17. Uniwersalny daemon do komunikacji z urządzeniami w protokole M-Bus

Spis treści
17.1. Konfiguracja
17.2. Badanie konfiguracji nowo podłączanego urządzenia

17.1. Konfiguracja

Demona służącego do komunikacji z urządzeniami w protokole M-Bus konfigurujemy, podobnie jak każdego innego daemon wchodzącego w skład systemu SZARP, poprzez plik params.xml. W tym celu tworzymy nową sekcję device podając w niej odpowiednią ścieżkę do Damona oraz, jako ścieżkę do urządzenia, ścieżkę do konwertera M-Bus <-> RS232, na przykład:

<device daemon="/opt/szarp/bin/mbusdmn" path="/dev/ttyS0">
            
Polecane jest również skonfigurowanie odpowiedniej prędkości transmisji poprzez podanie atrybutu speed, np.:
<device ... speed="300" ... >
            
Prędkość 300 bodów obsługiwana powinna być przez wszystkie urządzenia w protokole M-Bus, wyższe prędkości należy wykorzystywać tylko wtedy, kiedy mamy pewność, że wszystkie urządzenia podłączone do naszej szyny potrafią ją obsłużyć. Można również ustalić odstęp między kolejnymi odczytami danych z urządzenia - należy go podać w sekundach jako wartość parametru askdelay.

Wszystkie pozostałe atrybuty konfiguracyjne dotyczące tego demona powinny być umieszczone w przestrzeni nazw http://www.praterm.com.pl/SZARP/ipk-extra, więc warto zadbać o nazwanie jej w params.xml, np.:

<device ... xmlns:mbus="http://www.praterm.com.pl/SZARP/ipk-extra" ... >
            
Oczywiście nazwa "mbus" jest tylko nazwą przykładową, jednakże polecaną ze względu na czytelność i łatwość zrozumienia. Oczywiście nazwanie przestrzeni nazw nie musi występować w elemencie device - może znajdować się również w dowolnym elemencie nadrzędnym.

Do najważniejszych parametrów, które można skonfigurować w elemencie device należą:

Poza tymi atrybutami występują także istotne atrybuty konfiguracyjne w elemencie unit, które pozwalają skonfigurować parametry komunikacji dla poszczególnych urządzeń (w przeciwieństwie do parametrów z elementu device, które kontrolują globalnie transmisję w całej szynie M-Bus). Oto one:

Oprócz tego w każdym elemencie param można skonfigurować specjalne operacje (transformacje), które mają być wykonywane na poszczególnych wartościach przesyłanych do systemu SZARP. Możliwe atrybuty to:

Przykładowa konfiguracja w params.xml dla ciepłomierza Landis&Gyr WSD-6 z modułem komunikacyjnym WZD-MB:

    <device xmlns:mbus="http://www.praterm.com.pl/SZARP/ipk-extra" daemon="/opt/szarp/bin/mbusdmn" 
        path="/dev/ttyS2" speed="300" mbus:byte_interval="50000" mbus:databits="8" mbus:stopbits="0" 
        mbus:parity="even" options="--askdelay 30240">
      <unit id="1" type="1" subtype="1" bufsize="1" mbus:address="0">
        <param name="Landis Gyr:Węzeł:czas pracy LSW" short_name="OnL" draw_name="-" unit="-" prec="0" 
            mbus:transform="lw">
                <raport title="Landis Gyr" order="25"/>
        </param>
        <param name="Landis Gyr:Węzeł:czas pracy MSW" short_name="OnM" draw_name="-" unit="-" prec="0" 
            mbus:transform="mw" mbus:special="prev">
                <raport title="Landis Gyr" order="26"/>
        </param>
        <param name="Landis Gyr:Węzeł:aktualny przepływ z licznika 1 LSW" short_name="Gwy1L" 
            draw_name="-" unit="-" prec="4" base_ind="auto" mbus:transform="lw">
                <raport title="Landis Gyr" order="1"/>
        </param>
        <param name="Landis Gyr:Węzeł:aktualny przepływ z licznika 1 MSW" short_name="Gwy1M" 
            draw_name="-" unit="-" prec="4" base_ind="auto" mbus:transform="mw" mbus:special="prev">
                <raport title="Landis Gyr" order="2"/>
        </param>
        <param name="Landis Gyr:Węzeł:temperatura powrotna" short_name="Tpow" draw_name="Temp. powrotu" 
            unit="°C" prec="0" base_ind="auto">
            <raport title="Landis Gyr" order="8"/>
            <draw title="Landis Gyr" order="2" min="0" max="150" />
        </param>
        <param name="Landis Gyr:Węzeł:time point 1" short_name="-" draw_name="-" unit="-" prec="0"/>
        <param name="Landis Gyr:Węzeł:objętość LSW" short_name="VL" draw_name="-" unit="m3" prec="0" 
            base_ind="auto" mbus:transform="lw">
                <raport title="Landis Gyr" order="15"/>
        </param>
        <param name="Landis Gyr:Węzeł:objętość MSW" short_name="VM" draw_name="-" unit="m3" prec="0" 
            base_ind="auto" mbus:transform="mw" mbus:special="prev">
                <raport title="Landis Gyr" order="16"/>
        </param>
        <param name="Landis Gyr:Węzeł:numer fabryczny LSW" short_name="NoL" draw_name="-" unit="-" 
            prec="0" mbus:transform="lw">
                <raport title="Landis Gyr" order="29"/>
        </param>
        <param name="Landis Gyr:Węzeł:numer fabryczny MSW" short_name="NoM" draw_name="-" unit="-" 
            prec="0" mbus:transform="mw" mbus:special="prev">
                <raport title="Landis Gyr" order="30"/>
        </param>
        <param name="Landis Gyr:Węzeł:temperatura wyjściowa" short_name="Twy" 
            draw_name="Temp. wyjściowa" unit="°C" prec="0" base_ind="auto">
            <raport title="Landis Gyr" order="7"/>
            <draw title="Landis Gyr" prior="11" order="1" min="0" max="150"/>
        </param>
        <param name="Landis Gyr:Węzeł:moc wyjściowa z licznika 2" short_name="Qwy2" 
            draw_name="Moc z licz. 2" unit="kW" prec="0" base_ind="auto">
            <raport title="Landis Gyr" order="11"/>
            <draw title="Landis Gyr" order="8" min="0" max="2000" />
        </param>
        <param name="Landis Gyr:Węzeł:czas pracy błędnej LSW" short_name="ErL" draw_name="-" unit="h" 
            prec="0" mbus:transform="lw">
                <raport title="Landis Gyr" order="27"/>
        </param>
        <param name="Landis Gyr:Węzeł:czas pracy błędnej MSW" short_name="ErM" draw_name="-" unit="h" 
            prec="0" mbus:transform="mw" mbus:special="prev">
                <raport title="Landis Gyr" order="28"/>
        </param>
        <param name="Landis Gyr:Węzeł:moc wyjściowa z licznika 1 LSW" short_name="Q1L" draw_name="-" 
            unit="kW" prec="0" base_ind="auto" mbus:transform="lw">
                <raport title="Landis Gyr" order="9"/>
        </param>
        <param name="Landis Gyr:Węzeł:moc wyjściowa z licznika 1 MSW" short_name="Q1M" draw_name="-" 
            unit="kW" prec="0" base_ind="auto" mbus:transform="mw" mbus:special="prev">
                <raport title="Landis Gyr" order="10"/>
        </param>
        <param name="Landis Gyr:Węzeł:aktualny przepływ z licznika 2" short_name="Gwy2" draw_name="-" 
            unit="m3/h" prec="1" base_ind="auto">
            <raport title="Landis Gyr" order="3"/>
        </param>
        <param name="Landis Gyr:Węzeł:maksymalna moc wyjściowa" short_name="Qmax" 
            draw_name="Moc maksymalna" unit="kW" prec="0" base_ind="auto">
            <raport title="Landis Gyr" order="12"/>
        </param>
        <param name="Landis Gyr:Węzeł:data maksimum mocy wyjściowej LSW" short_name="QmxDL" 
            draw_name="-" unit="-" prec="0" base_ind="auto" mbus:transform="lw">
                <raport title="Landis Gyr" order="13"/>
        </param>
        <param name="Landis Gyr:Węzeł:data maksimum mocy wyjściowej MSW" short_name="QmxDM" draw_name="-" 
            unit="-" prec="0" base_ind="auto" mbus:transform="mw" mbus:special="prev">
                <raport title="Landis Gyr" order="14"/>
        </param>
        <param name="Landis Gyr:Węzeł:energia z licznika 2 LSW" short_name="E2L" draw_name="-" unit="-" 
            prec="0" base_ind="auto" mbus:transform="lw">
                <raport title="Landis Gyr" order="23"/>
        </param>
        <param name="Landis Gyr:Węzeł:energia z licznika 2 MSW" short_name="E2M" draw_name="-" unit="-" 
            prec="0" base_ind="auto" mbus:transform="mw" mbus:special="prev">
                <raport title="Landis Gyr" order="24"/>
        </param>
        <param name="Landis Gyr:Węzeł:energia sumaryczna z licznika 1 LSW" short_name="Ec1L" draw_name="-" 
            unit="-" prec="0" base_ind="auto" mbus:transform="lw">
                <raport title="Landis Gyr" order="21"/>
        </param>
        <param name="Landis Gyr:Węzeł:energia sumaryczna z licznika 1 MSW" short_name="Ec1M" draw_name="-" 
            unit="-" prec="0" base_ind="auto" mbus:transform="mw" mbus:special="prev">
                <raport title="Landis Gyr" order="22"/>
        </param>
        <param name="Landis Gyr:Węzeł:energia z licznika 1 w taryfie 1 LSW" short_name="E1t1L" draw_name="-" 
            unit="-" prec="0" base_ind="auto" mbus:transform="lw">
                <raport title="Landis Gyr" order="17"/>
        </param>
        <param name="Landis Gyr:Węzeł:energia z licznika 1 w taryfie 1 MSW" short_name="E1t1M" draw_name="-" 
            unit="-" prec="0" base_ind="auto" mbus:transform="lw" mbus:special="prev">
                <raport title="Landis Gyr" order="18"/>
        </param>
        <param name="Landis Gyr:Węzeł:energia z licznika 1 w taryfie 2 LSW" short_name="E1t2L" draw_name="-" 
            unit="-" prec="0" base_ind="auto" mbus:transform="lw">
                <raport title="Landis Gyr" order="19"/>
        </param>
        <param name="Landis Gyr:Węzeł:energia z licznika 1 w taryfie 2 MSW" short_name="E1t2M" draw_name="-" 
            unit="-" prec="0" base_ind="auto" mbus:transform="lw" mbus:special="prev">
                <raport title="Landis Gyr" order="20"/>
        </param>
        <param name="Landis Gyr:Węzeł:data maksimum przepływu LSW" short_name="GmxDL" draw_name="-" unit="-" 
            prec="0" base_ind="auto" mbus:transform="lw">
                <raport title="Landis Gyr" order="5"/>
        </param>
        <param name="Landis Gyr:Węzeł:data maksimum przepływu MSW" short_name="GmxDM" draw_name="-" unit="-" 
            prec="0" base_ind="auto" mbus:transform="mw" mbus:special="prev">
                <raport title="Landis Gyr" order="6"/>
        </param>
        <param name="Landis Gyr:Węzeł:maksymalny przepływ" short_name="Gmax" draw_name="Przepływ maks." 
            unit="m3/h" prec="1" base_ind="auto">
            <raport title="Landis Gyr" order="4"/>
        </param>
    </unit>
  </device>
            
Jak widać, ciepłomierz ten większość parametrów dostarcza jako długie (tzn. dłuższe niż 16 bitów) liczby, więc przy przesyłaniu do SZARP-a konieczne jest ich dzielenie na mniej i bardziej znaczące słowo. Aby następnie w wygodny sposób prezentować na wykresach tak zebrane dane, można użyć parametrów definiowalnych typu DRAWDEFINABLE (dokładny opis: Sekcja 5.2.8). Na przykład dane z powyższego ciepłomierza prezentowane są w sposób następujący sposób:
<drawdefinable>
...
    <param name="Landis Gyr:Węzeł:czas pracy" short_name="OnTime" draw_name="-" unit="-" prec="0">
        <define type="DRAWDEFINABLE" formula="(*:*:czas pracy MSW) (*:*:czas pracy LSW) :"/>
    </param>
    <param name="Landis Gyr:Węzeł:aktualny przepływ z licznika 1" short_name="Gwy1" draw_name="Przepływ" 
        unit="m3/h" prec="3" base_ind="auto">
        <define type="DRAWDEFINABLE" 
            formula="(*:*:aktualny przepływ z licznika 1 MSW) (*:*:aktualny przepływ z licznika 1 LSW) :"/>
        <draw title="Landis Gyr" order="9" min="0" max="100" />
    </param>
    <param name="Landis Gyr:Węzeł:objętość" short_name="V" draw_name="Objętość" unit="m3" prec="2" 
        base_ind="auto">
        <define type="DRAWDEFINABLE" formula="(*:*:objętość MSW) (*:*:objętość LSW) :"/>
        <draw title="Landis Gyr" order="10" min="0" max="100000" />
    </param>
    <param name="Landis Gyr:Węzeł:numer fabryczny" short_name="No" draw_name="-" unit="-" prec="0">
        <define type="DRAWDEFINABLE" formula="(*:*:numer fabryczny MSW) (*:*:numer fabryczny LSW) :"/>
    </param>
    <param name="Landis Gyr:Węzeł:czas pracy błędnej" short_name="ErTime" draw_name="-" unit="h" prec="0">
        <define type="DRAWDEFINABLE" formula="(*:*:czas pracy błędnej MSW) (*:*:czas pracy błędnej LSW) :"/>
    </param>
    <param name="Landis Gyr:Węzeł:moc wyjściowa z licznika 1" short_name="Qwy1" draw_name="Moc z licz. 1" 
        unit="kW" prec="2" base_ind="auto">
        <define type="DRAWDEFINABLE" 
            formula="(*:*:moc wyjściowa z licznika 1 MSW) (*:*:moc wyjściowa z licznika 1 LSW) :"/>
        <draw title="Landis Gyr" order="7" min="0" max="2000"/>
    </param>
    <param name="Landis Gyr:Węzeł:data maksimum mocy wyjściowej" short_name="QmaxD" draw_name="-" unit="-" 
        prec="0" base_ind="auto">
        <define type="DRAWDEFINABLE" 
            formula="(*:*:data maksimum mocy wyjściowej MSW) (*:*:data maksimum mocy wyjściowej LSW) :"/>
    </param>
    <param name="Landis Gyr:Węzeł:energia z licznika 2" short_name="E2" draw_name="En. z licz. 2" unit="kWh" 
        prec="0" base_ind="auto">
        <define type="DRAWDEFINABLE" formula="(*:*:energia z licznika 2 MSW) (*:*:energia z licznika 2 LSW) :"/>
        <draw title="Landis Gyr" order="6" max="10000000" min="0"/>
    </param>
    <param name="Landis Gyr:Węzeł:energia sumaryczna z licznika 1" short_name="Ec1" draw_name="En. c. z licz. 1" 
        unit="kWh" prec="0" base_ind="auto">
        <define type="DRAWDEFINABLE" 
            formula="(*:*:energia sumaryczna z licznika 1 MSW) (*:*:energia sumaryczna z licznika 1 LSW) :"/>
        <draw title="Landis Gyr" order="5" min="0" max="10000000"/>
    </param>
    <param name="Landis Gyr:Węzeł:energia z licznika 1 w taryfie 1" short_name="E1t1" draw_name="En. z licz. 1 w t. 1" 
        unit="kWh" prec="0" base_ind="auto">
        <define type="DRAWDEFINABLE" 
            formula="(*:*:energia z licznika 1 w taryfie 1 MSW) (*:*:energia z licznika 1 w taryfie 1 LSW) :"/>
            <draw title="Landis Gyr" order="3" min="0" max="10000000"/>
    </param>
    <param name="Landis Gyr:Węzeł:energia z licznika 1 w taryfie 2" short_name="E1t2" draw_name="En z licz. 1 w t. 2" 
        unit="kWh" prec="0" base_ind="auto">
        <define type="DRAWDEFINABLE" 
            formula="(*:*:energia z licznika 1 w taryfie 2 MSW) (*:*:energia z licznika 1 w taryfie 2 LSW) :"/>
        <draw title="Landis Gyr" order="4" min="0" max="10000000"/>
    </param>
    <param name="Landis Gyr:Węzeł:data maksimum przepływu" short_name="GmaxD" draw_name="-" unit="-" prec="0" 
        base_ind="auto">
        <define type="DRAWDEFINABLE" formula="(*:*:data maksimum przepływu MSW) (*:*:data maksimum przepływu LSW) :"/>
    </param>
...
</drawdefinable>