2

私は lazarus と nodave コンポーネントを使用しており、I45.6 などのデジタル入力のステータスを読み取りたいと考えています。イーサネット経由で接続していますが、CPU がスロット 3 にあり、通信カードが接続されていることがわかります。スロット5です。

これを行うために、GetBit関数を使用しようとしています。

begin
IF
  nodave1.GetBit(45,6)
then
  showmessage('got it')
else
  showmessage('not got it')
end;

しかし、何をしても返事が来ません。それがコンポーネントのプロパティなのか、それとも何か他のものなのかはわかりません。

これが完全なコードです。コンポーネントはArea = daveinputsおよびprotoISOTCPに設定されています

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Spin,
  StdCtrls, NoDaveComponent;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    NoDave1: TNoDave;
    SpinEdit1: TSpinEdit;
    SpinEdit2: TSpinEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure NoDave1Connect(Sender: TObject);
    procedure NoDave1Disconnect(Sender: TObject);
    procedure NoDave1Read(Sender: TObject);
    procedure SpinEdit1Change(Sender: TObject);
    procedure SpinEdit2Change(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
  nodave1.CPURack:=spinedit1.Value;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  nodave1.Active:=true;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  nodave1.Disconnect;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if
nodave1.GetBit(46,5,nil,0,0)
then
showmessage('got it')
else
showmessage('dont got it')
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  nodave1.IPAddress:=edit1.text;
end;

procedure TForm1.NoDave1Connect(Sender: TObject);
begin
form1.Caption:='connected'

end;

procedure TForm1.NoDave1Disconnect(Sender: TObject);
begin
  form1.caption:='disconnected';
end;

procedure TForm1.NoDave1Read(Sender: TObject);
begin

end;

procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
  nodave1.CPUSlot:=spinedit2.Value;
end;

end.
4

1 に答える 1

0

C と Delphi で libNoDave に触れてから 8 年になりますが、CPU とイーサネット カードのスロット番号を間違って解釈していると思います。20 以上の PLC の libnodave 接続パラメータを調べたところ、スロット 0 に CPU があり、スロット 2、3、または 5 にイーサネット カードがあります。これは、設定と比べて大きな違いです。電源は 2 スロット占有と数えますか? すべきではありません。\DelphiComponent\Demo\Lazarus ディレクトリに、コンパイル可能な TNoDave テスト ユーティリティがあります。その実行可能ファイルを実行して、最初に PLC への正常な接続を確立し、適切なライブ測定値を取得します。そのユーティリティではビットの読み取りは実装されていませんが、I45 からバイト全体を読み取ることができます。接続を確立したら、このユーティリティからコードに接続パラメータをコピーし、それを使用してビットを読み取るのは簡単です。

于 2013-09-27T07:43:00.843 に答える