Работа с переменными

Автор VoronovMaksim88, 29 марта 2016, 18:06:50

« назад - далее »

VoronovMaksim88

Мне нравится концепция что бы проект всегда компилировался. Поэтому думаю лучше всё же заранее предупреждать такие ситуации. Но решать  вам.

mike

Вы просто подумайте:
22к памяти программ и около 500 программных блоков!

Дилемма следующая:
Можно было бы поставить пожирнее процессор, да и не 8 бит, а целых 32.
Но тогда вырастет цена контроллера. Да, сейчас 32 бита машины дешевле 8 битных.
Но помехоустойчивость у них хуже на порядок.
Следовательно, нужно принять меры по помехоподавлению. Вот отсюда и поползет цена.

Производительность 8 битной машины невысока. Но вполне достаточная для выполнения весьма серьезных задач.
Зачем платить больше за тот же результат?

Привыкнуть к выбору типа данных совсем несложно, хотя конечно же это требует некоторого внимания.
Но с другой стороны вы самообучитесь писать оптимально для любого проекта.

Причин не сборки проекта несколько, вот самые распространенные:

1. Неправильно указан тип данных.
Как можно было бы поступить:
Сделать так же, как в смлоджике: 4 типа данных и нет возможности коннекта к разным типам.
Давайте посмотрим на эту "простоту" пристальнее.
типы Bool / Sint / Long / Real

Нет возможности прямого соединения типов данных по восходящей, следовательно, появляются лишние блоки.
Станет бессмысленна функция "обратного" соединения двух блоков (от выхода к входу)

Оптимизация трафика по сети.
Пример, надо в сеть послать число 65000
2хбайтовым целым - да пожалуйста, а вот знаковым двухбайтовым - фиг. Используйте 4х байтовое.
А если переменных 100? Правильно! мы отправим в два раза больше данных, причем половина - бесполезных. А теперь умножим на 30 контроллеров в сети. Получается, что упрощая работу с ФБД редактором, вы автоматически генерируете избыточный трафик по низкоскоростному каналу.

Мне задали вопрос недавно. Модбас - говенный протокол. Очень медленный.
Я ответил, что многое зависит от оптимизации данных и мне на скорости 19к очень комфортно общаться с 30ю подчиненными.

2. Рекурсивные связи.
В нашей реализации ФБД рекурсия осуществляется переменными.
Казалось бы - что стоит сделать визуальное представление переменной, как линии связи?

Почему оставили именно вид переменных? Этот подход открывает огромное количество возможностей для творчества.

Простой пример, но прежде чем вы его посмотрите в картинке, пришлите, кому не лень, свою реализацию в других ФБД редакторах.

Задача: вывести в сеть состояние D-триггера с возможностью локальной и сетевой установки триггера (то есть все по-взрослому: Сет/Ресет/Переключение).
Кстати, задача абсолютно не абстрактная - это локальная/удаленная кнопка Пуск/Стоп.
______________
Подсказка: я это сделаю в ZWB на одной рекурсивной переменной.


3. Конфликт множественной записи в переменные.
Это сумасшедшая возможность ЗВБ!!!
Ее просто надо понять. Эта штука позволяет синхронизировать по приоритетам данные из разных портов, мест программы. Короче всего со всем.
И требует это минимального усилия программиста.

Решите в стороннем ФБД редакторе задачу:
Есть абстрактный контроллер с двумя портами (протокол неважен).
Контроллер по двум портам - подчиненный, или другими словами, ему нет надобности инициировать запросы.
В программе есть переменная УСТАВКА ТЕМПЕРАТУРЫ. Уставка сохраняется в ПЗУ (ну и естественно, читается по запросу мастера)
Цель: отдать на оба порта уставку из переменной и изменить ее по запросу любого из мастеров.

Ах, да! Усложним. Контроллер имеет индикатор и клавиатуру. И с клавиатуры тоже можно задать уставку в эту же переменную.
Примем, что переменная получает уставку от устройства ввода-вывода каким-то образом, например значение и строб на запись.
______________
Подсказка: я это сделаю в ZWB на одной переменной.


Очень жду вашего резюме.

VoronovMaksim88

