0

Помощь в написании скрипта

kventins42 5 лет назад в Редактор каналов обновлен 5 лет назад 0
Здравствуйте. нужен пример скрипта на паскале, скрипт по таймеру
1. читаем физ канал,
2. проверяем соответствие значения уставке, допустим он должен быть больше определенного значения 30
3. если значение меньше уставки, пишем в вирт канал флаг для контроля допустим 1, причем флаг не должен записаться в течении 5 циклов таймера скрипта, т.е. если течении 5 циклов опроса значение не соответствует уставке и на 6 цикл не сооответствует то должен писаться флаг, если в любом цикле норма, счетчик опроса в 0 и снова
может быть не буду понят но прошу помощи
Добрый вечер.

Здравствуйте. нужен пример скрипта на паскале, скрипт по таймеру
1. читаем физ канал,
2. проверяем соответствие значения уставке, допустим он должен быть больше определенного значения 30
3. если значение меньше уставки, пишем в вирт канал флаг для контроля допустим 1, причем флаг не должен записаться в течении 5 циклов таймера скрипта, т.е. если течении 5 циклов опроса значение не соответствует уставке и на 6 цикл не сооответствует то должен писаться флаг, если в любом цикле норма, счетчик опроса в 0 и снова
может быть не буду понят но прошу помощи

примерно так,если я правильно Вас понял:

var counter: Integer; // счетчик циклов value: double; // считанная переменная const ustavka = 30; // уставка begin // первоначальная инициализация if Initialization then begin counter := 0; end; // читаем переменную value := ReadValue('Имя канала источника'); // сравниваем с уставой, если переменная меньше уставки то приращиваем счетчик циклов if Value < ustavka then inc(counter) else counter := 0; // если переменная меньше, то сбросим счетчик if counter > 5 then WriteValue('Виртуальный канал для вывода результата', 1) else WriteValue('Виртуальный канал для вывода результата', 0); end.
Доброе утро. Не подскажите как лучше написать скрипт для обеспечения работы задвижки на паропроводе?

Есть 2 кнопки "открыть", "закрыть" и 3 индикатора (зеленый мигающий - открытие задвижки,красный мигающий- закрытие задвижки, желтый - авария). Пока не имею на столе нужной аппаратуры в виде ADAM 6066 и SimpLight Ent, т.к. в сам нахожусь в отпуске (есть только бесплатная версия на ноутбуке).
Добрый вечер.

Доброе утро. Не подскажите как лучше написать скрипт для обеспечения работы задвижки на паропроводе?

Есть 2 кнопки "открыть", "закрыть" и 3 индикатора (зеленый мигающий - открытие задвижки,красный мигающий- закрытие задвижки, желтый - авария). Пока не имею на столе нужной аппаратуры в виде ADAM 6066 и SimpLight Ent, т.к. в сам нахожусь в отпуске (есть только бесплатная версия на ноутбуке).

Напишите к нам на почту simp@miniscada.com, обсудим подробности по задаче, и попробуем накидать пример.
Необходимо сначала накопить выборку за минуту, потом посчитать среднее, затем сохранить в файл. К примеру цикл скрипта 1 секунда, мы суммируем входную переменную к примеру 60 раз, далее считаем среднее и сохраняем в файл.
Можете помочь примером?
День добрый.

Необходимо сначала накопить выборку за минуту, потом посчитать среднее, затем сохранить в файл. К примеру цикл скрипта 1 секунда, мы суммируем входную переменную к примеру 60 раз, далее считаем среднее и сохраняем в файл.

Среднее за минуту, при условии цикла скрипта в одну секунду, можно примерно так:

var res: double; counter: word; begin if Initialization then begin counter := 1; res := 0; end; if counter <= 60 then begin res := res + ReadValue('Канал откуда берем данные'); inc(counter); end else begin res := (res / 60); WriteValue('Канал куда выводим результат', res); res := 0; counter := 1; end; end.
А если мы хотим среднее значение за час, то у нас будет не 60, а 3600?
День добрый.

А если мы хотим среднее значение за час, то у нас будет не 60, а 3600?

Если Вы про ранее присланный пример, то да.
Попробовал записать в txt файл среднее за час значение канала из прошлого примера. Использовал следующие скрипты:
1) канал с расчетом среднего за час с циклом 1 секунда (второй канал идентичен во всем кроме названия):
var
res: double;
counter: word;
begin
if Initialization then
begin
counter := 1;
res := 0;
end;

