3

S7-1500. ANY_DB

Ааааааааааа.... Несколько дней прошло с зудящей мыслью, а что это за фрукт такой ANY_DB. И вот наконец-то теоретическое послание о том что такое ANY_DB и попытки разобраться, а зачем он нужен(я так и не понял, но об этом после).

Немного неофициальной теории

В целом это еще один инструмент для унификации процессов и написании мега универсальных ФБ. Особенность того, что ANY_DB хранит номер DB и может быть использован до того как мы создали дб. В ANY_DB хранится номер любой БД(Ох если все было так просто).

Вы не сможете записать в параметр ANY_DB DB с резервированием памяти
S7-1500. ANY_DB АСУ ТП, Автоматизация

И так что мы можем точно писать в ANY_DB:

1)Экземпляры UDT и системных типов

2)Экземпляры FB

3)DB которые были созданы как массив.

Из этого списка пункты 1 и 3 имеют возможность конвертирования в Variant. В целом есть две команды:

VARIANT_TO_DB_ANY

DB_ANY_TO_VARIANT

И больше с этим типом данных нельзя сделать НИ-ЧЕ-ГО!

Как ANY_DB в VARIANT превратить и что с этим дальше делать.

В целом после столь скудной теоретической части давайте фантазировать.

ANY_DB мы можем конdертить в variant.

А дальше там скармливать что хочешь и куда хочешь, у нас же есть REF_TO и ?=

В коде это будет выглядеть следующим образом:

S7-1500. ANY_DB АСУ ТП, Автоматизация

Ну и если подняться выше, то можно узнать, что на вход ANY_DB я подаю Data_Block_2

S7-1500. ANY_DB АСУ ТП, Автоматизация

Тут для закрепления требуется какая-то задачка, но на ум пока ничего толкового не приходит. Разве что какая-то фантастическая сборная линия с тремя операциями по координатам. Но если вдруг у вас появились идеи как это куда-то приделать или вы использовали где-то, то пожалуйста, поделитесь информацией.

Лига КИПиА

47 постов540 подписчиков

Правила сообщества

Правила - в соответствии с общими правилами Пикабу.

0
Автор поста оценил этот комментарий
Ну к этой же DB возможно будет иметь доступ scada которая не умеет с оптимизированным доступом работать
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Окей) Тогда есть вариант с PEEK и POKE

0
Автор поста оценил этот комментарий
Оптимизированный тоже не хотелось бы. Но как вариант попробую
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
А почему нет? Что плохого в оптимизированном доступе?
показать ответы
0
Автор поста оценил этот комментарий
Ну это не ограничения. Это мечта. Просто если использовать input output переменную, то перезапись выхода происходит при каждом вызове блока, даже если пере енная внутри блока не меняла свое значение
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

можешь в input использовать тип Variant, а в Temp переменной REF_TO *твой тип данных*,

но тогда понадобиться оптимизированный доступ к данным.

показать ответы
0
Автор поста оценил этот комментарий
Проблема именно в том чтобы передать на input то что мы хотим менять внутри блока. При этом нельзя использовать input_output
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Конечно странные ограничения. Щас посмотрю
показать ответы
0
Автор поста оценил этот комментарий
1500
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Если честно, то я слабо представляю себе этот момент. Теоретически можно передать адрес этого DB и работать с байтами. Но не проще ли сделать пользовательский тип данных и использовать его?
показать ответы
0
Автор поста оценил этот комментарий
Можно ли на вход FB передать имя DB и в программе уже работать с переменными этой DB?
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
А какой плк?
показать ответы
0
Автор поста оценил этот комментарий
Вот я про них тоже не знаю. Документацию читал и ничего не понял.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

S7-1500, Группа Pointers, References


Вот тут я немного расписал

показать ответы
0
Автор поста оценил этот комментарий
С input_output проблема такая. В db есть поле в которое пишется с панели и со scada. Это поле мы подаём в input_output FB. И тогда , даже если в коде FB мы совершенно ничего не делали с этим input_output- оно все равно перезапишится. Перезапишится тем значением которое было в момент вызова FB. А если после вызова FB в, это поле произвела запись SCADA, то значение записанное со scada уничтожится. И мы никогда не сможем его обработать
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
А вот тут можно ситуацию разложить и решить
0
Автор поста оценил этот комментарий
Например 1512
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Variant и ref to.
показать ответы
0
Автор поста оценил этот комментарий
Я не умею any. И набор данных хотелось бы udt
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
А плк какой?
показать ответы
0
Автор поста оценил этот комментарий
Дело в том что на вход подавать саму DB или переменные из нее мне не подходит, потому что FB должен будет вносить изменения в поля этой DB. Подать на input/output тоже не подходит, ибо тогда FB вносит изменения при каждом вызове. Например, даже если значение не изменилось по алгоритму, то FB все равно произведет запись. Он запишет то значение которое и так есть в DB. Такова природа input/output. Сейчас я выкрутился так- я в коде FB напрямую обращаюсь к DB. Но это плохо ибо если имя DB изменится, то мне придется вносить измения в код FB. Лучшим выходом было бы на вход подавать имя и в коде уже работать с этим именем
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Не понимаю в чем проблема оставить в input_output. Но если есть желание, и это просто набор данных в дб, которые не представляют собой udt, и дб с не оптимизированным доступом, то формируйте ANY
показать ответы
0
Автор поста оценил этот комментарий
Мне надо. И да мы говорим о сименсе. Как это сделать?
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Какой плк и какая задача?
0
Автор поста оценил этот комментарий
Можно ли на вход FB передать имя DB и в программе уже работать с переменными этой DB?
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
А давай попробуем пойти от задачи. Если мы говорим о сименса, то да, ты можешь на вход дать имя DB и там работать с переменными, но зачем так?
показать ответы