Стартовая страница › Форумы › Разработка и интеграция › Числа из регистра в канал Scada для обработки битов
- В этой теме 9 ответов, 2 участника, последнее обновление 4 года, 6 месяцев назад сделано Mikhail.
-
АвторСообщения
-
02.10.2019 в 00:32 #13764manjey73Участник
Собственно имеем один или два регистра из прибора.
Как их правильно конвертировать из WORD или DWORD в переменную входного канала чтобы сохранилась работа с битами числа и передавать обратно в прибор командой ?Речь о драйвере и передаче 2-х или 4-х байт.
А то что-то я делаю через Convert.ToDouble и обратно через Convert.ToInt32 а байты отличаются….
02.10.2019 в 13:29 #13765MikhailМодераторКогда регистр записан во входной канал, он уже преобразова в double.
Думаю, что для обратного преобразования нужно использовать
UInt64 uintVal = (UInt64)val;
как это делается в функции GetBit02.10.2019 в 13:54 #13767manjey73УчастникНу я понял, что если мы в double в канале меняем 0 бит, то потом в драйвере надо делать не Convert.ToIntXX а именно BitConverter.GetBytes и забирать нужные байты и уже потом конвертировать в формат, который поймет Устройство.
03.10.2019 в 14:09 #13768MikhailМодераторРасскажите подробнее, какая команда должна отправляться с точки зрения пользователя?
03.10.2019 в 14:38 #13769manjey73УчастникИмеем две последовательных переменных 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.
03.10.2019 в 16:31 #13771manjey73УчастникВот жешь, так как работать с битами в числе 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 чтобы биты были там, где они должны быть изначально ? Запутался уже совсем.
03.10.2019 в 17:16 #13772manjey73УчастникНу вроде разобрался, надо сделать Convert.ToUint64 в драйвере ну или может в Uint32 (надо проверить) и уже потом с байтами работать…
Вот в этом есть некоторый недостаток, что база вся в double, это необходимость выполнять кучу мелких манипуляций…
Второй минус существующей базы, запись постоянно в базу значений, которые очень редко меняются, а не по изменению. Можно ведь БД уменьшить в размерах достаточно сильно.
Только другие приложения должны уметь строить потом графики имея метки времени.
Когда не было сигнала, когда пропадала связь и сигнал был недостоверный и так далее.- Этот ответ был изменен 4 года, 6 месяцев назад от manjey73.
04.10.2019 в 12:04 #13776MikhailМодераторВот в этом есть некоторый недостаток, что база вся в double, это необходимость выполнять кучу мелких манипуляций…
Думал об этом. Но всё же плюсы унификации перевешивают.
Второй минус существующей базы, запись постоянно в базу значений, которые очень редко меняются, а не по изменению.
Если писать каждый канал по изменению, то для каждого значения придётся ещё хранить метку времени, что увеличит размер базы.
В следующем поколении Rapid SCADA планируется реализовать гибкую работу архивов.04.10.2019 в 13:08 #13781manjey73УчастникКак может измениться размер базы ?
00:00:00 — сохранили переменную
01:14:27 — изменился статус — сохранили как недостоверную
01:15:48 — изменился статус на достоверую — сохранили
23:29:59 — сохранили переменную4 записи за весь день. Миниму 2 записи, максимум зависит от сигнала.
При условии настройки «Писать по изменению»
Либо пишем постоянно на старом механизме в double таблицу как и было ранее… Но если пишем «По изменению» переменная отсутствует в основной БД и таких переменных в проекте как правило вагон и тележка где-нибудь на половину базы.Сейчас база растет в размерах из-за кучи мусора, хоть и нужного. Дорасчетные каналы — взвести бит для какой-нибудь функции, просто уставки из приборов и так далее…
- Этот ответ был изменен 4 года, 6 месяцев назад от manjey73.
04.10.2019 в 17:40 #13785MikhailМодераторНекоторые величины меняются редко, некоторые часто. Бывает по-разному.
Различные режимы работы архива будут полезны, с этим никто не спорит. -
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.