Функция getbit libnodave не возвращает никакого значения

Я использую lazarus и компонент nodave, и я хочу прочитать состояние цифрового входа, например, I45.6, я подключаюсь через Ethernet и, насколько я могу судить, у меня есть соединение, процессор находится в слоте 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.

1 ответ

Прошло 8 лет с тех пор, как я коснулся libNoDave в C и Delphi, но я предполагаю, что вы неправильно интерпретируете номера слотов для процессора и карты Ethernet. Я посмотрел на мои 20+ ПЛК параметры подключения libnodave, и все они имеют ЦП в слоте 0 и сетевую карту в слотах 2, 3 или 5. Это большая разница по сравнению с вашими настройками. Считаете ли вы, что блок питания занимает 2 слота? Ты не должен. В каталоге \DelphiComponent\Demo\Lazarus есть утилита тестирования TNoDave, которую вы можете скомпилировать. Запустите этот исполняемый файл, чтобы сначала установить успешное соединение с вашим ПЛК и получить хорошие живые показания. Чтение битов не реализовано в этой утилите, но вы можете прочитать весь байт из I45. После того как вы установили соединение, копирование параметров соединения из этой утилиты в ваш код и чтение битов с его помощью должно быть тривиальным.

Другие вопросы по тегам