PDA

Просмотр полной версии : Delphi-OPC-ПЛК 100 неправильное определение состояния выхода



michaeladm
20.05.2010, 15:46
написал на Delphi програмку, читающую и меняющую значения выходода контроллера ПЛК 100, подключение через OPC Codesys

var
V : variant;
begin
V := CreateOleObject('OPC.Automation'); //создаем OLE объект
V.Connect('CoDeSys.OPC.02'); //подключаемся
V.OPCGroups.Add('Group1'); //добавляем группу
V.OPCGroups.GetOPCGroup('Group1').OPCItems.AddItem ('PLC1:.out1',
1);//добавляем переменную
//читаем ее состояние
if V.OPCGroups.GetOPCGroup('Group1').OPCItems.Item('P LC1:.out1').Value=false
then ShowMessage('выход out1 выключен')
else ShowMessage('выход out1 ВКЛЮЧЕН!!!');
end;

почему-то правильное состояние выхода определяется только если выход включен или выключен в данной программе, если значение было изменено, например в CodeSys - состояние определяется неправильно.

Примечательно, что похожий пример, но реализованный через компонент dOPC функционирует исправно.

Может кто знает в чем проблема?

Flomaster
21.05.2010, 04:43
Item('P LC1:.out1').Value
В этом коде случайно нет опечатки (я про имя ПЛК - там явно лишний пробел есть)?

michaeladm
21.05.2010, 11:10
Item('P LC1:.out1').Value
В этом коде случайно нет опечатки (я про имя ПЛК - там явно лишний пробел есть)?

нет, проблема не в этом, этого пробела нет в коде, он почему-то появился при отображении поста на форуме. Если с самой программы менять значение выхода, тогда его состояние считается правильно

Flomaster
21.05.2010, 17:41
так, с ходу сказать сложно, что не так. но... вы уверены, что орс опрашивает плк?

AWA1971
21.05.2010, 17:48
if V.OPCGroups.GetOPCGroup('Group1').OPCItems.Item('P LC1:.out1').Value=false
then ShowMessage('выход out1 выключен')
else ShowMessage('выход out1 ВКЛЮЧЕН!!!');
end;
Может эту часть кода перенести в TTimer и поставить время опроса поменьше (10 мсек).

Попробуйте работать через переменные:
var
V: Variant;
Item1:Variant;
Val1:boolean;
begin
Item1:= V.OPCGroups.GetOPCGroup('Group1').OPCItems.AddItem ('PLC1:.out1', 1); //добавляем Item
Item1.Read(V.OPCGroups.GetOPCGroup('Group1').OPCIt ems.Item('PLC1:.out1'),Val1);//читаем значения


тогда в таймере будет:
if Item1.Value=False then
then ShowMessage('выход out1 выключен')
else ShowMessage('выход out1 ВКЛЮЧЕН!!!');
end;

michaeladm
25.05.2010, 11:19
только, нужно присваивать выходу не TRUE/FALSE, а 0 или 1
т.е. V.OPCGroups.GetOPCGroup('Group1').OPCItems.Item('P LC1:.OUT1').Write(0);

AWA1971
26.05.2010, 11:35
рад, что у вас получилось, но не могли бы вы выложить весь пример, ведь кто то обязательно пойдет по вашему пути. тем более, что сначала речь шла об считывании данных, а затем уже о записи. думаю, многим это пригодится (тем более с комментариями, которые вы, наверное, делали для себя).

michaeladm
26.05.2010, 15:12
Выкладываю пример взаимодействия между Delphi-приложением и ОВЕН ПЛК 100 подключенными по Ethernet через OPC-сервер (CodeSys) с подробным описанием (с картинками) Жаль только, что без OPC пока осилить неполучилось... Отдельное спасибо AWA1971 за помощь