#4 USCO API ile SERİ PORT Kontrol

USCO API ile USB kablusuyla bilgisayarımıza bağlı TIVA TM4C123G kartına USCO 01 protokolüyle, ARDUINO UNO, ARDUINO NANO ve ARDUINO MEGA kartlarına ise GOMIO protokolüyle yönetme işlerimizin konusu olacak bu yazımız. USCO 01 protokolü direk PC ye bağlı kontrol kartlarımızı çalıştırmak için kullanılır. Bir önceki yazımız olan USCO API ile USCO 01 kontrol konusunda kullandığımız projemizin KLASÖR kopyası ile bu projemizi üreteceğiz. DATA_FORM ve USCO_01_KONTROL_FORM’larımızda değişiklikler olacaktır. Artık projemize fiziki olarak KART bağlı ve bu cihazlara TComPort bileşenleri ile erişmeye çalışacağız.

Bu örneğimizde kullanacağımız USCO API leri kısaca bir tanıyalım.
procedure AIDI_GETIR(CIHAZ_KOD: Integer); Bu USCO API ile seçili CIHAZ’a ait son sensör bilgileri getirilir.

procedure CIHAZLAR_USCO_GETIR(CIHAZ_KOD:Integer); Seçili CIHAZ’a ait USCO komutları getirilir.

procedure VERI_GETIR(AIDI_KOD:Integer); Seçili cihaza ait AIDI komut ID si ile TOPLANAN verilerin SON 50 kaydı getirilir.

DataForm.Data.Temp.AidiDuzelt(TARIH_SAAT: string; DIGITAL_INPUT: string; DIGITAL_OUTPUT: string; SICAKLIK: string; NEM: string; ADC1: string; ADC2: string; ADC3: string; ADC4: string; ADC5: string; ADC6: string; ADC7: string; ADC8: string; ADC9: string; ADC10: string; ADC11: string; ADC12: string; ADC13: string; ADC14: string; ADC15: string; ADC16: string; ADC17: string; ADC18: string; ADC19: string; ADC20: string; DEVIR1: string; KOD: Integer;) Seçili CIHAZ’a ait SENSÖR; DURUM, DEVIR, SICAKLIK, NEM vb bilgileri AIDI_BILGI gloabal isimli değişkene, mikrodenetleyiceden gelen bilgiler atanır. Atanan bu bilgiler bu API ile VERİTABANINA gönderilir.

Aşağıdaki ekran görüntülerini DİKKATLİCE inceleyiniz.

.

.

Bu projemize ait Delphi Android APK sını indirebilirsiniz. SAĞ FARE tuşu ve farklı kaydet tercihtir. Bu MOBILE uygulamasının çalışması için, KONTROL (TIVA veya ARDUINO vb) kartının takılı ve EXE programının çalışıyor olması gerekir.

Delphi Android uygulamasının LOGIN_FORM’una ait KAYNAK kodları.

unit LoginForm;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Edit,
  FMX.Controls.Presentation;

type
  TLOGIN_FORM = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  LOGIN_FORM: TLOGIN_FORM;

implementation

{$R *.fmx}

uses DataForm, USCO_01KontrolForm;

procedure TLOGIN_FORM.Button1Click(Sender: TObject);
var
  GELEN: String;
begin

  if Edit1.Text = '' then
  begin
    ShowMessage('Kullanıcı Adı Zorunlu');
    Exit;
  end;

  if Edit2.Text = '' then
  begin
    ShowMessage('Şifre Zorunlu');
    Exit;
  end;

  GELEN := DataForm.DATA.Temp.KULLANICI_KONTROL(Edit1.Text, Edit2.Text);
  if GELEN <> '0' then
  begin
    DataForm.DATA.KULLANICI_ADI := Edit1.Text;
    DataForm.DATA.SIFRE:=Edit2.Text;
    USCO_01_KONTROL_FORM.Show;    
  end else  ShowMessage('Kullanıcı adı veya şifre yanlış');

