unit main;
{$mode objfpc}{$H+}
//{$MODE Delphi}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, Buttons,
IniFiles,
{$ifdef windows}
{$ifndef wince}
tcadsdef, tcadsapi
{$endif}
{$endif}
{$ifdef wince}
tcadsdef_CE, tcadsapi_CE
{$endif}
;
type
TStringVar = record
VarName: String[255];
Handle: LongWord;
Data: String;
end;
{ TfrmMain }
TfrmMain = class(TForm)
btnRes2: TButton;
btnRes4: TButton;
btnRes3: TButton;
btnBeenden: TButton;
btnRes1: TButton;
FlowPanel1: TFlowPanel;
lblDate: TLabel;
lblTime: TLabel;
lblController: TLabel;
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
cycle1000ms: TTimer;
btnGrp1: TSpeedButton;
btnGrp2: TSpeedButton;
btnGrp3: TSpeedButton;
btnGrp4: TSpeedButton;
btnGrp5: TSpeedButton;
btnGrp6: TSpeedButton;
btnGrp7: TSpeedButton;
btnGrp8: TSpeedButton;
procedure btnBeendenClick(Sender: TObject);
procedure cycle1000msTimer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
AMS: TAmsAddr;
procedure EndProgram;
procedure StartProgram;
procedure ReadConfigFile;
procedure ReadGroupStatus;
procedure ReadButtonConfig;
procedure ReadStringVar(var aVar: TStringVar);
function PlcStringToString(APlcString: array of char): string;
public
end;
var
frmMain: TfrmMain;
btn: array[0..7] of TStringVar;
implementation
{$R *.lfm}
{ TfrmMain }
procedure TfrmMain.btnBeendenClick(Sender: TObject);
begin
EndProgram;
end;
procedure TfrmMain.cycle1000msTimer(Sender: TObject);
begin
lblDate.Caption:= FormatDateTime('dd.mm.yyyy', now);
lblTime.Caption:= FormatDateTime('hh:nn:ss', now);
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
StartProgram;
end;
procedure TfrmMain.EndProgram;
var
i: integer;
begin
for i:= 0 to 7 do begin
AdsSyncWriteReq( @AMS, ADSIGRP_RELEASE_SYMHND, $0000, sizeof( btn[i].Handle), @btn[i].Handle );
end;
AdsPortClose();
Application.Terminate;
end;
procedure TfrmMain.StartProgram;
begin
Width:= 800;
Height:= 480;
Left:= 0;
Top:= 0;
ReadConfigFile;
end;
procedure TfrmMain.ReadConfigFile;
var
ini: TIniFile;
sa: TStringArray;
s: string;
i: integer;
begin
ini:= TIniFile.Create(Application.Location + 'Config.ini');
try
i:= ini.ReadInteger('ADS_Connection', 'Port', 0);
AMS.port:= i;
s:= ini.ReadString('General', 'ControllerName', '');
lblController.Caption:= s;
s:= ini.ReadString('ADS_Connection', 'NetID', '');
sa:= s.Split('.');
for i:= 0 to length(sa) - 1 do begin
AMS.netId.b[i]:= sa[i].ToInteger;
end;
ReadButtonConfig;
finally
FreeAndNil(ini);
end;
end;
procedure TfrmMain.ReadGroupStatus;
begin
end;
procedure TfrmMain.ReadButtonConfig;
var
i, j: integer;
AdsError: LongInt;
begin
AdsError:= AdsPortOpen();
//ShowMessage('AdsPort: ' + AdsError.ToString);
if AMS.port <> 0 then begin
for i:= 0 to 7 do begin
j:= i + 1;
btn[i].VarName:= 'Config.Btn_Grp' + j.ToString;
btn[i].Handle:= 0;
end;
end;
ReadStringVar(btn[0]); // working, got Messagebox (last line of procedure (Line 202))
ShowMessage('test'); // not working, got AV
//for i:= 1 to 7 do begin
// ReadStringVar(btn[i]);
//end;
//btnGrp1.Caption:= btn[0].Data;
//btnGrp2.Caption:= btn[1].Data;
//btnGrp3.Caption:= btn[2].Data;
//btnGrp4.Caption:= btn[3].Data;
//btnGrp5.Caption:= btn[4].Data;
//btnGrp6.Caption:= btn[5].Data;
//btnGrp7.Caption:= btn[6].Data;
//btnGrp8.Caption:= btn[7].Data;
end;
function TfrmMain.PlcStringToString(APlcString: array of char): string;
var
i: integer;
begin
Result:= '';
for i:= 0 to length(APlcString) do begin
if APlcString[i] <> Chr($00) then
Result:= Result + APlcString[i]
else exit;
end;
end;
procedure TfrmMain.ReadStringVar(var aVar: TStringVar);
var
tmp: array of char;
ads: longint;
begin
if aVar.Handle = 0 then
ads:= AdsSyncReadWriteReq(@AMS, ADSIGRP_SYM_HNDBYNAME, $0000, sizeof(aVar.Handle), @aVar.Handle, Length(aVar.VarName) + 1, @aVar.VarName[1])
else ads:= 0;
SetLength(tmp, 255);
if ads = 0 then
ads:= AdsSyncReadReq(@AMS, ADSIGRP_SYM_VALBYHND, aVar.Handle, Length(tmp), @tmp[0]);
if ads = 0 then aVar.Data:= PlcStringToString(tmp);
ShowMessage('in Procedure: ' + aVar.Data);
end;
end.