2

Delphi 2009でDelphiModbusライブラリをテストしていますが、希望する結果が得られません。問題はIdModbusClient.pasの次の行にあると思います。

Move(Buffer, ReceiveBuffer, iSize);

ReceiveBufferがごみに設定されているようです。

バッファはTIdBytesとして定義されます(Indyコンポーネントから)

ReceiveBufferはTCommsBufferとして定義されています:

  TModBusFunction = Byte;

  TModBusDataBuffer = array[0..256] of Byte;

  TCommsBuffer = packed record
    TransactionID: Word;
    ProtocolID: Word;
    RecLength: Word;
    UnitID: Byte;
    FunctionCode: TModBusFunction;
    MBPData: TModBusDataBuffer;
    Spare: Byte;
  end; { TCommsBuffer }

もちろん、iSizeはバッファのサイズ(バイト単位)です。

これはUnicode変換と関係があるのだろうか?

4

2 に答える 2

1

ポインタの逆参照がいくつか欠落しているため、メモリアドレスが破損しているように見えます。

私が間違っていない場合、Move()呼び出しは次のようになります。

Move(Buffer^, ReceiveBuffer^, iSize);

I've removed my totally worthless post content (leaving it for posterity and to give someone a good laugh).

I don't see anything that would be affected by Unicode at all. I'm going to edit the tags to include Delphi (without the 2009), as some of the CodeGear Delphi developers are currently posting there. Perhaps one of them can see what's happening.

I made up a contrived example (actually a pretty useless one):

uses
  IdGlobal;

type
  TModBusFunction = Byte;
  TModBusDataBuffer = array[0..256] of Byte;

  TCommsBuffer=packed record
    TransactionID: Word;
    ProtocolID: Word;
    RecLength: Word;
    UnitID: Byte;
    FunctionCode: TModBusFunction;
    MBPData: TModBusDataBuffer;
    Spare: Byte;
  end;

procedure TForm1.FormShow(Sender: TObject);
var
  Buffer: TIdBytes;
  ReceiveBuffer: TCommsBuffer;
  //iSize: Word;
begin
  FillChar(ReceiveBuffer, SizeOf(ReceiveBuffer), 0);
  ReceiveBuffer.TransactionID := 1;
  ReceiveBuffer.ProtocolID := 2;
  ReceiveBuffer.RecLength := 3;
  ReceiveBuffer.UnitID := 4;
  ReceiveBuffer.FunctionCode := 5;
  FillChar(ReceiveBuffer.MBPData[0], SizeOf(ReceiveBuffer.MBPData), 6);
  ReceiveBuffer.Spare := 7;
  SetLength(Buffer, SizeOf(ReceiveBuffer));
  Move(ReceiveBuffer, Buffer, SizeOf(ReceiveBuffer));
  Move(Buffer, ReceiveBuffer, SizeOf(ReceiveBuffer));
  ReceiveBuffer.UnitID := 8;
end;

次に、終了前の最後の行にブレークポイントを設定して実行しました。ブレークポイントに到達したとき、ToolTip Evaluationを使用してReceiveBufferの内容を確認したところ、すべてが完全に正常に見えました。ReceiveBuffer.Spareが7であることを含め、すべての適切な値を確認できました。次に、シングルステップで、ReceiveBuffer.UnitIDを確認しました。実際には8の値でした。

ただし、F9キーを押して実行を続行すると(フォームを閉じてアプリケーションを終了できることを期待して)、CPUウィンドウが表示され、Vistaからアプリケーションが応答しないというメッセージが表示されました。私はntdll.DebugBreakPoint、IIRCのすぐ外にいて、シングルステップでntdll.RtlReportExceptionが発生しました。何が起こっているのかよくわかりませんが、良くありません。まだ探しています。

Edit2:もう一度実行したところ、同じ結果になりました。ただし、今回はCtrl + F2を使用してアプリを終了する前に、Vistaが「Project1.exeが閉じられました」ことを示し、DEP(このマシンのハードウェアで有効にした)について言及するポップアップツールトレイウィンドウを表示していることに気付きました。

于 2009-03-06T18:42:11.520 に答える