2013-09-26 2 views
2

lazarus와 nodave 구성 요소를 사용하고 있는데 디지털 입력의 상태를 읽고 싶습니다. I45.6 이더넷을 통해 연결하고 있으며, 연결이 있다고 말할 수있는 한 CPU는 슬롯 3에 있고 통신 카드는 슬롯 5입니다.libnodave getbit 함수가 어떤 값도 반환하지 않습니다.

이렇게하려면 GetBit 기능을 사용하려고합니다.

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

아무리 응답을받을 수 없습니다. 그것은 구성 요소 속성 또는 다른 경우 확실하지 않습니다. 여기

는 = 구성 요소가 지역 = 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. 
나는 C와 델파이에 libNoDave 감동했지만 내 생각 엔 당신이 있다는 것입니다 이후 8 년 됐어

답변

0

CPU 및 이더넷 카드의 슬롯 번호 해석이 잘못되었습니다. 내 20 + PLC에서 libnodave 연결 매개 변수를 살펴 봤고 슬롯 0에 CPU가 있고 슬롯 2, 3 또는 5에 이더넷 카드가 있습니다. 설정과 비교할 때 큰 차이가 있습니다. 슬롯 2 개를 차지하도록 전원 공급을 계산합니까? 당신은해서는 안됩니다. 컴파일 할 수있는 \ DelphiComponent \ Demo \ Lazarus 디렉터리에 TNoDave 테스트 유틸리티가 있습니다. 실행 파일을 실행하여 PLC에 성공적으로 연결하고 좋은 라이브 판독 값을 얻으십시오. 비트 읽기는 해당 유틸리티에서 구현되지 않지만 I45에서 전체 바이트를 읽을 수 있습니다. 연결을 설정하고 나면이 유틸리티의 연결 매개 변수를 코드에 복사하고 코드를 읽는 일은 간단합니다.

관련 문제