PDA

Просмотр полной версии : Ошибка функции DTU.DTSplit()



ntro123
05.01.2017, 23:04
Добрый вечер.

Речь пойдет о ПЛК 323, бибки CAA DTUtility 3.4.4.0 (или просто DTU).

Прямо перед НГ меня ждал подарок.
На сервер пришла дата: 2153-02-06 06:28:16.
Не буду вдаваться в подробности как я выяснил, что это не у меня руки кривые, (т.е. полгода все исправно приходило), а проблемы DTU бибки, а именно ф-ции DTU.DTSplit(). Скажу лишь? что в сообщение серверу передается DT самого ПЛК (нормальное, не 2153+ год), а вырезается в каких-либо сообщения год из даты функцией DTU.DTSplit().

Если ей скормить 2016-12-31 00:00:00 (именно эту дату, без разницы какое время) мы получим 2153-02-06 06:28:16.
Если вычесть эти 2 даты (в секундах), мы получим 4294967296 = 2^32. Где-то у немцев сдвиг на 4 байта получается.

Но, таких дат в промежуток с 2017 по 2099 будет 20 штук.

След. дата: 2020-12-31 00:00:00 мы получим 2157 г. и т.п.


Подскажите как обойтись без костылей? мб версия библиотеки старая и эта ошибка уже исправлена? мб есть аналоги данной функции?



dt1:=DT#2017-01-01-00:00:00;
WHILE dt1<=DT#2099-01-01-00:00:00 DO
dt_error:=DTU.DTSplit(
dt1,
ADR(year1),
ADR(month1),
ADR(day1),
ADR(hour1),
ADR(minute1),
ADR(second1)
);

IF
year1<2000 OR year1>2099 OR dt_error<>0
THEN
step:=23;
RETURN;
END_IF

dt1:=dt1+T#1D;
END_WHILE



PS DTU.DateSplit() не проверял, возможна таже ошибка.

Осинский Алексей
06.01.2017, 01:04
Добрый вечер.

Речь пойдет о ПЛК 323, бибки CAA DTUtility 3.4.4.0 (или просто DTU).

Прямо перед НГ меня ждал подарок.
На сервер пришла дата: 2153-02-06 06:28:16.
Не буду вдаваться в подробности как я выяснил, что это не у меня руки кривые, (т.е. полгода все исправно приходило), а проблемы DTU бибки, а именно ф-ции DTU.DTSplit(). Скажу лишь? что в сообщение серверу передается DT самого ПЛК (нормальное, не 2153+ год), а вырезается в каких-либо сообщения год из даты функцией DTU.DTSplit().

Если ей скормить 2016-12-31 00:00:00 (именно эту дату, без разницы какое время) мы получим 2153-02-06 06:28:16.
Если вычесть эти 2 даты (в секундах), мы получим 4294967296 = 2^32. Где-то у немцев сдвиг на 4 байта получается.

Но, таких дат в промежуток с 2017 по 2099 будет 20 штук.

След. дата: 2020-12-31 00:00:00 мы получим 2157 г. и т.п.


Подскажите как обойтись без костылей? мб версия библиотеки старая и эта ошибка уже исправлена? мб есть аналоги данной функции?






PS DTU.DateSplit() не проверял, возможна таже ошибка.

Добрый вечер!
Завтра на работе проверю.

Scream
06.01.2017, 13:27
Может свой split написать? Я думаю не так это и сложно.

Rake Runner
06.01.2017, 13:49
Или, как вариант, взять из OSCAT'a (DT_TO_SDT).
Правда, у меня на виртуальном контроллере проблема с DTU.DTSplit не воспроизвелась - но это на виртуальнике с 3.5.x.x рантаймом.

Осинский Алексей
06.01.2017, 13:59
Добрый день, ntro123!
Повторить проблему на СПК и виртуальном контроллере не получилось.

Пришлите, пожалуйста полное наименование ПЛК323, на котором наблюдается проблема и версию прошивки.

ntro123
06.01.2017, 17:33
Добрый день, ntro123!
Повторить проблему на СПК и виртуальном контроллере не получилось.

Пришлите, пожалуйста полное наименование ПЛК323, на котором наблюдается проблема и версию прошивки.

КМ ЭНТЕК E1R2
ЭНТЕК323-220.03.01-EN

usr_fw_setup_plc323web_v3.212
CODESYS V3.5 SP4 Patch 4
Repository_OWEN_SPK_3.5.4.20.package
owen_plc323.03-cs.web-v3.5.0.40.devdesc.xml


