unit nKSimComp;
{------------------------------------------------------------------------------}
{
  KSimComp - This file includes Kave 2000 Simulation components:
    TsInverter - inverter simulation
    TsEncoder  - encoder simulation

   Author:  Vesa Lappalainen
   Date:    9.9.1996
   Changes:

}
{------------------------------------------------------------------------------}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, nkavesimu, nKSimMot;

type

  TsInverter = class(TaSimuObject)
  private
    FFreq : double;
    FMotor : TsMotorObject;
  protected
    procedure SetFreq(f:double); virtual;
    function GetFreq:double;     virtual;
  public
    constructor Create(AOwner:TComponent); override;
  published
    property Freq:double read GetFreq write SetFreq;
    property Motor : TsMotorObject read FMotor write FMotor;
  end; { TsInverter }

  {----------------------------------------------------------------------------}
  TsEncoder = class(TaSimuObject)
  private
    FCount : double;
    FCnt : integer;
  public
    constructor Create(AOwner:TComponent); override;
    procedure increment(d:Double);
    procedure SetCount(d:double);
    function GetCount:double;
  published
    property Count : Double Read GetCount Write SetCount;
    property CounterNr : Integer Read FCnt Write FCnt;
  end; { TsEncoder }



procedure Register;

implementation
uses k9cio;

{------------------------------------------------------------------------------}
{ TsInverter ==================================================================}
{------------------------------------------------------------------------------}

{------------------------------------------------------------------------------}
procedure TsInverter.SetFreq(f:double);
begin
  FFreq := f;
  if ( Assigned(FMotor) ) then FMotor.Speed := f;
end;

{------------------------------------------------------------------------------}
function TsInverter.GetFreq:double;
begin
  Result := FFreq;
end;

constructor TsInverter.Create(AOwner:TComponent);
begin
  inherited Create(AOwner);
end;

{------------------------------------------------------------------------------}
{ TsEncoder ===================================================================}
{------------------------------------------------------------------------------}
constructor TsEncoder.Create(AOwner:TComponent);
begin
  inherited Create(AOwner);
  Shape := stCircle;
  XLen := 250;
  YLen := 250;
  FCount := 0;
  FCnt := Cnt;
end;

{------------------------------------------------------------------------------}
procedure TsEncoder.increment(d:Double);
begin
  if ( FCnt <= 0 ) then begin
    FCount := FCount + d;
    Exit;
  end;
  FCount := -ReadCounter(FCnt) + d;
  if ( SimulationOn ) then SetCounter(FCnt,-FCount);
end;

{------------------------------------------------------------------------------}
procedure TsEncoder.SetCount(d:double);
begin
  FCount := -d;
  if ( FCnt <= 0 ) then exit;
  SetCounter(FCnt,-FCount);
end;

function TsEncoder.GetCount:double;
begin
  if ( FCnt <= 0 ) then begin
    Result := FCount;
    exit;
  end;
  Result := ReadCounter(FCnt);
  FCount := Result;
end;



procedure Register;
begin
  RegisterComponents('Kave2000', [TsInverter,TsEncoder]);
end;

end.