end;

end.

Delphi Android uygulamasının DATA_FORM’a ait KAYNAK kodları.

unit DataForm;

interface

uses
  System.SysUtils, System.Classes, Datasnap.DSClientRest, ClientClassesUnit1, Data.DB, Datasnap.DBClient,
   Datasnap.Provider;

type
  TDATA = class(TDataModule)
    DSRestConnection1: TDSRestConnection;
    AIDI_TABLE: TClientDataSet;
    AIDI_SOURCE: TDataSource;
    CIHAZLAR_USCO_SOURCE: TDataSource;
    CIHAZLAR_USCO_TABLE: TClientDataSet;
    CIHAZLAR_USCO_SOURCE2: TDataSource;
    CIHAZLAR_USCO_TABLE2: TClientDataSet;
    VERI_GETIR_SOURCE: TDataSource;
    AIDI_TABLETARIH_SAAT: TStringField;
    AIDI_TABLESICAKLIK: TFloatField;
    AIDI_TABLENEM: TFloatField;
    AIDI_TABLECIHAZ_KOD: TIntegerField;
    AIDI_TABLEDIGITAL_INPUT: TStringField;
    AIDI_TABLEDIGITAL_OUTPUT: TStringField;
    AIDI_TABLEDEVIR1: TStringField;
    AIDI_TABLEDEVIR2: TStringField;
    AIDI_TABLESURE: TIntegerField;
    AIDI_TABLEADC1: TIntegerField;
    AIDI_TABLEADC2: TIntegerField;
    AIDI_TABLEADC3: TIntegerField;
    AIDI_TABLEADC4: TIntegerField;
    AIDI_TABLEADC5: TIntegerField;
    AIDI_TABLEADC6: TIntegerField;
    AIDI_TABLEADC7: TIntegerField;
    AIDI_TABLEADC8: TIntegerField;
    VERI_GETIR_TABLE: TClientDataSet;
    IntegerField1: TIntegerField;
    StringField1: TStringField;
    StringField2: TStringField;
    StringField3: TStringField;
    FloatField1: TFloatField;
    FloatField2: TFloatField;
    StringField4: TStringField;
    StringField5: TStringField;
    IntegerField2: TIntegerField;
    IntegerField3: TIntegerField;
    IntegerField4: TIntegerField;
    IntegerField5: TIntegerField;
    IntegerField6: TIntegerField;
    IntegerField7: TIntegerField;
    IntegerField8: TIntegerField;
    IntegerField9: TIntegerField;
    IntegerField10: TIntegerField;
    CIHAZLAR_USCO_TABLEUSCO_KOD: TIntegerField;
    CIHAZLAR_USCO_TABLEPARAMETRE: TStringField;
    CIHAZLAR_USCO_TABLEDURUM: TStringField;
    CIHAZLAR_USCO_TABLEkomut: TStringField;
    CIHAZLAR_USCO_TABLE2USCO_KOD: TIntegerField;
    CIHAZLAR_USCO_TABLE2PARAMETRE: TStringField;
    CIHAZLAR_USCO_TABLE2DURUM: TStringField;
    CIHAZLAR_USCO_TABLE2komut: TStringField;
    procedure DataModuleCreate(Sender: TObject);
    procedure DataModuleDestroy(Sender: TObject);
    procedure AIDI_GETIR(CIHAZ_KOD: Integer);
    procedure CIHAZLAR_USCO_GETIR(CIHAZ_KOD:Integer);
    procedure VERI_GETIR(AIDI_KOD:Integer);
    
  private
    { Private declarations }
  public
    { Public declarations }
    Temp: TServerMethods1Client;
    lDataSet: TDataSet; lDataSet1: TClientDataSet; DSP,DSP1: TDataSetProvider;
    KULLANICI_ADI, SIFRE: String;

  end;

var
  DATA: TDATA;

implementation

{%CLASSGROUP 'FMX.Controls.TControl'}
{$R *.dfm}

