bg

Обработка и сохранение данных OPC по событию от OPC сервера

Описание проблемы:

У меня задана Kemro.opc.4.IF1.1.92.Mars1.SVs.system.sv_ShotCounter[14]="1"в OPC Data Logger. Я хочу записывать данные в базу только в тот момент, когда значение этого тега становится равным единице. Одновременно логгер должен сбрасывать значение этого триггера и устанавливать значение переменной OPC сервера равным нулю. Это действие будет подтверждать получение данных компьютером.

Требования:

Подразумевается, что:

1. Вы создали конфигурацию в логгере (используя кнопку "Зеленый Плюс" в главном окне программы), добавили группу и OPC теги в ней. OPC логгер принимает данные с этого сервера и отображает их в главном окне программы.

2. Вы настроили запись в нужную базу.

Решение:

1. Включите указанные на рис. 1 опции OPC группы.

Настройки группы OPC
Рис.1. Настройки группы OPC

2. Скачайте и установите модуль "Script Execute".

3. Включите данный модуль, поставив галочку перед его именем (рис. 2).

Модуль Script Execute
Рис.2. Модуль Script Execute

4. Выберите модуль в списке и нажмите кнопку "Настроить" ниже.

5. В окне редактора, в списке "Тип скрипта" выберите "PascalScript".

6. Скопируйте в буфер и вставьте в окно редактора код, приведенный ниже. В строке sName1:string = 'Kemro.opc.4.IF1.1.92.Mars1.SVs.system.sv_ShotCounter'; указано имя OPC тега, значение которого будет контролировать скрипт. Строка SendString(sName+'=0'); отправляет подтверждение в OPC сервер и устанавливает исходное значение триггера, где строка '=0' означает начальное значение триггера. Логгер внутри себя обработает строку команды и передаст указанное значение в OPC тег на сервере.

7. Кликните на кнопке "Проверить" и убедитесь, что скрипт успешно скомпилирован.

8. Кликните на кнопке "OK" и сохраните все изменения.

Код скрипта

var v:double;
    sName:string = 'Kemro.opc.4.IF1.1.92.Mars1.SVs.system.sv_ShotCounter';
begin
 // checks a variable in a data packet
 if IsVariableDefined(sName) then
  begin
    v := GetVariable(sName);

    // the script will discard data packets by the following condition
    if v <> 1 then
     DiscardDataPacket()
    else
     begin
      SendString(sName+'=0');
     end;
  end
 else
  // discard data also when the counter didn't read yet
  DiscardDataPacket();

end.

Сопутствующие статьи:

Настройка DCOM и OPC на Windows 2008 и Windows 7

Настройка DCOM и OPC на Windows 10, 11, Windows Server 2019, 2022