Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › Дата время (BCD)
- В этой теме 58 ответов, 4 участника, последнее обновление 2 года, 8 месяцев назад сделано VylegzhaninD.
-
АвторСообщения
-
25.04.2022 в 11:31 #23237MikhailМодератор
EncodeDate была добавлена. Попробуйте создать новый проект и проверить таблицу Скрипты, ID=4.
25.04.2022 в 12:01 #23238a80808УчастникНашел, спасибо!
Я как то считал, что с обновлением версии и таблицы (справочники) автоматом обновятся…наивный! 🙂
А вот кстати, @mikhail, а можно придумать какой то механизм такого обновления? Например по кнопке «Синхронизировать версии» и чтобы добавились нужные элементы…
Вопрос понятно не сюда, но все же…25.04.2022 в 16:39 #23245MikhailМодераторСкрипты находятся в проекте, а проект может быть расположен где угодно на диске. Думаю, возможно создать инструмент — обновить справочники по шаблонам Администратора. Сейчас это проще всего сделать с помощью импорта нужных таблиц, они лежат в SCADA\ScadaAdmin\Templates\EmptyProject.ru-RU\BaseXML
Операция импорта сохранит скрипты пользователя, если их идентификаторы не пересекаются с шаблоном.
25.04.2022 в 16:47 #23249a80808УчастникВ принципе если правила соблюдать и свои скрипты писать после ID = 101 и импортировать только «чистые» таблицы из системы «Все будет хорошо!» (с) Митя Фомин 🙂
25.04.2022 в 20:44 #23254manjey73Участник@a80808 только не забывайте, что в версии 6 обязательное указание public, в 5-й это было не обязательно. Где-то выше Михаил писал об этом.
25.04.2022 в 21:21 #23255a80808УчастникАга, помню 🙂 Он мне это и писал 🙂
25.04.2022 в 21:29 #23256a80808УчастникК делу. Сочинил формулу для преобразования времени BCD в «полное» время системы. Получилось коряво, но работает.
Нужно четыре канала — три входных для день+месяц, год, часы+минуты. Секунды принимаем за 0. Четвертый дорасчетный, в нем формула. Параметрами формулы являются номера каналов, описанных выше.Как то так:
public double BCD_GetDate(int bcd_dm, int bcd_yy, int bcd_hm)
{int dd;
int mm;
ushort yyyy = (ushort) Val(bcd_yy);
int hh;
int min;
ushort x;
int d1;
int d2;x = (ushort)Val(bcd_dm);
//BCD_DAY
d1 = (x >> 12) & 0x0F;
d2 = (x >> 8) & 0x0F;
dd = d1 * 10 + d2;//BCD_MONTH
d1 = (x >> 4) & 0x0F;
d2 = x & 0x0F;
mm = d1 * 10 + d2;x = (ushort)Val(bcd_hm);
//BCD_HOUR
d1 = (x >> 12) & 0x0F;
d2 = (x >> 8) & 0x0F;
hh = (d1 * 10 + d2);//BCD_MIN
d1 = (x >> 4) & 0x0F;
d2 = x & 0x0F;
min = d1 * 10 + d2;DateTime UTCdata = new DateTime(yyyy, mm, dd, hh, min, 0);
return EncodeDate(TimeZoneInfo.ConvertTimeToUtc(UTCdata));
}
Проверил на beta6, работает
25.04.2022 в 21:31 #2325726.04.2022 в 09:43 #23264MikhailМодераторДобавлю, что при создании DateTime можно сразу указать DateTimeKind.UTC или DateTimeKind.Local. Также есть методы
DateTime.ToUniversalTime
DateTime.ToLocalTime
Работать будет так же, вопрос стиля кода.26.04.2022 в 10:20 #23268a80808УчастникНу за стиль отдельные извинения 🙂 Суровое прошлое процедурного программирования…ну не ложится объектная модель на мои мозги… 🙂
26.04.2022 в 20:15 #23281VylegzhaninDУчастникУважаемый @a80808
проверил на 5.8
Никак мне не дадутся формулы 🙁- Этот ответ был изменен 2 года, 9 месяцев назад от VylegzhaninD.
26.04.2022 в 21:04 #23283VylegzhaninDУчастниквру, в 5.5.2.2*
и ещё вот26.04.2022 в 21:32 #23285a80808УчастникДобрый вечер!
Просто в качестве аргументов функции BCD_GetDate() Передаются номера каналов а не их значение.
Т.е. вызов функции в канале 2999 должен выглядеть так:BCD_GetDate(3000,3001,3002)
Кстати для в6 int может оказаться мало…может сразу переделать на ushort…
26.04.2022 в 21:54 #23286VylegzhaninDУчастникЧто-то маленечко не так…
дата-время26.04.2022 в 22:28 #23287a80808УчастникНу дык…про преобразование года то я забыл 🙂
Ниже код…как говорил наш бывший Коммерческий директор (бывший офицер с нулевой выслугой) «Безобразно, зато однообразно!»public double BCD_GetDate(int bcd_dm, int bcd_yy, int bcd_hm)
{int dd;
int mm;
int yyyy;
int hh;
int min;
ushort x;
int d1;
int d2;
int d3;
int d4;
int y1;
int y2;x = (ushort) Val(bcd_yy);
//BCD_YEAR
d1 = (x >> 12) & 0x0F;
d2 = (x >> 8) & 0x0F;
y1 = d1 * 10 + d2;d1 = (x >> 4) & 0x0F;
d2 = x & 0x0F;
y2 = d1 * 10 + d2;yyyy = y1 *100 + y2;
x = (ushort)Val(bcd_dm);
//BCD_DAY
d1 = (x >> 12) & 0x0F;
d2 = (x >> 8) & 0x0F;
dd = d1 * 10 + d2;//BCD_MONTH
d1 = (x >> 4) & 0x0F;
d2 = x & 0x0F;
mm = d1 * 10 + d2;x = (ushort)Val(bcd_hm);
//BCD_HOUR
d1 = (x >> 12) & 0x0F;
d2 = (x >> 8) & 0x0F;
hh = (d1 * 10 + d2);//BCD_MIN
d1 = (x >> 4) & 0x0F;
d2 = x & 0x0F;
min = d1 * 10 + d2;DateTime UTCdata = new DateTime(yyyy, mm, dd, hh, min, 0);
//return EncodeDate(UTCdata);
return EncodeDate(TimeZoneInfo.ConvertTimeToUtc(UTCdata));}
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.