PDA

Просмотр полной версии : ошибка при опросе BOOL переменной



bonus777
04.04.2017, 11:19
День добрый. Имеется owen ПЛК100. Подключен по Ethernet. Стандартный OPC сервер кодсис 2.3. Пишу маленькую программу мониторинга и управления на делфях.
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OPCAutomation_TLB, StdCtrls, ExtCtrls, Mask, ComCtrls;
var
Form1: TForm1;
NewServer:OPCServer;
NewGroups:OPCGroups;
NewGroup:OPCGroup;
NewItems:OPCItems;
DOZATOR_OPEN:Variant;
При создании формы делаю коннект к ОРС.
NewServer:=CoOPCServer.Create;
NewServer.Connect('CoDeSys.OPC.02',NewServer.Serve rNode);
if NewServer.ServerState = 1 then
begin
//создаем группу
NewGroups:=NewServer.OPCGroups;
NewGroup:=NewGroups.Add('Group1');
DOZATOR_OPEN:=NewGroups.GetOPCGroup('Group1').OPCI tems .AddItem('.DOZATOR_OPEN', 1); // открыт дозатор на сброс в мешалку*
end
else
ShowMessage('Не удалось подключиться к контроллеру');
end;

Каждую секунду опрашиваем переменные.
DOZATOR_OPEN.Read(NewGroups.GetOPCGroup('Group1'). OPCItems.Item('.DOZATOR_OPEN'));
dos:=VarToStr(DOZATOR_OPEN.Value); //читаем статус задвижки дозатора
ShowMessage(dos);
if dos='True' then
begin
Panel3.Color:=clRed;
Button5.Caption:='ЗАКРЫТЬ задвижка';
end
else
begin
Panel3.Color:=clBlack;
Button5.Caption:='ОТКРЫТЬ задвижку';
end;

Управление в кнопки
begin
If dos = 'True' then
NewGroup.OPCItems.Item('.DOZATOR_OPEN').Write(0)
else
NewGroup.OPCItems.Item('.DOZATOR_OPEN').Write(1);
end;

Если переменная равна False, то все работает и считывается без проблем. Стоит нажать на кнопку и переключить переменную на True, то при опросе это переменной возникает ошибка EOleExeption Номер находится за пределами допустимого диапазона, хотя переменная считывается. В чем может быть проблема???

bonus777
05.04.2017, 10:17
Вообщем смысл такой. Если просто читать переменные, то никаких проблем. Если в эту переменную записать, то читать этот экземпляр переменной уже нельзя. Соответственно необходимо создать два экземпляра одной переменной и один читать, а во второй записывать. К примеру:
создаем
DOZATOR_OPEN:=NewGroups.GetOPCGroup('Group1').OPCI tems .AddItem('.DOZATOR_OPEN', 1);
DOZATOR_OPEN1:=NewGroups.GetOPCGroup('Group1').OPC I tems .AddItem('.DOZATOR_OPEN', 1);
читаем
DOZATOR_OPEN1.Read(NewGroups.GetOPCGroup('Group1') . OPCItems.Item('.DOZATOR_OPEN'));
dos:=VarToStr(DOZATOR_OPEN1.Value); //читаем статус задвижки дозатора
ShowMessage(dos);
if dos='True' then
begin
Panel3.Color:=clRed;
Button5.Caption:='ЗАКРЫТЬ задвижка';
end
else
begin
Panel3.Color:=clBlack;
Button5.Caption:='ОТКРЫТЬ задвижку';
end;
пишем
begin
If dos = 'True' then
NewGroup.OPCItems.Item('.DOZATOR_OPEN').Write(0)
else
NewGroup.OPCItems.Item('.DOZATOR_OPEN').Write(1);
end;

melky
05.04.2017, 10:31
у меня простой вопрос - зачем все это ? ПЛК100 может работать напрямую через Modbus, для чего использовать OPC ?

bonus777
05.04.2017, 12:17
Чтобы найти и установить на delphi7 нормальный компонент модбас (найти не проблема, но он не ставится толком) нужно время, а вот с OPC я уже не раз работал, но вот с таким не сталкивался.