Показано с 1 по 8 из 8

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

  1. #1

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

    написал на 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 функционирует исправно.

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

  2. #2
    Пользователь Аватар для Flomaster
    Регистрация
    03.05.2007
    Адрес
    Khabarovsk
    Сообщений
    278

    По умолчанию

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

  3. #3

    По умолчанию

    Цитата Сообщение от xScar2003 Посмотреть сообщение
    Код:
    Item('P LC1:.out1').Value
    В этом коде случайно нет опечатки (я про имя ПЛК - там явно лишний пробел есть)?
    нет, проблема не в этом, этого пробела нет в коде, он почему-то появился при отображении поста на форуме. Если с самой программы менять значение выхода, тогда его состояние считается правильно
    Последний раз редактировалось michaeladm; 21.05.2010 в 11:14.

  4. #4
    Пользователь Аватар для Flomaster
    Регистрация
    03.05.2007
    Адрес
    Khabarovsk
    Сообщений
    278

    По умолчанию

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

  5. #5

    По умолчанию

    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;

  6. #6

    По умолчанию огромное спасибо, заработало!

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

  7. #7

    По умолчанию

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

  8. #8

    По умолчанию пример работы Delphi-ПЛК ОВЕН

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

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •