Ankündigung

Einklappen
Keine Ankündigung bisher.

Applikation (XML) mit Modulen: wie findet man die Objektnummer?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    ETS Applikation (XML) mit Modulen: wie findet man die Objektnummer?

    Hi 👋!

    Ich versuche KOs aus den Projektdaten zu parsen und frage mich gerade wie man die Objektnummer bekommt. Vielleicht kennt sich ja hier jemand mit Applikationen gut genug aus um mir auf die Sprünge helfen zu können 🙂

    Bei Applikationen ohne Modulen oder aus der "ComObjectTable" sieht es klar aus - da nehme ich einfach das "Number" Attribut.
    Code:
    <ComObjectTable>
      <ComObject Id="M-0083_A-013A-32-DCC1_O-15" Name="ReglerOutValve_0" Text="Channel A" Number="15" FunctionText="Send valve status" ObjectSize="1 Bit" ReadFlag="Enabled" WriteFlag="Disabled" CommunicationFlag="Enabled" TransmitFlag="Enabled" UpdateFlag="Disabled" ReadOnInitFlag="Disabled" DatapointType="DPST-1-11" />
    </ComObjectTable>​
    Wenn es sich um Objekte handelt, die über Module definiert werden, dann hab ich das bisher so gemacht:
    Aus dem Projekt hab ich den Wert für "ObjNumberBase" rausgesucht (hier im Beispiel 40) und mit der "Number" des zugehörigen ComObject addiert.
    Code:
    <!-- Applikation -->
    <ComObjects>
      <ComObject Id="M-0083_A-013A-32-DCC1_MD-2_O-2-1" Name="IstWert" Text="Channel A" Number="1" FunctionText="Receive temperature value" ObjectSize="2 Bytes" ReadFlag="Disabled" WriteFlag="Enabled" CommunicationFlag="Enabled" TransmitFlag="Enabled" UpdateFlag="Enabled" ReadOnInitFlag="Disabled" BaseNumber="M-0083_A-013A-32-DCC1_MD-2_A-2" />
    </ComObjects>​
    <Arguments>
      <Argument Id="M-0083_A-013A-32-DCC1_MD-2_A-2" Name="ObjNumberBase" Allocates="40" />
    </Arguments>​
    
    <!-- Projekt - 0.xml -->
    <ModuleInstance Id="MD-2_M-2_MI-1" RefId="MD-2_M-2" RepeatIndex="379x1">
      <Arguments>
        <Argument RefId="MD-2_A-2" Value="40" />
      </Arguments>
    </ModuleInstance>​
    Jetzt hab ich allerdings eine Applikation gefunden (MDT DALI Control PRO64) wo das nicht mehr funktioniert, und ich komm nicht wirklich drauf wie man es machen könnte.
    Code:
    <!-- Applikation -->
    <ComObject Id="M-0083_A-0153-10-297A-O00EF_MD-1_O-2-16" Name="Converter 1, Test Control" Text="Converter {{ECG_NO}}, Test Start" Number="16" FunctionText="Start" ObjectSize="1 Byte" ReadFlag="Disabled" WriteFlag="Enabled" CommunicationFlag="Enabled" TransmitFlag="Disabled" UpdateFlag="Disabled" ReadOnInitFlag="Disabled" InternalDescription="Legacy" BaseNumber="M-0083_A-0153-10-297A-O00EF_MD-1_A-2" />
    
    <ModuleDef Id="M-0083_A-0153-10-297A-O00EF_MD-1" Name="ModuleECG">
      <Arguments>
        <Argument Id="M-0083_A-0153-10-297A-O00EF_MD-1_A-1" Name="ParamOffsBase" Allocates="40" />
        <Argument Id="M-0083_A-0153-10-297A-O00EF_MD-1_A-2" Name="ObjNumberBase" Allocates="23" />
        <Argument Id="M-0083_A-0153-10-297A-O00EF_MD-1_A-3" Name="ECG_NO" Allocates="1" />
      </Arguments>​
    
    <!-- Projekt - o.xml -->
    <ModuleInstances>
      <ModuleInstance Id="MD-1_M-1_MI-1" RefId="MD-1_M-1" RepeatIndex="322x1 323x1">
        <Arguments>
          <Argument RefId="MD-1_A-1" Value="L-2" />
          <Argument RefId="MD-1_A-2" Value="L-1" />
          <Argument RefId="MD-1_A-3" Value="L-3" />
        </Arguments>
      </ModuleInstance>​
    "L-1" kann ich natürlich nicht mit irgendwas addieren 😬 und ich werd auch nicht wirklich schlau draus was das bedeutet. Die Spur endet für mich hier:
    Code:
    <!-- Applikation -->
    <Allocators>
      <Allocator Id="M-0083_A-0153-10-297A-O00EF_L-1" Name="AllocatorObjECG" Start="559" maxInclusive="2031" />
    </Allocators>
    • Was sind diese "Allocator" Objekte, und gibt es dazu irgendwo einen Wert auszulesen?
    • Bin ich irgendwo falsch abgebogen, und es wäre viel einfacher die Objektnummern der einzelnen "ComObjectInstanceRef" rauszuparsen?

    #2
    Da können bestimmt mumpf und thewhoboxhelfen.

    Kommentar


      #3
      Hallo,

      Allocatoren zählen einfach nur hoch.
      Dazu hat das Argument das Attribut Allocates, heißt es reserviert pro Modul x KoNummern für das Modul, egal ob es diese braucht oder nicht.

      Dein ComObjectBase beginnt also bei 559 und erhöht sich also pro Modul um 23 Nummern.

      Gruß Mike
      OpenKNX www.openknx.de | Kaenx-Creator | Dali-GW

      Kommentar


        #4
        Aha, danke! Das klingt schon mal verständlich.

        Aber woher weiß ich den Multiplikator - sprich von der ComObjectInstanceRef ausgehend, um welches Modul es sich handelt? Es gibt in dieser Applikation 64 Module. Wenn ich nur instanziierte Objekte des 3. Moduls habe müsste ich ja (ComObject Number) + 559 + (23 * (3-1)) rechnen - woher bekomme ich das "3"? Kann ich das direkt aus der ModuleInstance Nummer "MI-3" nehmen, oder muss ich dazu den RepeatIndex parsen?

        Weißt du zufällig auch gleich wie der RepeatIndex funktioniert? Im speziellen wenn da nicht nur 1 Wert, sondern mehrere drin stehen?
        Code:
        <ModuleInstance Id="MD-1_M-1_MI-3" RefId="MD-1_M-1" RepeatIndex="322x3 323x1">
        Zuletzt geändert von meti; 10.02.2024, 11:24. Grund: off-by-one error... das Module 1 startet wohl bei 559, nicht bei 559 + 23 daher (23 * (3-1)) fürs 3. Modul

        Kommentar


          #5
          Wenn jedes ModuleDefine eigene Allocatoren hat, dann kannst du es über den Index machen ja.

          Nummer = Start + (Index-1 * Allocates) + Nummer

          Hast ja schon bemerkt, dass der Anfang eig bei 0 ist für das 1. Modul.

          RepeatIndex selbst hab ich noch nicht beachtet, da ich eher auf knxprod Seite bin und nicht auf Projekt.
          OpenKNX www.openknx.de | Kaenx-Creator | Dali-GW

          Kommentar

          Lädt...
          X