procedure TDATA.AIDI_GETIR(CIHAZ_KOD:Integer);
begin
  DataForm.DATA.AIDI_TABLE.Close;
  DataForm.DATA.lDataSet := DataForm.DATA.Temp.AIDI_GETIR(KULLANICI_ADI, SIFRE, CIHAZ_KOD);
  DataForm.DATA.DSP := TDataSetProvider.Create(Self);
  try
    DataForm.DATA.DSP.DataSet := DataForm.DATA.lDataSet;
    DataForm.DATA.AIDI_TABLE.SetProvider(DataForm.DATA.DSP);
    DataForm.DATA.AIDI_TABLE.Open;
  finally
    DataForm.DATA.AIDI_TABLE.SetProvider(nil);
    DataForm.DATA.DSP.Free;
  end;
end;


procedure TDATA.CIHAZLAR_USCO_GETIR(CIHAZ_KOD:Integer);
begin
  DataForm.DATA.CIHAZLAR_USCO_TABLE.Close; CIHAZLAR_USCO_TABLE2.Close;
  DataForm.DATA.lDataSet := DataForm.DATA.Temp.CIHAZLAR_USCO_GETIR(KULLANICI_ADI, SIFRE, CIHAZ_KOD);
  DataForm.DATA.DSP := TDataSetProvider.Create(Self);
  try
    DataForm.DATA.DSP.DataSet := DataForm.DATA.lDataSet;
    DataForm.DATA.CIHAZLAR_USCO_TABLE.SetProvider(DataForm.DATA.DSP);
    DataForm.DATA.CIHAZLAR_USCO_TABLE.Open;
    CIHAZLAR_USCO_TABLE2.Data := CIHAZLAR_USCO_TABLE.Data;    
    CIHAZLAR_USCO_TABLE2.Open;
  finally
    DataForm.DATA.CIHAZLAR_USCO_TABLE.SetProvider(nil);
    DataForm.DATA.CIHAZLAR_USCO_TABLE2.SetProvider(nil);
    DataForm.DATA.DSP.Free;
  end;
end;

procedure TDATA.VERI_GETIR(AIDI_KOD:Integer); 
begin
  DataForm.DATA.VERI_GETIR_TABLE.Close;
  DataForm.DATA.lDataSet := DataForm.DATA.Temp.VERI_GETIR(AIDI_KOD);
  DataForm.DATA.DSP := TDataSetProvider.Create(Self);
  try
    DataForm.DATA.DSP.DataSet := DataForm.DATA.lDataSet;
    DataForm.DATA.VERI_GETIR_TABLE.SetProvider(DataForm.DATA.DSP);
    DataForm.DATA.VERI_GETIR_TABLE.Open;
  finally
    DataForm.DATA.VERI_GETIR_TABLE.SetProvider(nil);
    DataForm.DATA.DSP.Free;
  end;
end;

procedure TDATA.DataModuleCreate(Sender: TObject);
begin
  Temp := TServerMethods1Client.Create(DSRestConnection1);
end;

procedure TDATA.DataModuleDestroy(Sender: TObject);
begin
  Temp.Free;
end;

end.

Delphi Android uygulamasının KONTROL_FORM’a ait KAYNAK kodları.

unit USCO_01KontrolForm;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Edit,
  FMX.Controls.Presentation, FMX.Layouts, FMX.ListBox, System.Rtti, FMX.Grid.Style, FMX.Grid, FMX.ScrollBox,
  Data.Bind.Components, Data.Bind.DBScope, System.Bindings.Outputs, Fmx.Bind.Editors, Data.Bind.EngExt,
  Fmx.Bind.DBEngExt, Fmx.Bind.Grid, Data.Bind.Grid, FMX.TabControl;

