Дата время (BCD)

Просмотр 15 сообщений - с 31 по 45 (из 59 всего)
  • Автор
    Сообщения
  • #23237
    Mikhail
    Модератор

    EncodeDate была добавлена. Попробуйте создать новый проект и проверить таблицу Скрипты, ID=4.

    #23238
    a80808
    Участник

    Нашел, спасибо!
    Я как то считал, что с обновлением версии и таблицы (справочники) автоматом обновятся…наивный! 🙂
    А вот кстати, @mikhail, а можно придумать какой то механизм такого обновления? Например по кнопке «Синхронизировать версии» и чтобы добавились нужные элементы…
    Вопрос понятно не сюда, но все же…

    #23245
    Mikhail
    Модератор

    Скрипты находятся в проекте, а проект может быть расположен где угодно на диске. Думаю, возможно создать инструмент — обновить справочники по шаблонам Администратора. Сейчас это проще всего сделать с помощью импорта нужных таблиц, они лежат в SCADA\ScadaAdmin\Templates\EmptyProject.ru-RU\BaseXML

    Операция импорта сохранит скрипты пользователя, если их идентификаторы не пересекаются с шаблоном.

    #23249
    a80808
    Участник

    В принципе если правила соблюдать и свои скрипты писать после ID = 101 и импортировать только «чистые» таблицы из системы «Все будет хорошо!» (с) Митя Фомин 🙂

    #23254
    manjey73
    Участник

    @a80808 только не забывайте, что в версии 6 обязательное указание public, в 5-й это было не обязательно. Где-то выше Михаил писал об этом.

    #23255
    a80808
    Участник

    Ага, помню 🙂 Он мне это и писал 🙂

    #23256
    a80808
    Участник

    К делу. Сочинил формулу для преобразования времени 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, работает

    #23257
    a80808
    Участник

    Да, забыл — все преобразования из BCD — (c) @mikhail, за что ему огромное спасибо!

    #23264
    Mikhail
    Модератор

    Добавлю, что при создании DateTime можно сразу указать DateTimeKind.UTC или DateTimeKind.Local. Также есть методы
    DateTime.ToUniversalTime
    DateTime.ToLocalTime
    Работать будет так же, вопрос стиля кода.

    #23268
    a80808
    Участник

    Ну за стиль отдельные извинения 🙂 Суровое прошлое процедурного программирования…ну не ложится объектная модель на мои мозги… 🙂

    #23281
    VylegzhaninD
    Участник

    Уважаемый @a80808
    проверил на 5.8
    Никак мне не дадутся формулы 🙁

    каналы
    лог
    формулы

    • Этот ответ был изменен 1 год, 11 месяцев назад от VylegzhaninD.
    #23283
    VylegzhaninD
    Участник

    вру, в 5.5.2.2*
    и ещё вот

    CalcEngine.cs

    #23285
    a80808
    Участник

    Добрый вечер!
    Просто в качестве аргументов функции BCD_GetDate() Передаются номера каналов а не их значение.
    Т.е. вызов функции в канале 2999 должен выглядеть так:

    BCD_GetDate(3000,3001,3002)

    Кстати для в6 int может оказаться мало…может сразу переделать на ushort…

    #23286
    VylegzhaninD
    Участник

    Что-то маленечко не так…
    дата-время

    #23287
    a80808
    Участник

    Ну дык…про преобразование года то я забыл 🙂
    Ниже код…как говорил наш бывший Коммерческий директор (бывший офицер с нулевой выслугой) «Безобразно, зато однообразно!»

    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));

    }

Просмотр 15 сообщений - с 31 по 45 (из 59 всего)
  • Вы должны авторизироваться для ответа в этой теме.