PS на днях попробую поставить последнюю прошивку и протестить

Осинский Алексей
12.01.2017, 11:24
КМ ЭНТЕК E1R2
ЭНТЕК323-220.03.01-EN

usr_fw_setup_plc323web_v3.212
CODESYS V3.5 SP4 Patch 4
Repository_OWEN_SPK_3.5.4.20.package
owen_plc323.03-cs.web-v3.5.0.40.devdesc.xml


PS на днях попробую поставить последнюю прошивку и протестить

Добрый день!
На последней прошивке проблема наблюдается?

ntro123
14.01.2017, 01:53
Добрый, прошивку не удалось поставить

Подробнее: http://www.owen.ru/forum/showthread.php?t=25896

ntro123
15.01.2017, 20:59
Протестировал мой знакомый на ПЛК 323 прошивка 3.947 (польз. прог. 1.032) у него тоже самое.

28741

Почему у меня тот же код в режиме эмуляции всегда во все переменные записывает 0? Вместо разбивки даты?

28740

capzap
16.01.2017, 07:51
Протестировал мой знакомый на ПЛК 323 прошивка 3.947 (польз. прог. 1.032) у него тоже самое.

28741

Почему у меня тот же код в режиме эмуляции всегда во все переменные записывает 0? Вместо разбивки даты?

28740

а что это за извращение по использованию кейса, с такими подходами к программированию не удивительно что всякие глюки вылазят

Трофимов Артем
16.01.2017, 09:54
попробуйте разбить на 2 переменные dt - одна для вычитки, вторая для редактирования.
переменную dt , которая работает с блоком вычитки времени , обнуляйте в начале цикла до вызова ФБ DTU.SPLIT , а после обработки фб сохраните данные в другую переменную dt1 и редактируйте уже её

ntro123
16.01.2017, 23:43
а что это за извращение по использованию кейса, с такими подходами к программированию не удивительно что всякие глюки вылазят


А чем вам кейс не угодил?) Что именно вам не понравилось?

Да тут можно без кейса разумеется, но привычка, после отработки цикла если все удачно отправляю на 222, если нет то на 10 шаг (если раскомментировать 19 и 20 строчку) очень наглядно показывает результат. Разумеется в рабочем проекте такого цирка нет.

У меня большой проект (около 800 КБ) полгода работал идеально. И работал бы до сих пор, если бы не эта дурацкая ошибка.


PS Тест был написан на коленке.
PSS согласен лишь с тем, что хорошая программа работает с ошибками, моя, к сожалению, с такой ошибкой работать не смогла.

ntro123
17.01.2017, 00:10
попробуйте разбить на 2 переменные dt - одна для вычитки, вторая для редактирования.
переменную dt , которая работает с блоком вычитки времени , обнуляйте в начале цикла до вызова ФБ DTU.SPLIT , а после обработки фб сохраните данные в другую переменную dt1 и редактируйте уже её

Немного не понял, что это даст?
это split фунция (не concat) и 2 и более DT переменные ничего не дадут, т.к. сами переменные DT сохраняют верное значение (точнее даже не изменяются).
Проблема на выходе в year1, month1 и т.д.
Не понимаю как манипуляция с DT переменными может повлиять на UINT переменные на выходе.

В любом случае я уж тогда постараюсь без костылей, либо OSCAT либо свою функцию как советовали ранее.

Трофимов Артем
17.01.2017, 15:49
подтверждаем, что DTUSplit так себя ведёт на ПЛК323. на сервер отправляете данные в формате uint или dt? прилагаю вариант работы.
сделал конверсию в UINT'ы и в DT.
проверил на указанной дате ( см. скриншот)

ntro123
18.01.2017, 00:14
подтверждаем, что DTUSplit так себя ведёт на ПЛК323. на сервер отправляете данные в формате uint или dt? прилагаю вариант работы.
сделал конверсию в UINT'ы и в DT.
проверил на указанной дате ( см. скриншот)


На сервер идет UINT (только год, не исключено, что понадобится еще месяц и число).
SysTimeRtcConvertHighResToDate() - работает корректно? (нет возможности в близлежащее время проверить на ПЛК)

Спасибо за ответ.

Трофимов Артем
18.01.2017, 11:45
ntro123 , я установил в переменные разбора указанные Вами даты, которые разбирались некорректно, всё разобралось нормально.
отличительно то , что в моём примере Вы вычитываете не DATE_AND_TIME формат, а pTStamp , который исчисляется в секундах от опорной даты.
в примере этот HiRez формат конвертируется в Uint'ы