if counter <= 3600 then
begin
res := res + ReadValue('Канал откуда берем данные');
inc(counter);
end
else
begin
res := (res / 3600);
WriteValue('Канал куда выводим результат', res);
res := 0;
counter := 1;
end;
end.
2) канал для запись в txt файл с циклом 1 час:
Var In1, In2: String;
Begin
In1:=ReadValue('Канал куда выводим результат 1');
In2:=ReadValue('Канал куда выводим результат 2');
If in1<>'0' then SaveToTxtFile('C:\slProject\mazut.txt',In1);
if in2<>'0' then SaveToTxtFile('C:\slProject\moroz.txt',In2);
end.
В итоге раз в час, в файлы записываются 4 одинаковых значения. Что не так-то?
День добрый.

Попробовал записать в txt файл среднее за час значение канала из прошлого примера. Использовал следующие скрипты:
1) канал с расчетом среднего за час с циклом 1 секунда (второй канал идентичен во всем кроме названия):
var
res: double;
counter: word;
begin
if Initialization then
begin
counter := 1;
res := 0;
end;

if counter <= 3600 then
begin
res := res + ReadValue('Канал откуда берем данные');
inc(counter);
end
else
begin
res := (res / 3600);
WriteValue('Канал куда выводим результат', res);
res := 0;
counter := 1;
end;
end.

2) канал для запись в txt файл с циклом 1 час:
Var In1, In2: String;
Begin
In1:=ReadValue('Канал куда выводим результат 1');
In2:=ReadValue('Канал куда выводим результат 2');
If in1<>'0' then SaveToTxtFile('C:\slProject\mazut.txt',In1);
if in2<>'0' then SaveToTxtFile('C:\slProject\moroz.txt',In2);
end.
В итоге раз в час, в файлы записываются 4 одинаковых значения. Что не так-то?

Два вопроса:

1. Почему не объединить расчет и запись в одном скрипте?
2. Если в первом скрипте Вы пишите результат в канал 'Канал куда выводим результат', то почему во втором читаете из канала 'Канал куда выводим результат 1' и 'Канал куда выводим результат 2'?
каналы имеют свои названия, это "Канал откуда берем данные" - образное названия канала.
Так выглядит один из файлов txt:
0,639835481213199
0,639835481213199
0,639835481213199
0,639835481213199
0,771158362428347
0,771158362428347
0,771158362428347
0,771158362428347
0,771158362428347
0,771158362428347
каналы имеют свои названия, это "Канал откуда берем данные" - образное названия канала.

ок. Тогда для полноты картины надо было с реальными именами, а так получается что написано с ошибкой. Хорошо, тогда в силе первый вопрос, почему не объединить в одном скрипте расчет и запись, не факт что расчет будет готов, к моменту когда второй скрипт вычитывает значения результата, каналы между собой не синхронизированы.
как в начале строки подвязать текущее время и имя канала?
День добрый.

как в начале строки подвязать текущее время и имя канала?

В начале какой строки? Которую будите передавать в канал или записывать в файл?
Та которая ляжет в конечный файл txt, чтобы конечный вид был такой:
12:00:11 chanel1 0,639835481213199 chanel2 0,698354812131993
Та которая ляжет в конечный файл txt, чтобы конечный вид был такой:
12:00:11 chanel1 0,639835481213199 chanel2 0,698354812131993

пример: str := TimeToStr(now) + ' chanel1 ' + FloatToStr(0.639835481213199);
В подобном случае

ChannelName := 'Имя канала';
SaveToTxtFile('Имя файла',Channel_Name);


в файл выводится индекс канала, а не текстовое содержимое переменной Channel_Name.
Так и должно быть?
В подобном случае

ChannelName := 'Имя канала';
SaveToTxtFile('Имя файла',Channel_Name);


в файл выводится индекс канала, а не текстовое содержимое переменной Channel_Name.
Так и должно быть?

Я немного не понял Вашего вопроса.

из справки:

Function SaveToTxtFile (АFileName: string; Str: string): Boolean

Записывает строковое значение Str в текстовый файл AFileName. Возвращает true, если запись успешна, и false, если произошла ошибка записи. Запись происходит последовательно, строчка за строчкой.



Пример вызова:

SaveToTxtFile("c:\receipt.txt", "123,33,44,555");
Давайте ширше

Var
cTime: TDateTime;
TinValue: Variant;
tStr: string;
Const
logFileName = 'c:\simplog.txt';
TinChName = 'Уровень мерник поз. 1';
Begin
cTime := Now;
tStr := FormatDateTime('yyyy-mm-dd hh:nn:ss',cTime) + '; ';
TinValue := ReadValue(TinChName);
tStr := tStr + 'Канал ' + TinChName + ' = ' + VarToStr(TinValue) + ';';
SaveToTxtFile(logFileName, tStr);
end.


