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

Тема: ошибка при опросе BOOL переменной

  1. #1

    Question ошибка при опросе BOOL переменной

    День добрый. Имеется 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 Номер находится за пределами допустимого диапазона, хотя переменная считывается. В чем может быть проблема???

  2. #2

    По умолчанию

    Вообщем смысл такой. Если просто читать переменные, то никаких проблем. Если в эту переменную записать, то читать этот экземпляр переменной уже нельзя. Соответственно необходимо создать два экземпляра одной переменной и один читать, а во второй записывать. К примеру:
    создаем
    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;

  3. #3
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,583

    По умолчанию

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

  4. #4

    По умолчанию

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

Похожие темы

  1. Ответов: 1
    Последнее сообщение: 18.11.2016, 14:47
  2. Сохранение bool в файл
    от жекон в разделе ПЛК1хх
    Ответов: 21
    Последнее сообщение: 22.04.2015, 22:06
  3. WORD <-> BOOL
    от ASo в разделе Master SCADA 3
    Ответов: 1
    Последнее сообщение: 08.09.2013, 16:12
  4. Ответов: 3
    Последнее сообщение: 14.11.2012, 09:09

Ваши права

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