Скрипт адресных уведомлений в телеграмм

Avatar
  • обновлен

Добрый день! Стала задача адресной рассылки уведомлений в телеграмм. Бота прописал, уведомления приходят всем а необходимо выборочно. Создал скрипт по примерам из мануала но он не работает. Буду благодарен за оказанную помощь за наставление на путь правильный. Языками программирования владею слабо, программирую на blocks diagram. Опрашиваю только каналы ai

Avatar

День добрый.

Пример 1:


var
ChannelName: string;
AlarmCode: Integer;
LastSentCode: Integer;
MessageText: string;
RecipientName: string; procedure OnStartSrript; begin LastSentCode := -1; end;

begin
// Имя канала, который проверяем
ChannelName := 'Температура_реактора';

// Имя получателя в Telegram
RecipientName := 'Оператор';

// Получаем код аварии
AlarmCode := GetAlarmStatus(ChannelName);

// Проверяем, изменился ли код аварии с момента последней отправки
if (AlarmCode = 2) and (AlarmCode <> LastSentCode) then
begin
// Формируем текст сообщения
MessageText := Format('Авария: значение канала "%s" выше уставки!', [ChannelName]);

// Отправляем сообщение в Telegram
SendTelegram(RecipientName, MessageText);

// Обновляем код последнего отправленного сообщения
LastSentCode := AlarmCode;
end;

// Если аварии нет (например, код 1), сбрасываем флаг отправки
if (AlarmCode = 1) then
LastSentCode := -1;
end. 

Пояснение:

- GetAlarmStatus(ChannelName) — возвращает код аварии по имени канала.
- SendTelegram(RecipientName, MessageText) — отправляет сообщение в Telegram.
- LastSentCode` — переменная-флаг, которая запоминает последний код аварии, при котором было отправлено сообщение.
- Сообщение отправляется  только если код аварии изменился с момента последней отправки — это предотвращает повторную отправку одного и того же сообщения.
- При возврате к нормальному режиму (`AlarmCode = 1`) флаг сбрасывается, чтобы при повторном срабатывании аварии снова отправить сообщение.
 

Avatar

Пример 2:

const
NUM_CHANNELS = 10;

var
i: Integer;
ChannelNames: array[1..NUM_CHANNELS] of string;
AlarmCode: Integer;
Recipient1, Recipient2: string;
LastSentCode: array[1..NUM_CHANNELS] of Integer;

procedure OnStartSrript;
begin
// Имена каналов
ChannelNames[1] := 'Температура_реактора';
ChannelNames[2] := 'Давление_в_реакторе';
ChannelNames[3] := 'Уровень_жидкости';
ChannelNames[4] := 'Ток_двигателя';
ChannelNames[5] := 'Напряжение_питания';
ChannelNames[6] := 'Температура_охлаждения';
ChannelNames[7] := 'Давление_в_трубопроводе';
ChannelNames[8] := 'Уровень_масла';
ChannelNames[9] := 'Температура_вентилятора';
ChannelNames[10] := 'Напряжение_на_датчике';

// Инициализация массива последних отправленных кодов
for i := 1 to NUM_CHANNELS do
LastSentCode[i] := -1;
end;

begin
// Имена получателей
Recipient1 := 'Оператор_Группа1';
Recipient2 := 'Оператор_Группа2';

// Проверка статуса аварии по каждому каналу
for i := 1 to NUM_CHANNELS do
begin
AlarmCode := GetAlarmStatus(ChannelNames[i]);

// Если авария "выше уставки" и код изменился
if (AlarmCode = 2) and (AlarmCode <> LastSentCode[i]) then
begin
// Определяем получателя в зависимости от группы каналов
if (i <= 5) then
SendTelegram(Recipient1, Format('Авария: значение канала "%s" выше уставки!', [ChannelNames[i]]))
else
SendTelegram(Recipient2, Format('Авария: значение канала "%s" выше уставки!', [ChannelNames[i]]));
// Обновляем код последнего отправленного сообщения
LastSentCode[i] := AlarmCode;
end;

// Если аварии нет (в рабочей зоне), сбрасываем флаг
if (AlarmCode = 1) and (LastSentCode[i] = 2) then
LastSentCode[i] := -1;
end;
end.


Пояснение:

- Группировка каналов: первые 5 каналов — группа 1, остальные — группа 2.
- Массив `LastSentCode` хранит последний код аварии для каждого канала.
- Форматирование сообщения включает имя канала.
- Защита от повторной отправки — сообщение отправляется только при изменении кода аварии.
- Сброс флага при возврате к нормальному режиму (`AlarmCode = 1`).

Avatar
андрей котенко
Цитата от СИМП Лайт (тех поддержка)

Пример 2:

const
NUM_CHANNELS = 10;

var
i: Integer;
ChannelNames: array[1..NUM_CHANNELS] of string;
AlarmCode: Integer;
Recipient1, Recipient2: string;
LastSentCode: array[1..NUM_CHANNELS] of Integer;

procedure OnStartSrript;
begin
// Имена каналов
ChannelNames[1] := 'Температура_реактора';
ChannelNames[2] := 'Давление_в_реакторе';
ChannelNames[3] := 'Уровень_жидкости';
ChannelNames[4] := 'Ток_двигателя';
ChannelNames[5] := 'Напряжение_питания';
ChannelNames[6] := 'Температура_охлаждения';
ChannelNames[7] := 'Давление_в_трубопроводе';
ChannelNames[8] := 'Уровень_масла';
ChannelNames[9] := 'Температура_вентилятора';
ChannelNames[10] := 'Напряжение_на_датчике';

// Инициализация массива последних отправленных кодов
for i := 1 to NUM_CHANNELS do
LastSentCode[i] := -1;
end;

begin
// Имена получателей
Recipient1 := 'Оператор_Группа1';
Recipient2 := 'Оператор_Группа2';

// Проверка статуса аварии по каждому каналу
for i := 1 to NUM_CHANNELS do
begin
AlarmCode := GetAlarmStatus(ChannelNames[i]);

// Если авария "выше уставки" и код изменился
if (AlarmCode = 2) and (AlarmCode <> LastSentCode[i]) then
begin
// Определяем получателя в зависимости от группы каналов
if (i <= 5) then
SendTelegram(Recipient1, Format('Авария: значение канала "%s" выше уставки!', [ChannelNames[i]]))
else
SendTelegram(Recipient2, Format('Авария: значение канала "%s" выше уставки!', [ChannelNames[i]]));
// Обновляем код последнего отправленного сообщения
LastSentCode[i] := AlarmCode;
end;

// Если аварии нет (в рабочей зоне), сбрасываем флаг
if (AlarmCode = 1) and (LastSentCode[i] = 2) then
LastSentCode[i] := -1;
end;
end.


Пояснение:

- Группировка каналов: первые 5 каналов — группа 1, остальные — группа 2.
- Массив `LastSentCode` хранит последний код аварии для каждого канала.
- Форматирование сообщения включает имя канала.
- Защита от повторной отправки — сообщение отправляется только при изменении кода аварии.
- Сброс флага при возврате к нормальному режиму (`AlarmCode = 1`).

Спасибо!