В файле, вместо ожидаемого: "Канал Уровень мерник поз. 1 = 85",
видим: "Канал 3 = 85".

При этом ShowMessage(tStr) показывает то, что нужно.
Давайте ширше

Var
cTime: TDateTime;
TinValue: Variant;
tStr: string;
Const
logFileName = 'c:\simplog.txt';
TinChName = 'Уровень мерник поз. 1';
Begin
cTime := Now;
tStr := FormatDateTime('yyyy-mm-dd hh:nn:ss',cTime) + '; ';
TinValue := ReadValue(TinChName);
tStr := tStr + 'Канал ' + TinChName + ' = ' + VarToStr(TinValue) + ';';
SaveToTxtFile(logFileName, tStr);
end.


В файле, вместо ожидаемого: "Канал Уровень мерник поз. 1 = 85",
видим: "Канал 3 = 85".

При этом ShowMessage(tStr) показывает то, что нужно.

Довольно интересно, можете пару строк из сохранённого simplog.txt показать, проверил Ваш пример у себя, работает как надо. Через минут 5 - 10 пришлю другой пример, посмотрим как у Вас он будет работать.
Давайте попробуем вот такой вариант:

var cTime: TDateTime; TinValue: Variant; tStr: string; flist: TStringList; Const logFileName = 'c:\simplog.txt'; TinChName = 'Уровень мерник поз. 1'; begin cTime := Now; tStr := FormatDateTime('yyyy-mm-dd hh:nn:ss',cTime) + '; '; TinValue := ReadValue(TinChName); tStr := tStr + 'Канал ' + TinChName + ' = ' + VarToStr(TinValue) + ';'; flist := TStringList.Create; try if FileExists(logFileName) then flist.LoadFromFile(logFileName); flist.add(tStr); flist.SaveToFile(logFileName); finally flist.free; end; end.
Задача такова - нужно писать в txt файл несколько параметров,
В файл record1.txt пытаюсь вывести заранее подготовленную строку
В файл record.txt пытаюсь вывести строку которая формируется в самой функции SaveToTxtFile

ни тот ни другой вариант не работают, компиляция проходит без ошибок, но эффекта 0, в чем проблема?

Var In1, In2, In3, In4, str: String; Begin In1:=ReadValue('натяжение'); In2:=ReadValue('Dmin'); In3:=ReadValue('Dmax'); In4:=ReadValue('оборотов в мин'); str := TimeToStr(now) + ' ves ' + ReadValue('натяжение') + ' Dmin ' + ReadValue('Dmin') + ' Dmax '+ ReadValue('Dmax'); SaveToTxtFile('d:\record1.txt', str); SaveToTxtFile('d:\record.txt', TimeToStr(now) + ' ves ' + ReadValue('натяжение') + ' Dmin ' + ReadValue('Dmin') + ' Dmax '+ ReadValue('Dmax') ); end.
Задача такова - нужно писать в txt файл несколько параметров,
В файл record1.txt пытаюсь вывести заранее подготовленную строку
В файл record.txt пытаюсь вывести строку которая формируется в самой функции SaveToTxtFile

ни тот ни другой вариант не работают, компиляция проходит без ошибок, но эффекта 0, в чем проблема?

В файл что то сохраняется?
Версию SIMP скажите пожалуйста у кого SaveToTxtFile работает неправильно.
Давайте ширше

Var
…end.


В файле, вместо ожидаемого: "Канал Уровень мерник поз. 1 = 85",
видим: "Канал 3 = 85".

При этом ShowMessage(tStr) показывает то, что нужно.

Довольно интересно, можете пару строк из сохранённого simplog.txt показать, проверил Ваш пример у себя, работает как надо. Через минут 5 - 10 пришлю другой пример, посмотрим как у Вас он будет работать.

У вас такой канал, "Уровень мерник поз. 1" среди активных присутствует?
Давайте попробуем вот такой вариант:


var
cTime: TDateTime;
TinValue: Variant;
tStr: string;
flist: TStringList;
Const
logFileName = 'c:\simplog.txt';
TinChName = 'Уровень мерник поз. 1';
begin
cTime := Now;
tStr := FormatDateTime('yyyy-mm-dd hh:nn:ss',cTime) + '; ';
TinValue := ReadValue(TinChName);
tStr := tStr + 'Канал ' + TinChName + ' = ' + VarToStr(TinValue) + ';';

flist := TStringList.Create;
try
if FileExists(logFileName) then
flist.LoadFromFile(logFileName);
flist.add(tStr);
flist.SaveToFile(logFileName);
finally
flist.free;
end;
end.