type
  TUSCO_01_KONTROL_FORM = class(TForm)
    Panel1: TPanel;
    Timer1: TTimer;
    Button12: TButton;
    Panel6: TPanel;
    Button13: TButton;
    Button15: TButton;
    Panel7: TPanel;
    Edit1: TEdit;
    Label1: TLabel;
    CheckBox1: TCheckBox;
    BindingsList1: TBindingsList;
    BindSourceDB2: TBindSourceDB;
    StringGrid1: TStringGrid;
    LinkGridToDataSourceBindSourceDB2: TLinkGridToDataSource;
    StringGrid2: TStringGrid;
    BindSourceDB1: TBindSourceDB;
    LinkGridToDataSourceBindSourceDB1: TLinkGridToDataSource;
    TabControl1: TTabControl;
    TabItem1: TTabItem;
    TabItem2: TTabItem;
    StringGrid3: TStringGrid;
    StringGrid4: TStringGrid;
    BindSourceDB3: TBindSourceDB;
    LinkGridToDataSourceBindSourceDB3: TLinkGridToDataSource;
    BindSourceDB4: TBindSourceDB;
    LinkGridToDataSourceBindSourceDB4: TLinkGridToDataSource;
    Button5: TButton;
    Label7: TLabel;
    Button11: TButton;
    Button10: TButton;
    Button9: TButton;
    Button8: TButton;
    Button7: TButton;
    Button6: TButton;
    Button4: TButton;
    Button3: TButton;
    Button2: TButton;
    procedure Timer1Timer(Sender: TObject);
    procedure CheckBox1Change(Sender: TObject);
    procedure Button12Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button13Click(Sender: TObject);
    procedure Button15Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  USCO_01_KONTROL_FORM: TUSCO_01_KONTROL_FORM;

implementation

{$R *.fmx}

uses DataForm, ClientClassesUnit1;

procedure TUSCO_01_KONTROL_FORM.Button12Click(Sender: TObject);
begin
  Timer1.Enabled := False;
  Close;
end;

procedure TUSCO_01_KONTROL_FORM.Button13Click(Sender: TObject);
begin
  DataForm.DATA.AIDI_GETIR(StrToInt(Edit1.Text));
  Label7.Text := DataForm.DATA.AIDI_TABLE.FieldByName('TARIH_SAAT').AsString;
  DataForm.DATA.VERI_GETIR(StrToInt(Edit1.Text));
  StringGrid1.Columns[0].Width := 0;
  StringGrid2.Columns[0].Width := 0;
  StringGrid1.Columns[1].Width := 205;
  StringGrid2.Columns[1].Width := 205;
  StringGrid1.Columns[2].Width := 50;
  StringGrid2.Columns[2].Width := 50;
  StringGrid1.Columns[3].Width := 120;
  StringGrid2.Columns[3].Width := 120;  
end;

procedure TUSCO_01_KONTROL_FORM.Button15Click(Sender: TObject);
begin
  TRY
    DataForm.DATA.CIHAZLAR_USCO_GETIR(StrToInt(Edit1.Text));
    StringGrid3.Columns[1].Width := 100;
    StringGrid4.Columns[1].Width := 100;
    StringGrid3.Columns[3].Width := 110;
    StringGrid4.Columns[3].Width := 110;
  EXCEPT
     ShowMessage('Kullanıcı adı veya şifre hatalı');
  END;
end;

procedure TUSCO_01_KONTROL_FORM.Button2Click(Sender: TObject);
begin
  DataForm.DATA.Temp.CihazlarUscoDuzelt(DataForm.DATA.KULLANICI_ADI, DataForm.DATA.SIFRE, (Sender as TButton).Hint, 'EVET',
    '', (Sender as TButton).Tag, StrToInt(Edit1.Text));
end;

procedure TUSCO_01_KONTROL_FORM.CheckBox1Change(Sender: TObject);
begin
  Timer1.Enabled := CheckBox1.IsChecked;
end;

procedure TUSCO_01_KONTROL_FORM.Timer1Timer(Sender: TObject);
begin
  Button13Click(Self); 
  Sleep(150); Application.ProcessMessages; 
  Button15Click(Self);
end;

end.