#2
Цитата: mike от 29 марта 2016, 19:13:25
Задача: вывести в сеть состояние D-триггера с возможностью локальной и сетевой установки триггера (то есть все по-взрослому: Сет/Ресет/Переключение).
Кстати, задача абсолютно не абстрактная - это локальная/удаленная кнопка Пуск/Стоп.

Мой вариант решения задачи в лоджике.

VoronovMaksim88

Попутно небольшой косячок нашёл, как мне кажется. НА Z400 на экране отладки, созданном по умолчанию, выходы дискретные не отрабатывают.

VoronovMaksim88

Ещё небольшой глюк: окно "отладка - переферия" при входе в симуляцию и выходе самопроизвольно закрывается.

VoronovMaksim88

Вот мой вариант решения на ZWB.
Да, в ZWB поудобнее.

VoronovMaksim88

Вот ещё один вариант решения задачи на лоджике, здесь приоритет записи в переменную организован посредством макроса.

mike

Немного поправлю.

Приоритет 0 - это когда нет других мест записи.
Так что при записи в переменную из разных мест приоритет надо указывать отличным от нуля.

Что касается предложенной схемы - у тебя не корректная запись по сети. Сет/Ресет работать будут, а вот переключение нет.

На входах Сет и Ресет не нужны передние фронты.
Инверсия в части Ресет излишняя - можно решить константами.

mike

К чему это я всё.
Мы тщательно продумываем поведение пользователя в ЗВБ.
Итог - программа для контроллера получается нагляднее и компактнее.
Мне кажется не такая уж и большая нагрузка на инженера - выбрать тип данных переменной или входа.

Посмотрим, как справятся наши конкурсанты со второй задачей. Она значительно сложнее.

VoronovMaksim88

Про приоритет понял.
Про фронты понял.
Про инверсию понял.

В твоей схеме переключение происходит независимо от того что передал мастер, 0 или 1. Я могу добавить отдельную сетевую переменную, которая и будет переключать триггер. Ну а так предполагается что мастер если ему надо сделать переключение отправит на запись противоположное значение.

В целом идею с приоритетом записи я понял.

mike

Цитата: VoronovMaksim88 от 30 марта 2016, 07:17:21

В твоей схеме переключение происходит независимо от того что передал мастер, 0 или 1. Я могу добавить отдельную сетевую переменную, которая и будет переключать триггер. Ну а так предполагается что мастер если ему надо сделать переключение отправит на запись противоположное значение.

Таки мы D-trigger делаем или шо? Я же с удаленной системы должен записать единицу в переменную.
Я чуть упростил и вытаскиваю сам факт записи, а чего пишут меня не волнует.

Можно и добавить переменную.
Основная идея задания - показать насколько изящно получается решить сложную задачу. Причем всего парой блоков.

VoronovMaksim88

Согласен, задача решается изящно  :)

Max

Цитата: mike от 30 марта 2016, 07:14:37
К чему это я всё.
Мы тщательно продумываем поведение пользователя в ЗВБ.
Итог - программа для контроллера получается нагляднее и компактнее.

Только вот тут и возникают у всех вопросы на первых порах - чтобы пользоваться всеми фишками на полную - нужно знать как это делать. Нужно какой-то компактный и внятный мануал.
Ваш пример про D-триггер. Вы мне его около года назад показывали как реализовать на ZetFBD... честно говоря, получилось компактно, удобно и т.д. и т.п. Но я бы сам не догадался что можно так сделать :)
Да, много сейчас описано на форуме, кое-что есть в хелпе, но нужно как-то это все компактно оформить в виде одного документа с удобным поиском. Не сомневаюсь в том, что вы ведете работу в этом направлении и через некоторое время все будет.

mike

Это просто один из фундаментальных моментов.

Я вот все жду решения второй задачи. В ней очень ярко откроется потенциал ЗВБ.

Что касается манов и уроков - работаем над этим.

Max

Цитата: mike от 30 марта 2016, 07:50:01
Это просто один из фундаментальных моментов.

Я вот все жду решения второй задачи. В ней очень ярко откроется потенциал ЗВБ.

Что касается манов и уроков - работаем над этим.
Вторая задача на раз-два делается в SMLogix.
Вот пожалуйста... за 1 минуту сделал. Задавать уставку можно как из меню контроллера при помощи клавиатуры так и через любой порт контролера (у SMH2Gi их целых 3). И в итоге будет хранится последняя записанная переменная.