Этот код не выполняется.
Версия - только что скачал SIMP Light FREE..
Правда сейчас я под WIN7 проверяю, может из-за этого.
У вас такой канал, "Уровень мерник поз. 1" среди активных присутствует?

Хмм…забавный баг, канала не было в активных, когда добавил его, поведение при записи повторило Ваше. Отдам на исправление. Спасибо.
Этот код не выполняется.
Версия - только что скачал SIMP Light FREE..
Правда сейчас я под WIN7 проверяю, может из-за этого.

А на что ругается? Хотя, судя по тому что обнаружили неправильную работу скрипта, этот вариант тоже не "взлетит", программисты мне уже ответили в чем проблема, при компиляции система для оптимизации скорости, заменяет имена на индексы в таблице данных, тут то и происходит "чудо" Встретив в скрипте имя канала, в данном случае объявленное как константа, система заменяет его на индекс.
Этот код не выполняется.
Версия - только что скачал SIMP Light FREE..
Правда сейчас я под WIN7 проверяю, может из-за этого.

А на что ругается? Хотя, судя по тому что обнаружили неправильную работу скрипта, этот вариант тоже не "взлетит", программисты мне уже ответили в чем проблема, при компиляции система для оптимизации скорости, заменяет имена на индексы в таблице данных, тут то и происходит "чудо" Встретив в скрипте имя канала, в данном случае объявленное как константа, система заменяет его на индекс.

Извиняюсь. Надо было от имени Администратора редактор запускать.
С TStringList.SaveToFile работает нормально.
В любом случае это баг.

И чой-то у вас все запущено… :)
TStringList.SaveToFile создает файл и пишет данные из редактора скриптов - если "Выполнить".
А SaveToTxtFile() только когда "Монитор" запускаешь.
С TStringList.SaveToFile работает нормально.

Понятно. Но проблема с заменой имени канала все равно должна была остаться.

И чой-то у вас все запущено… :)
TStringList.SaveToFile создает файл и пишет данные из редактора скриптов - если "Выполнить".
А SaveToTxtFile() только когда "Монитор" запускаешь.

)) SaveToTxtFile - по сути функция для упрощения работы с текстовым файлом, в отладке у неё стоит "заглушка", работа непосредственно с классом TStringList, уровень более "продвинутый", соответственно он работает даже под отладкой.
Не-не.
TStringList.SaveToFile пишет имя канала, как и требуется.
Не-не.
TStringList.SaveToFile пишет имя канала, как и требуется.

Нет нет, баг сохраняется. Запустите в "мониторе", Вы под отладкой смотрите, а там все "оптимизаторы" отключаются.
День добрый.

Задача такова - нужно писать в txt файл несколько параметров,
В файл record1.txt пытаюсь вывести заранее подготовленную строку
В файл record.txt пытаюсь вывести строку которая формируется в самой функции SaveToTxtFile

ни тот ни другой вариант не работают, компиляция проходит без ошибок, но эффекта 0, в чем проблема?


Var In1, In2, In3, In4, str: String;
Begin
In1:=ReadValue('натяжение');
In2:=ReadValue('Dmin');
In3:=ReadValue('Dmax');
In4:=ReadValue('оборотов в мин');
str := TimeToStr(now) + ' ves ' + ReadValue('натяжение') + ' Dmin ' + ReadValue('Dmin') + ' Dmax '+ ReadValue('Dmax');
SaveToTxtFile('d:\record1.txt', str);
SaveToTxtFile('d:\record.txt', TimeToStr(now) + ' ves ' + ReadValue('натяжение') + ' Dmin ' + ReadValue('Dmin') + ' Dmax '+ ReadValue('Dmax') );
end.

Скажите пожалуйста Вы пробудете работу скрипта под отладкой?
Бодрого дня!
Пробовал посмотреть на выполнение под запущенным монитором, эффекта не увидел
Бодрого дня!
Пробовал посмотреть на выполнение под запущенным монитором, эффекта не увидел

На выходе файл создается? Или файл есть но он пустой?
файл не создается - выпустил отдельный пост по сему вопросу
http://simplight.ru/forum/redaktor-kanalov/918-problemy-s-savetotxtfile
файл не создается - выпустил отдельный пост по сему вопросу
http://simplight.ru/forum/redaktor-kanalov/918-problemy-s-savetotxtfile

У Вас будет возможность предоставить доступ по teamviwer, на месте посмотрим в чем может быть причина. Если да, то данные для подключения пришлите на simp@miniscada.com

Сервис поддержки клиентов работает на платформе UserEcho