Числа из регистра в канал Scada для обработки битов

Стартовая страница Форумы Разработка и интеграция Числа из регистра в канал Scada для обработки битов

Просмотр 10 сообщений - с 1 по 10 (из 10 всего)
  • Автор
    Сообщения
  • #13764
    manjey73
    Участник

    Собственно имеем один или два регистра из прибора.
    Как их правильно конвертировать из WORD или DWORD в переменную входного канала чтобы сохранилась работа с битами числа и передавать обратно в прибор командой ?

    Речь о драйвере и передаче 2-х или 4-х байт.

    А то что-то я делаю через Convert.ToDouble и обратно через Convert.ToInt32 а байты отличаются….

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

    Когда регистр записан во входной канал, он уже преобразова в double.
    Думаю, что для обратного преобразования нужно использовать
    UInt64 uintVal = (UInt64)val;
    как это делается в функции GetBit

    #13767
    manjey73
    Участник

    Ну я понял, что если мы в double в канале меняем 0 бит, то потом в драйвере надо делать не Convert.ToIntXX а именно BitConverter.GetBytes и забирать нужные байты и уже потом конвертировать в формат, который поймет Устройство.

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

    Расскажите подробнее, какая команда должна отправляться с точки зрения пользователя?

    #13769
    manjey73
    Участник

    Имеем две последовательных переменных Int16 (с точки зрения ПЛК), но так как это свободно программируемое устройство, то писатель программы может заложить в них переменную DWord с битовой маской например.

    Получаем некое число если от старшего бита к младшему в байтах 00 05 1A AC (hex)
    В ответе прибора это выглядит так соответственно
    AC 1A (младший регистр) 05 00 (старший регистр)

    Если в Scada Коммуникаторе оставлять его как число, то показывает 0,000 — ну нифига не понятно что там за число…
    Я сделал отображение в виде HEX и в виде BIN
    | 3 | Config DWord | 1010001101010101100 bin | Вот пример в bin представлении, соответственно младший бит справа. старший слева
    И сделал возможность показывать его в HEX представлении
    | 3 | Config DWord | 00051AAC hex | соответственно перевернув его отображение чтобы тоже младший байт был справа для лучшего понимания.

    В базе же это double, можно работать с битами и т.д. НО как этот double обработать в драйвере чтобы осталось только 4 байта для записи ????? не выходит каменный цветок.

    Кстати ScadaUtils.BytesToHex(data).ToString() может отобразить байты с пробелами между ними ?

    • Этот ответ был изменен 4 года, 6 месяцев назад от manjey73.
    #13771
    manjey73
    Участник

    Вот жешь, так как работать с битами в числе double канала, чтобы биты соответствовали правильному положению в дальнейшем ?

    Число 1 — если это Int64 (там нет мантисс и прочей фигни) то это нулевой бит в 1.

    При конвертировании в double это вроде как 1.0 но нифига биты не равны выставленным битам в числе Int64…
    00111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000

    Совсем не то же, что
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001

    Так как из драйвера передать Int16 или Int32 чтобы биты были там, где они должны быть изначально ? Запутался уже совсем.

    #13772
    manjey73
    Участник

    Ну вроде разобрался, надо сделать Convert.ToUint64 в драйвере ну или может в Uint32 (надо проверить) и уже потом с байтами работать…

    Вот в этом есть некоторый недостаток, что база вся в double, это необходимость выполнять кучу мелких манипуляций…

    Второй минус существующей базы, запись постоянно в базу значений, которые очень редко меняются, а не по изменению. Можно ведь БД уменьшить в размерах достаточно сильно.
    Только другие приложения должны уметь строить потом графики имея метки времени.
    Когда не было сигнала, когда пропадала связь и сигнал был недостоверный и так далее.

    • Этот ответ был изменен 4 года, 6 месяцев назад от manjey73.
    #13776
    Mikhail
    Модератор

    Вот в этом есть некоторый недостаток, что база вся в double, это необходимость выполнять кучу мелких манипуляций…

    Думал об этом. Но всё же плюсы унификации перевешивают.

    Второй минус существующей базы, запись постоянно в базу значений, которые очень редко меняются, а не по изменению.

    Если писать каждый канал по изменению, то для каждого значения придётся ещё хранить метку времени, что увеличит размер базы.
    В следующем поколении Rapid SCADA планируется реализовать гибкую работу архивов.

    #13781
    manjey73
    Участник

    Как может измениться размер базы ?
    00:00:00 — сохранили переменную
    01:14:27 — изменился статус — сохранили как недостоверную
    01:15:48 — изменился статус на достоверую — сохранили
    23:29:59 — сохранили переменную

    4 записи за весь день. Миниму 2 записи, максимум зависит от сигнала.

    При условии настройки «Писать по изменению»
    Либо пишем постоянно на старом механизме в double таблицу как и было ранее… Но если пишем «По изменению» переменная отсутствует в основной БД и таких переменных в проекте как правило вагон и тележка где-нибудь на половину базы.

    Сейчас база растет в размерах из-за кучи мусора, хоть и нужного. Дорасчетные каналы — взвести бит для какой-нибудь функции, просто уставки из приборов и так далее…

    • Этот ответ был изменен 4 года, 6 месяцев назад от manjey73.
    #13785
    Mikhail
    Модератор

    Некоторые величины меняются редко, некоторые часто. Бывает по-разному.
    Различные режимы работы архива будут полезны, с этим никто не спорит.

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