Добрый день! Прошу Вашей помощи.
Изучив данную ветку
я используя приведеный пример написал программу для работы с OPC сервером (Контроллер ПЛК-100)

В процессе разработки программы, сначала были созданы кнопки для отправки данных и для считывания. Они работали на УРА. Можно было запустить программу, и через часа два все работало. Но затем я добавил таймер, для постоянного мониторинга состояния датчиков. И тут начались беды. При запуске программы с таймером минут 5-10 все работает и все. Складывается впечатление что ОРС сервер просто "зависает". Данные с него считываются, но только те, которые были в момент зависания. К примеру в контроллере переменная уже равна двум, а он как принимал единицу, так и принимает. А данные не отправляются, при отправке данных происходит ошибка "неопознанная ошибка"....
Перезагружаешь компьютер - 5 минут работает и виснет. Побывал увеличивать интервалы таймера (изначально я поставил 100 мс, отображение было идеальноым. Не помогло. Затем я просто отключил таймер, и к моему удивлению и это не помогло, хотя ранее без таймера все работало отлично. Может быть Вы сможете что нибудь подсказать? Очень надеюсь на Вашу помощь!

Текст программы:
Скрытый текст:

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OPCAutomation_TLB, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Panel1: TPanel;
Panel2: TPanel;
Timer1: TTimer;
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
end;

var
Form1: TForm1;

NewServer:OPCServer;
NewGroups:OPCGroups;
NewGroup:OPCGroup;
NewItems:OPCItems;

NewItem1, NewItem2, NewItem3, NewItem4, NewItem5:Variant;
Val1 : Integer;
Val2, Val3 : Boolean;

implementation

// Подключение к серверу
procedure TForm1.Button4Click(Sender: TObject);
begin
// Шаг 1, подключение
NewServer:=CoOPCServer.Create;
NewServer.Connect('CoDeSys.OPC.02',NewServer.Serve rNode);

Memo1.Clear;
Memo1.Lines.Add(NewServer.ServerName);
Memo1.Lines.Add(DateTimetostr(NewServer.LastUpdate Time));
Memo1.Lines.Add(NewServer.VendorInfo+'. Версия '+Inttostr(NewServer.MajorVersion)+'.'+Inttostr(Ne wServer.MinorVersion)+'.'+Inttostr(NewServer.Build Number));
Memo1.Lines.Add('Состояние сервера='+Inttostr(NewServer.ServerState));

// Шаг 2, создание группы
NewGroups:=NewServer.OPCGroups;
NewGroup:=NewGroups.Add('Group1');

Memo1.Lines.Add(NewGroup.Name);

// Добавим Items для обмена данных
NewItem1:=NewGroups.GetOPCGroup('Group1').OPCItems .AddItem('PLC1:PLC_PRG.tx', 1);
NewItem2:=NewGroups.GetOPCGroup('Group1').OPCItems .AddItem('PLC1:PLC_PRG.poz1', 1); // Левый датчик
NewItem3:=NewGroups.GetOPCGroup('Group1').OPCItems .AddItem('PLC1:PLC_PRG.poz2', 1); // Правый датчик
NewItem4:=NewGroups.GetOPCGroup('Group1').OPCItems .AddItem('PLC1:PLC_PRG.sec3', 1); // Левый датчик
NewItem5:=NewGroups.GetOPCGroup('Group1').OPCItems .AddItem('PLC1:PLC_PRG.sec1', 1); // Правый датчик
end;

// Отключение
procedure TForm1.Button5Click(Sender: TObject);
begin
NewServer.OPCGroups.RemoveAll;
NewServer.Disconnect;
Memo1.Lines.Add('Состояние сервера='+Inttostr(NewServer.ServerState));
end;

// Установить 1-ый режим
procedure TForm1.Button2Click(Sender: TObject);
begin
NewGroup.OPCItems.Item('PLC1:PLC_PRG.tx').Write(1) ;

Memo1.Lines.Add('Установлен 1-ый режим!');
end;

// Установить 2-ой режим
procedure TForm1.Button3Click(Sender: TObject);
begin
NewGroup.OPCItems.Item('PLC1:PLC_PRG.tx').Write(2) ;

Memo1.Lines.Add('Установлен 2-ой режим!');
end;

// Чтение режима
procedure TForm1.Button1Click(Sender: TObject);
begin
NewItem1.Read(NewGroups.GetOPCGroup('Group1').OPCI tems.Item('PLC1:PLC_PRG.tx'), Val1);

Memo1.Lines.Add('Установлен режим №'+VarToStr(NewItem1.Value));
end;

// Программа таймера, обновляет показания датчиков
procedure TForm1.Timer1Timer(Sender: TObject);
begin
NewItem2:=NewGroups.GetOPCGroup('Group1').OPCItems .AddItem('PLC1:PLC_PRG.poz1', 1); // Левый
NewItem2.Read(NewGroups.GetOPCGroup('Group1').OPCI tems.Item('PLC1:PLC_PRG.poz1'), Val2);

NewItem3:=NewGroups.GetOPCGroup('Group1').OPCItems .AddItem('PLC1:PLC_PRG.poz2', 1); // Правый
NewItem3.Read(NewGroups.GetOPCGroup('Group1').OPCI tems.Item('PLC1:PLC_PRG.poz2'), Val3);

if NewItem2.Value then panel1.Color:=clred else panel1.Color:=clgreen ;
if NewItem3.Value then panel2.Color:=clred else panel2.Color:=clgreen ;
end;

end.