Бета тестирование версии 4.4

Avatar
  • обновлен
Сюда постим все, что касается тестирования версии 4.4:
ошибки, недоработки, пожелания.
Avatar
Михаил
Добрый день!
После обновления до версии 4.4 ProModbus (unlimit) на станции разработчика после положенной работы Монитора 1 час, регулярно стала выпадать ошибка "Исключительная ситуация EInvalidPointer в модуле Monitor.exe по адресу 000041В1", что делать?
Avatar
SIMP Tech (Сергей)
Добрый день, Анатолий.

На первый взгляд в скрипах все нормально. Давайте попробуем такой вариант:

[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 пришлите на почту.
Avatar
да данные в базе есть
они были созданы функцией записи:

// функция записи в базу данных заданных значений с шагом 1 секунда в пределах одних суток
// возвращает 1 при удачной записи, возвращает 0 - при неудаче (см.пример ниже)
// i = SaveBasePer("Сигнальный", "10.06.2015 01:00:00", "10.06.2015 03:01:00", 77);
// if(i==1) {ShowMessageBox("Заголовок","Запись в базу завершена успешно!",1);} else {ShowMessageBox("Заголовок","Ошибка записи!",1);}

int SaveBasePer(string sName, string sBegin, string sEnd, int iPer)
{
string stroka = sBegin, sHour, sMin, sSec;
int iSec = StrToInt(Copy(sBegin,18,2));
int iMin = StrToInt(Copy(sBegin,15,2));
int iHour = StrToInt(Copy(sBegin,12,2));

if(sName=="") { ShowMessage("Ошибка! Не задано имя канала!"); return 0; }
if(GetQuality(sName)!=192) { ShowMessage("Ошибка! Проверьте правильность написания имени канала!"); return 0; }
ShowMessage("Все готово для начала процесса зааписи! \n Нажмите ОК и ожидайте сообщения об окончании процесса записи!");
do
{
SaveChannelToDB(sName, StringToDateTime(stroka, "dd.mm.yyyy hh:nn:ss") , iPer);
iSec = iSec + 1;
if(iSec==60) {iSec=0; iMin=iMin+1;}
if(iMin==60) {iMin=0; iHour=iHour+1;}
sHour = IntToStr(iHour); if(iHour<10) sHour = "0" + sHour;
sMin = IntToStr(iMin); if(iMin<10) sMin = "0" + sMin;
sSec = IntToStr(iSec); if(iSec<10) sSec = "0" + sSec;
stroka = Copy(sBegin,1,11) + sHour + ":" + sMin + ":" + sSec;
}
while (stroka < sEnd);
return 1;
}

экспортный файл отправил почтой
Avatar
SIMP Tech (Сергей)
Измениил

error = StreamReadFromDatabase(dtBegin, dtEnd, "Сигнальный", Stream);

результат остался неизменным

ок. спс. В базе за этот период данные есть? В "просмотре архивов" экспортируйте данные в csv,и на почту к нам закиньте.
Avatar
Измениил

error = StreamReadFromDatabase(dtBegin, dtEnd, "Сигнальный", Stream);

результат остался неизменным
Avatar
SIMP Tech (Сергей)
Добрый день, Анатолий.

Не подскажите, в чем проблема?

Анатолий, попробуйте в качестве теста напрямую указать имя канала в функции - [error = StreamReadFromDatabase(dtBegin, dtEnd, имя канала, Stream)]
Проверим одну догадку.
Avatar
Добрый день!

Разрешите тоже задать вопрос по скрипту.
Задался целью доставать из базы статистическую информацию.
Набросал примерную функцию:
// Функция чтения базы данных и запись статистических данных в текстовый файл
// возвращает 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)
{
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;
}

в результате работы получаю текстовый файл с таким содержимым:

30.12.1899 : 0
17.03.1900 : 77
30.12.1899 : 0
17.03.1900 : 77
30.12.1899 : 0

Не подскажите, в чем проблема?

С уважением, Кондратенко Анатолий
Новочеркасск
Avatar
Михаил
РАБОТАЮЩИЙ ПРИМЕР
{Пример вычисления времени работы и простоя насосов}
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
Скачивать методом – «Сохранить объект как»
Avatar
Михаил
Писмо в 12 метров.
Avatar
SIMP Tech (Сергей)
Отправил

Хорошо. Пока нет письма. Ждем.