0
Бета тестирование версии 4.4
Сюда постим все, что касается тестирования версии 4.4:
ошибки, недоработки, пожелания.
ошибки, недоработки, пожелания.
Сервис поддержки клиентов работает на платформе UserEcho
Сервис поддержки клиентов работает на платформе UserEcho
Не совсем по теме, будем считать что тестирование продолжается ;)
1) На странице: http://simplight.ru/news/118-05-05-2015-sl-4-4 приведены примеры, которые не скачиваются, поскольку браузер сообщат следующее "The requested URL /simplight.ru/files/4.4/time_EQ_example.slz was not found on this server."
2) в help забыли добавить описание новых функций по работе с глобальными переменными, нет там ни слова про ClearGlobalVar, FlushGlobalVarCache, GetGlobalVarDef
3) кстати о глобальных переменных.
Читаю "… FlushGlobalVarCache принудительная запись на диск кэша глобальных переменных. На диск сохраняются те глобальные переменные у которых при назначении глобальной переменной был установлен в True – флаг «AStored»….".
Зацепило слово "назначении".
Вопрос:
Глобальная переменная объявляется функцией SetGlobalVar("per", 0, true). И этой же функцией меняется значение этой же глобальной переменной. А если в скрипте ниже будет написано SetGlobalVar("per", 1), то эта глобальная переменная перестанет сохраняться на диске? То есть, другими словами, если глобальная переменная должна сохраняться на диске, то надо ли при любом изменении этой глобальной переменной устанавливать флаг AStored ?
С уважением, Кондратенко Анатолий
Новочеркасск
ОК. Спасибо. Проверим.
Да, описание добавим.
Флаг - "AStored" учитывается только при первоначальном объявлении переменной, если переменная уже была объявлена ранее то вызов SetGlobalVar изменит только значение переменной.
Остались сомнения.
"… если переменная уже была объявлена ранее …".
А если первоначальное объявление, сделанное внутри AsFirstRun, состоялось много месяцев назад и с тех пор глобальная переменная много раз меняла значение, программа много раз перегружалась…
Вся красота глобальной переменной (IMHO) - это возможность сохранить значение между перезапусками программ, перегрузками сервера.
Вопрос: то есть перезапустив программу и обнаружив, что в глобальной переменной есть что-то, то нет необходимости объявлять эту переменную с флагом AStored ?
С уважением, Кондратенко Анатолий
Новочеркасск
Если есть полная уверенность что переменная точно ранее объявлена, и присутствует в кэш файле - то объявлять её не надо. Но я бы внутри AsFirstRun делал проверку на наличие переменной, функцией GetGlobalVarDef(имя переменной'', -1), т.е. в случае наличия переменной в кэше функция вернёт значение переменной, если переменной нет то будет возвращено значение которое было указанно вторым параметром в функции.
Р.S. мне передали что ссылки на примеры исправили.
Не работает пример с функцией получения из под скрипта времени работы оборудования.
Данные в БД есть? Скрипт не отдает расчетных значений?
скрипт выдает нули.
Ок. Скиньте проект на почту, посмотрим.
Хорошо.Пока нет письма. Ждем.
Хорошо. Пока нет письма. Ждем.
{Пример вычисления времени работы и простоя насосов}
var
date1, date2: TDateTime;
val: TDateTime;
resOn, resOff: integer;
posit: string;
val1:word;
const
FORMAT_RESULT = '%d дней, %d час. %d мин. %d сек.';
// перевод из секунд в дни ,часы,минуты и секунды
function GetTimeString(ASec: integer): string;
var
sec: integer;
day, hour, min: word;
begin
sec := ASec;
// кол - дней
day := Trunc(sec / 86400);
if day <> 0 then
sec := sec - (day * 86400);
// кол - часов
hour := trunc(sec / 3600);
if hour <> 0 then
sec := sec - (hour * 3600);
// кол - минут
min := trunc(sec / 60);
if min <> 0 then
sec := sec - (min * 60);
result := Format(FORMAT_RESULT, [day, hour, min, sec]);
end;
begin
val := ReadValue('Расчет');
val1 := ReadValue('Сигнальный');
posit := ReadValue('Combo');
// reset input
if val = -1 then
begin
WriteValue(' Сигнальный ',0);
date1 :=0;
date2 := 0;
WriteValue('D1',date1);
WriteValue('D2',date2);
Exit;
end
else
if (date1=0) and (val > 0) then
begin
date1 := val;
WriteValue('D1',date1);
WriteValue(' Сигнальный ',1);
WriteValue(‘Расчет ', 0);
Exit;
end
else
if (date2=0) and (val > 0) then
begin
date2 := val;
WriteValue('D2',date2);
WriteValue(' Сигнальный ',2);
WriteValue(' Расчет ',0);
Exit;
end
else
if val = -2 then
begin
if date1 > date2 then
begin
date1 := 0;
date2 := 0;
WriteValue(' Сигнальный ',0);
WriteValue(' Расчет ',0);
WriteValue('D1',date1);
WriteValue('D2',date2);
Exit;
end;
if ((val = -2)and (date1 < date2) ) then
//posit := ReadValue('Combo');
if (posit = 'Насос 1') then
begin
GetOperationTimeValueFromDB(date1, date2, 'Skvajina1', resOn, resOff);
WriteValue('работал 1', GetTimeString(resOn));
WriteValue('не работал 1', GetTimeString(resOff));
WriteValue(' Сигнальный ',3);
end
else
if (posit = 'Насос 2') then
begin
GetOperationTimeValueFromDB(date1, date2, 'Skvajina2', resOn, resOff);
WriteValue(' работал 2', GetTimeString(resOn));
WriteValue('не работал 2', GetTimeString(resOff));
WriteValue(' Сигнальный ',4);
end
else
if (posit = 'Насос 3')then
begin
GetOperationTimeValueFromDB(date1, date2, 'Skvajina3', resOn, resOff);
WriteValue(' работал 3', GetTimeString(resOn));
WriteValue('не работал 3', GetTimeString(resOff));
WriteValue(' Сигнальный ',5);
end;
CloseMnemo('Test');
end;
end.
Все каналы виртуальные
Сигнальный – word;
Расчет – (Cкрипт по таймеру) – DateTime;
Работал – string;
Не работал – string;
Инициализация – (скрипт по таймеру) Double;
Combo – string;
Насос 1 – Bool;
Насос 2 - Bool;
Насос 3 - Bool;
Остальное как в примере http://simplight.ru/files/4.4/time_EQ_example.slz
Скачивать методом – «Сохранить объект как»
Разрешите тоже задать вопрос по скрипту.
Задался целью доставать из базы статистическую информацию.
Набросал примерную функцию:
в результате работы получаю текстовый файл с таким содержимым:
Не подскажите, в чем проблема?
С уважением, Кондратенко Анатолий
Новочеркасск
Анатолий, попробуйте в качестве теста напрямую указать имя канала в функции - [error = StreamReadFromDatabase(dtBegin, dtEnd, имя канала, Stream)]
Проверим одну догадку.
результат остался неизменным
ок. спс. В базе за этот период данные есть? В "просмотре архивов" экспортируйте данные в csv,и на почту к нам закиньте.
они были созданы функцией записи:
экспортный файл отправил почтой
На первый взгляд в скрипах все нормально. Давайте попробуем такой вариант:
[spoiler]
// Функция чтения базы данных и запись статистических данных в текстовый файл // возвращает 1 при удачном завершении, соответственно 0 - при неудаче // i = Statistika("Сигнальный", "10.06.2015 01:00:00", "10.06.2015 03:00:00"); // if(i==1) {ShowMessageBox("—","Всё готово!",1);} else {ShowMessageBox("—","Произошла ошибка!",1);} int Statistika(string sName, string sBegin, string sEnd) { string stroka; int count=0, i, iValue, iVozvrat=1; TMemoryStream Stream; word error; TDateTime dtBegin = StrToDateTime(sBegin); TDateTime dtEnd = StrToDateTime(sEnd); TDateTime dtDate; ShowMessageBox("—", "Приступаем!", 1); Stream = TMemoryStream.Create; error = StreamReadFromDatabase(dtBegin, dtEnd, sName, Stream); if(error == 0) { stream.SaveToFile("d:\\stream.bin"); count = GetCountRecordToStream(Stream); for(i=0;i<count;i++) { GetValueFromStream(Stream, dtDate, iValue); stroka = " " + DateTimeToStr(dtDate) + " : " + IntToStr(iValue); SaveToTxtFile("d:\\history.txt", stroka); } } else { ShowMessageBox("—", "Ошибка считывания базы!", 1); iVozvrat=0; } Stream.free; return iVozvrat; }
[/spoiler]результирующий файл stream.bin пришлите на почту.
После обновления до версии 4.4 ProModbus (unlimit) на станции разработчика после положенной работы Монитора 1 час, регулярно стала выпадать ошибка "Исключительная ситуация EInvalidPointer в модуле Monitor.exe по адресу 000041В1", что делать?
Т.е. если я правильно понял то Simp в режиме разработчика, после прошествия часа работы выкидывает ошибку? В режиме с лицензией ошибка не появляется?
Т.е. если я правильно понял то Simp в режиме разработчика, после прошествия часа работы выкидывает ошибку?
Ок. Я понял. Скорей всего некорректное закрытие драйвера modbas при завершении работы. Мы погоняем у себя, спасибо за сообщение.
Возник вопрос по поведению компонентов (слайдер, цифровой задатчик, кнопочный задатчик).
Если на мнемосхеме присутствуют несколько данных элементов то один из них не отображает значение канала, при этом если в него вводишь значение то оно записывается в канал. Если не показывающий элемент удалить и заменить новым то он становится активным при этом перестает работать другой и так по кругу. может кто подскажет в чем проблема?
И еще пожелание необходим продумать организацию доступа к проекту.хорошо бы иметь несколько уровней доступа скажем администратор, оператор( с возможностью изменять параметры), наблюдатель. И хорошо бы что бы монитор работал в фоновом режиме (оператору зачастую незачем наблюдать каналы) для этого и существует мнемосхема на которой в удобной форме отображаются необходимые параметры,а вот открывать окно монитора можно было бы вызовом данного окна с доступом администратора.
А вообще неплохо. Конечно возникло много пожеланий сейчас закончу проект (сейчас он находится на тесте)и отпишусь с пожеланиями и замечаниями.
У элементов "цифровой задатчик", "кнопочный задатчик" в последней версии изменяли алгоритм работы, слайдер ещё в процессе переработки. А проблема состоит в том что один из элементов ввода всегда оставался в "фокусе" ввода. Переработанные элементы теперь должны сами через пять секунд бездействия (отсутствия ввода в элемент) сбрасывать фокус.
Работа над системой авторизации начата, думаю к следующему релизу успеем.
Еще раз всем доброго!
Возник вопрос по использованию элементы "Панель".
А вопрос состоит в том возможно ли изменять цвет шрифта, может программно через скрипт.
Если такая возможность существует просьба показать примерчик на Паскале.
да и еще подымался вопрос по работе с битами вот небольшой пример на Паскале может кому пригодится, работает на ура!
Var
OutWord:Word;
bit0,bit1,bit2,bit3,bit4,bit5,bit6,bit7,bit8,bit9,bit10,bit11,bit12,bit13,bit14,bit15:Word;
Function Bit_To_Word( BitIn:Boolean):word;
begin
If BitIn Then
Result:=1
Else
Result:=0;
End;
Function BitToWord (InBit0,InBit1,InBit2,InBit3,InBit4,InBit5,InBit6,InBit7,
InBit8,InBit9,InBit10,InBit11,InBit12,InBit13,InBit14,InBit15:Word):Word;
Var
n:BitToWord;
Begin
n:=InBit15;
n:=n*2+InBit14;
n:=n*2+InBit13;
n:=n*2+InBit12;
n:=n*2+InBit11;
n:=n*2+InBit10;
n:=n*2+InBit9;
n:=n*2+InBit8;
n:=n*2+InBit7;
n:=n*2+InBit6;
n:=n*2+InBit5;
n:=n*2+InBit4;
n:=n*2+InBit3;
n:=n*2+InBit2;
n:=n*2+InBit1;
n:=n*2+InBit0;
Result:=n;
End;
Begin
Bit0:=Bit_To_Word(ReadValue('1_Bit0'));
Bit1:=Bit_To_Word(ReadValue('1_Bit1'));
Bit2:=Bit_To_Word(ReadValue('1_Bit2'));
Bit3:=Bit_To_Word(ReadValue('1_Bit3'));
Bit4:=Bit_To_Word(ReadValue('1_Bit4'));
Bit5:=Bit_To_Word(ReadValue('1_Bit5'));
Bit6:=Bit_To_Word(ReadValue('1_Bit6'));
Bit7:=Bit_To_Word(ReadValue('1_Bit7'));
Bit8:=Bit_To_Word(ReadValue('1_Bit8'));
Bit9:=Bit_To_Word(ReadValue('1_Bit9'));
Bit10:=Bit_To_Word(ReadValue('1_Bit10'));
Bit11:=Bit_To_Word(ReadValue('1_Bit11'));
Bit12:=Bit_To_Word(ReadValue('1_Bit12'));
Bit13:=Bit_To_Word(ReadValue('1_Bit13'));
Bit14:=Bit_To_Word(ReadValue('1_Bit14'));
Bit15:=Bit_To_Word(ReadValue('1_Bit15'));
OutWord:=BitToWord(Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7,
Bit8,Bit9,Bit10,Bit11,Bit12,Bit13,Bit14,Bit15);
WriteValue('KanWraitPLC',OutWord);
WriteValue('InBitWord_1',OutWord);
End.
В текущей версии из под скрипта воздействовать на свойства элемента на мнемосхеме к сожалению нельзя.
Да у этих элементов на самом деле снимается фокус через пять секунд но вот значение в канале в элементе не отображается и это совсем неудобно так как оператору очень сложно объяснить что на самом деле уставка не равна 0.
Ребята вы прорвете пожалуйста почему один из элементов не отображает значение в канале даже после снятия фокуса.
Ок. Уже проверяем.
Чтобы уставка отображалась не как ноль мы используем два апплета
задатчик + текст одного и того же канала.
[spoiler]
[/spoiler]
simplight_2015-07-02-2.png
Но мнемосхема и так напичкана элементами и не хотелось бы ее усложнять.
Проверили у себя, повторить поведение компонента как у Вас не можем. Вы использовали новые элементы или элементы от старых версий? Если элементы старые попробуйте удалить и заново добавить задатчик. Еще одно уточнение, какой задатчик себя так ведет - "цифровой задатчик" или "кнопочный задатчик"?
Добавлю, если подождать 5 минут и с нова запустить Монитор, ошибка не выскакивает.
Обновите версию. Скачать можно по старым ссылкам.
Попробовали все варианты с последовательностью байт в настройках modbus драйвера?
Ок. Понял. Команды записи modbus меняли в настройках?
В SIMP этой командой не удалось тоже записать? Попробуйте для теста к примеру сервер от инсата настроить, на запись этой переменной.
В Мониторе по двойному клику на выбранном канале в списке параметров отображается тренд реального времени.
Если в данном тренде сперва включить курсор, а затем изменить интервал времени, то все функциональные кнопки окна тренда перестают корректно работать (закрытие / открытие тренда не помогает). Лечится только перезапуском Монитора.
Выглядит как недоработка в виду того, что одно поле все же сделано толково.
Если же это не баг, а "фича", то желательно все же переделать, ибо крайне неудобно.
Когда ожидать новую версию системы ?
Будет ли там место диспетчера (т.е. SIMP Light SPACE) ?
С уважением, Кондратенко Анатолий
Новочеркасск
Новый релиз ориентировочно через 1,5 месяца. Рабочее место диспетчера будет, но не в этом релизе, а после переработки сетевого протокола, работы по нему уже начаты.
1. Следует ли это сообщение понимать, что и ArchBrowser.exe также может работать с ip-адресами ?
2. Следует ли надеяться, что следующим шагом будет появление полноценного места Диспетчера (т.е. SIMP Light SPACE) ?
3. Наша компания использует систему SimpLight версия Enterprise (один сервер - три рабочих места). Для того, чтобы организовать вторую опросную станцию нам надо докупить … (что: сервер, рабочее место, или что-то еще) ?
С уважением, Кондратенко Анатолий
Новочеркасск
Да.
Как такого SPACE уже не будет, будет драйвер для SIMP с помощью которого можно будет подключать другие опросные станции SIMP.
Отдельно можно приобрести только сетевые клиенты, а если нужна опросная станция, то приобретаете необходимую Вам версию SIMP (light, pro, ent).
Когда будет ? :blush:
С уважением, Кондратенко Анатолий
Новочеркасск
Хороший вопрос. В планах к весне. Будем надеяться что уложимся в сроки.