Функция 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. После того как вы установили соединение, копирование параметров соединения из этой утилиты в ваш код и чтение битов с его помощью должно быть тривиальным.