Frage zu DelphiModbus Funktion



  • Hey,

    Ich nutze https://github.com/coassoftwaresystems/delphi-modbus um mit einem Modbus zu kommunizieren. Bisher ging es darum einzelne Register zu lesen und zu schreiben, ich möchte aber auch mehrere nebeneinander liegende Register in einem Rutsch schreiben.

    In Delphi ist das so definiert:

    function WriteRegister(const RegNo: Word; const Value: Word): Boolean;
    function WriteRegisters(const RegNo: Word; const RegisterData: array of Word): Boolean;

    In C++ hat er die Header so angelegt und modifiziert:

    bool __fastcall WriteRegister(const System::Word RegNo, const System::Word Value);
    bool __fastcall WriteRegisters(const System::Word RegNo, const System::Word *RegisterData, const int RegisterData_High);

    Wie man sieht, ist dort das "RegisterData_High" hinzugekommen. Ich bin dvon ausgegangen, das dies die Anzahl der Elemente die ich vom Array senden möchte sein soll.

    Wenn ich nun WriteRegisters(1000, RegisterData, 10) schreibe, also für 10 Elemente für das Array RegisterData, dann erhalte ich auf der anderen Seite:

    void __fastcall TForm1::IdModBusServer1WriteRegisters(const TIdContext *Sender, const int RegNr, const int Count, const TModRegisterData &Data, const TModBusRequestBuffer &RequestBuffer, BYTE &ErrorCode)
    {
        Caption = IntToStr(Count);
    }
    

    eine 11 für die Anzahl. Wieso eine 11? Muss ich beim Senden der "10" eines künstlich weniger machen?

    Die Originalfunktion schaut so aus:

    function TIdModBusClient.WriteRegisters(const RegNo: Word;
      const RegisterData: array of Word): Boolean;
    var
      i: Integer;
      iBlockLength: Integer;
      Data: array of Word;
      bNewConnection: Boolean;
    begin
      bNewConnection := False;
      iBlockLength := High(RegisterData) - Low(RegisterData) + 1;
      if FAutoConnect and not Connected then
      begin
      {$IFDEF DMB_INDY10}
        Connect;
      {$ELSE}
        Connect(FConnectTimeOut);
      {$ENDIF}
        bNewConnection := True;
      end;
    
      try
        SetLength(Data, Length(RegisterData));
        for i := Low(RegisterData) to High(RegisterData) do
          Data[i] := RegisterData[i];
        Result := SendCommand(mbfWriteRegs, RegNo, iBlockLength, Data);
      finally
        if bNewConnection then
          DisConnect;
      end;
    end;
    


  • Das ist nicht die Anzahl, sondern der höchste Index - also ja, einen weniger angeben. 😉



  • Danke schön! 🙂

    Ein - zumindest in meinen Augen - ungewöhnlicher Schritt den Index dort zu setzen, zumal in Pascal(Delphi) Indexe doch mit 1 anfangen.



  • Fragmato schrieb:

    Danke schön! 🙂

    Ein - zumindest in meinen Augen - ungewöhnlicher Schritt den Index dort zu setzen, zumal in Pascal(Delphi) Indexe doch mit 1 anfangen.

    Nicht unbedingt, in Pascal kann man arrays mit einen beliebigen Startindex definieren:

    var
      arrInt1: array[0..2] of Integer; // Das statische Array besteht aus 3 Elementen
      arrInt2: array[1..3] of Integer; // Das statische Array besteht aus 3 Elementen
      arrInt3: array[8..10] of Integer; // Das statische Array besteht aus 3 Elementen
    

    http://wiki.freepascal.org/Array/de


Log in to reply