Сообщество - Лига КИПиА
Добавить пост

Лига КИПиА

36 постов 447 подписчиков

Популярные теги в сообществе:

Съём показаний температуры горячей воды. Вопрос

Пикабутяне, вопрос у меня. Хочу поставить на трубы горячей воды (2 шт) в квартире датчики температуры (термодатчик) чтобы фиксировать температуру в постоянном режиме. При этом подключить к компьютеру. По хорошему чтобы сертифицированное было всё и по адекватной цене. Как это можно сделать? В интернете навалом всяких датчиков, но не понятно что нормальное а что нет. Заранее спасибо.

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 АСУ ТП, Автоматизация

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

Показать полностью 3

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

Появилось желание потыкать более подробно ПЛК 1500 серии от Siemens. И немного разобрать что там интересного есть, как с этим работать и понять для чего это надо. И первыми под небольшой обзор попала такая группа данных как pointer(указатель), которых в s7-1500 аж 4 вида. Сейчас хочу быстро пробежимся по каждому и немного поработать с References

Типы данных в ПЛК.
Начнем с теории. Типы данных - определяют свойства данных, например, размер в памяти или их представление. У Siemens есть:
Элементарные типы данных(bool, int, real, char)
Сложные типы данных (DT, String, Array, Struct)
UDT - типы определяемые пользователем
УКАЗАТЕЛЬ
Тип параметров
Системные типы данных
Типы данных оборудования
Ну и если с верхней частью списка все более менее понятно, исходя из начальных уроков по программированию. То где-то с указателей начинается магия. Однако все не так просто.
Немного об оптимизированном доступе

У контроллеров S7-1200/1500 имеется возможность оптимизированного
хранения данных. В оптимизированных блоках, все теги автоматически
сортируются по их типу данных. Данный метод позволяет минимизировать
промежутки между тегами, таким образом такие теги оптимизированы по
времени доступа для процессора.
(c)Базовое системное руководство  11/2015Руководство по программированию
S7-1200/S7-1500
И теперь если просто, то в оптимизированном блоке нет доступа по адресу. Там происходит магия, данные сортируются так как надо, теперь тебе не надо играть в тетрис, когда у тебя все бинарные значения должны быть в конце. Но от этого мы получаем новые виды указателей.

УКАЗАТЕЛИ
В данную группу входят следующие ребята:
- References
- VARIANT
- POINTER
- ANY
Для наглядности где какие указатели могут быть использованы вне 1500 контроллеров ловите табличку.

S7-1500, Группа Pointers, References Siemens, Программирование ПЛК, АСУ ТП, ПЛК, Длиннопост

References
References - это тэг, который указывает на область памяти. вы указываете тип данных, на который он ссылается, является безопасным по типу. Гарантируется, что либо она принадлежит к конкретному типу данных, либо ей присваивается NULL.
References у нас указывают только на конкретный тип и могут быть прочитаны или записаны через разыменовывание. ТОЛЬКО ДЛЯ ОПТИМИЗИРОВАННЫХ БЛОКОВ,
VARIANT
Это тэг, который указывает на различные типы данных, но не может указывать на экземпляры. Операнд типа данных VARIANT не занимает места в блоке данных экземпляра или в рабочей памяти. Однако он будет занимать место в памяти ЦП.

Тег типа VARIANT - это не объект, а ссылка на другой объект. Отдельные элементы типа VARIANT могут быть объявлены только для формальных параметров в блочном интерфейсе функции в разделах VAR_IN, VAR_IN_OUT и VAR_TEMP. По этой причине его нельзя объявить в блоке данных или в статическом разделе интерфейса блока функционального блока, например, потому что его размер неизвестен. Размер объектов, на которые имеются ссылки, может измениться.
(с) Перевод гуглом справки от Сименса
Ну и много других вещей. Вот тут уже можно себе выстрелить немножко в ножку, но радует, что мы не можем просто читать и записывать Variant.
POINTER
Еще указатель. Занимает 6 байтов. Может хранить данные о тэге.
1)Номер DB
2)Память в ЦПУ
3)Адрес тэга
Работает лишь со стандартным доступом, не работает с оптимизированным. Ну и еще область определения. В функциях - это InOut, а в функциональных блоках - это везде за исключением TEMP, а UDT - только InOut
ANY
Указывает на начало области данных и содержит ее длину. Занимает 10 байт памяти.
Может содержать:
1)Тип данных элементов
2)Количество элементов
3)Номер БД
4)Область памяти ЦП, в которой хранятся элементы
5)Начальный адрес данных в формате «байт.бит»

ПРАКТИКА
Начнем с референсов)) Объявить данный тип мы можем в FC,FB,OB, но в разных частях интерфейса
- FC: Input, Output, Temp, Return
- FB: Temp
- OB: Temp
Объявление происходит конструкцией REF_TO, присваивание значений командой REF();

S7-1500, Группа Pointers, References Siemens, Программирование ПЛК, АСУ ТП, ПЛК, Длиннопост

А дальше мы пойдем немного усложнять задачи. И чуток поработаем в связке VARIAN и REF. Придумаем себе несуществующую задачу, которая гласит, что у нас есть функция, на вход которой могут подаваться различные UDT.
В нашем случае следующего вида:

S7-1500, Группа Pointers, References Siemens, Программирование ПЛК, АСУ ТП, ПЛК, Длиннопост
S7-1500, Группа Pointers, References Siemens, Программирование ПЛК, АСУ ТП, ПЛК, Длиннопост

И нам надо записать туда значения. в случае udt_2pointж 5.0, а в случае udt_3point -4.

S7-1500, Группа Pointers, References Siemens, Программирование ПЛК, АСУ ТП, ПЛК, Длиннопост

Из всего что написано выше, что стоит понять функция TypeOf - возвращает тип тэга Variant.
Конструкция ?= пытается присвоить REF тэг Variant. Так как это слегка удобнее. Если присвоение провалилось, то тэг REF будет NULL.

S7-1500, Группа Pointers, References Siemens, Программирование ПЛК, АСУ ТП, ПЛК, Длиннопост
S7-1500, Группа Pointers, References Siemens, Программирование ПЛК, АСУ ТП, ПЛК, Длиннопост

Теперь на вход подаем udt_2point.

S7-1500, Группа Pointers, References Siemens, Программирование ПЛК, АСУ ТП, ПЛК, Длиннопост
S7-1500, Группа Pointers, References Siemens, Программирование ПЛК, АСУ ТП, ПЛК, Длиннопост

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

Показать полностью 9
Отличная работа, все прочитано!