
0
Помощь в написании скрипта
Здравствуйте. нужен пример скрипта на паскале, скрипт по таймеру
1. читаем физ канал,
2. проверяем соответствие значения уставке, допустим он должен быть больше определенного значения 30
3. если значение меньше уставки, пишем в вирт канал флаг для контроля допустим 1, причем флаг не должен записаться в течении 5 циклов таймера скрипта, т.е. если течении 5 циклов опроса значение не соответствует уставке и на 6 цикл не сооответствует то должен писаться флаг, если в любом цикле норма, счетчик опроса в 0 и снова
может быть не буду понят но прошу помощи
1. читаем физ канал,
2. проверяем соответствие значения уставке, допустим он должен быть больше определенного значения 30
3. если значение меньше уставки, пишем в вирт канал флаг для контроля допустим 1, причем флаг не должен записаться в течении 5 циклов таймера скрипта, т.е. если течении 5 циклов опроса значение не соответствует уставке и на 6 цикл не сооответствует то должен писаться флаг, если в любом цикле норма, счетчик опроса в 0 и снова
может быть не буду понят но прошу помощи
Сервис поддержки клиентов работает на платформе UserEcho
примерно так,если я правильно Вас понял:
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, т.к. в сам нахожусь в отпуске (есть только бесплатная версия на ноутбуке).
Напишите к нам на почту simp@miniscada.com, обсудим подробности по задаче, и попробуем накидать пример.
Можете помочь примером?
Среднее за минуту, при условии цикла скрипта в одну секунду, можно примерно так:
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.
Если Вы про ранее присланный пример, то да.
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'?
0,639835481213199
0,639835481213199
0,639835481213199
0,639835481213199
0,771158362428347
0,771158362428347
0,771158362428347
0,771158362428347
0,771158362428347
0,771158362428347
ок. Тогда для полноты картины надо было с реальными именами, а так получается что написано с ошибкой. Хорошо, тогда в силе первый вопрос, почему не объединить в одном скрипте расчет и запись, не факт что расчет будет готов, к моменту когда второй скрипт вычитывает значения результата, каналы между собой не синхронизированы.
В начале какой строки? Которую будите передавать в канал или записывать в файл?
12:00:11 chanel1 0,639835481213199 chanel2 0,698354812131993
пример: str := TimeToStr(now) + ' chanel1 ' + FloatToStr(0.639835481213199);
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) показывает то, что нужно.
Довольно интересно, можете пару строк из сохранённого 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.
В файл 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.
В файл что то сохраняется?
У вас такой канал, "Уровень мерник поз. 1" среди активных присутствует?
Этот код не выполняется.
Версия - только что скачал SIMP Light FREE..
Правда сейчас я под WIN7 проверяю, может из-за этого.
Хмм…забавный баг, канала не было в активных, когда добавил его, поведение при записи повторило Ваше. Отдам на исправление. Спасибо.
А на что ругается? Хотя, судя по тому что обнаружили неправильную работу скрипта, этот вариант тоже не "взлетит", программисты мне уже ответили в чем проблема, при компиляции система для оптимизации скорости, заменяет имена на индексы в таблице данных, тут то и происходит "чудо" Встретив в скрипте имя канала, в данном случае объявленное как константа, система заменяет его на индекс.
Извиняюсь. Надо было от имени Администратора редактор запускать.
С TStringList.SaveToFile работает нормально.
В любом случае это баг.
И чой-то у вас все запущено… :)
TStringList.SaveToFile создает файл и пишет данные из редактора скриптов - если "Выполнить".
А SaveToTxtFile() только когда "Монитор" запускаешь.
Понятно. Но проблема с заменой имени канала все равно должна была остаться.
)) SaveToTxtFile - по сути функция для упрощения работы с текстовым файлом, в отладке у неё стоит "заглушка", работа непосредственно с классом TStringList, уровень более "продвинутый", соответственно он работает даже под отладкой.
TStringList.SaveToFile пишет имя канала, как и требуется.
Нет нет, баг сохраняется. Запустите в "мониторе", Вы под отладкой смотрите, а там все "оптимизаторы" отключаются.
Скажите пожалуйста Вы пробудете работу скрипта под отладкой?
Пробовал посмотреть на выполнение под запущенным монитором, эффекта не увидел
На выходе файл создается? Или файл есть но он пустой?
http://simplight.ru/forum/redaktor-kanalov/918-problemy-s-savetotxtfile
У Вас будет возможность предоставить доступ по teamviwer, на месте посмотрим в чем может быть причина. Если да, то данные для подключения пришлите на simp@miniscada.com