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 和 protocol = 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 回答