Вопросы о FLProg

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
32 messages Options
12
Reply | Threaded
Open this post in threaded view
|

Re: Вопросы о FLProg

Yuriy Mironenko
так что все будет нормально

Сергей, так в этом же и вопрос.
Для вас "нормально" - это как именно? :)

Нормально - это когда на вход первого и второго XOR'а могут придти разные биты? Или когда они не могут оказаться разными?

14 января 2015 г., 11:17 пользователь Сергей Глушенко <[hidden email]> написал:
Я для этих функций использую виндовые ножница. Безумно удобно. Но у Вас насколько я помно линукс. Печалька....
А теперь серьезно.


среда, 14 января 2015 г., 13:08:54 UTC+5 пользователь Assargadon написал:
Ок. Зацикливаться может.

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

out = (pin2 XOR (pin1 XOR pin2));
так что все будет нормально



Вот в такой схеме - может ли быть так, что на нижний вход второго XOR'а поступит не то значение, которое поступало на нижний вход первого XOR'а, потому что, за время пока вычислялся первый XOR, значение на ноге успело измениться?

14 января 2015 г., 10:37 пользователь Сергей Глушенко <[hidden email]> написал:

Наверное все таки сказывается отсутствие у меня настоящего академического образования. У меня нет вышки, и как там в фильме говорится "Я консирваториев не заканчивал". Посмотрел статьи по вашим сылкам. Честно скажу - ни.... не понял.
Что я реализовал?..... Даже не знаю как ответить. Ну наверное в общих словах компиляцию схемы в скетчь. И все.
    Я действительно когда начинаю работать над новым функционалом не знаю что получится в конце. Первый шаг - реализовать эту функцию в ArduinoIDE что бы понять что это вообще возможно. После этого приступаю к реализации в коде привязываясь к существующей архитектуре. Я почти никогда не продумываю реализацию задачи заранее. Мой подход - "код покажет". Во время работы над проектом Cadel вместе с Vladimir Musulainen у нас проводился анализ задачи с разбиением на карточки,  продумыванием архитектуры и т.д. Но самое смешное что примерно в половине случаев конечная реализация сильно отличалась от задуманного. По разным причинам. Но там это было нужно для разбиения задач по участнигам группы, и расчета ориентировочного времени на реализацию. Поскольку я работаю один и учета времени от меня никто не требует в своей работе я исключил этот этап. Жалко тратить на него время.
 Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

Да можно. Частота генерации будет зависеть от тактовой частоты контроллеа и времени выполнения скана программы. Если есть интерес я могу рассказать о модели выполнения программы в микроконтроллере, и отличия ее от событийной модели в компьютере.

среда, 14 января 2015 г., 12:02:31 UTC+5 пользователь Assargadon написал:
Сергей, вот вы начали про то, что я спросил, а потом переключились на реализацию. Рассказ про реализацию довольно интересен и познавателен, но это немного не то, о чём я спрашивал.

Я хотел узнать не то, как вы реализовали, а что именно вы реализовали. Меня сейчас интересовала не императивная, а декларативная часть вашей работы.

======

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

И это была самая настоящая, физическая релейная логика, на самых настоящих реле. И она - зацикливалась.

Поскольку математику я знал куда лучше, чем электронику, я легко пришёл к тем самым "логическим цепочкам". И это помогло мне понять связь между императивной логикой и логикой булевой, а в будущем легко понять всякие там ДНФ и КНФ и даже конечные автоматы. В общем, опыт был полезный.

Так вот, вопрос: схемы, построенные в FLProg, могут зацикливаться?
Это не единственный вопрос, относящийся к фазам вычислений, но с него проще всего начать.

Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

======

P.S. Обращу, кстати, внимание: перескок с задачи на её реализацию - это такая достаточно показательная вещь. Для вас, видимо, "как сделать" и "что сделать" - очень близкие вещи, тогда как на самом деле это не совсем так. Но это тема для отдельного разговора. Хотя две ссылки я всё же приведу:

Википедия: Императивное программирование
Википедия: Декларативное программирование

14 января 2015 г., 8:03 пользователь Сергей Глушенко <[hidden email]> написал:

Это и было самое сложное в разработке проекта. Как преобразовать графическое представление схемы в код для контроллера. Тут требуется немного предыстории.
Основная идея была создать аналог сред программирования для промышленных (безумно дорогих) контролеров на дешёвые ардуинки. За базу я взял программу TiaPortal от Siemens. У них такая идеология: Вся схема разбивается на отдельные Nenwork - и. В каждом нетворке возможна только одна логическая цепочка. То есть один конечный элемент. Это может быть реле, переменная или что то еще. В общем какой - то объект в который производится запись. И схема которая собирает значение для записи. При компиляции каждый нетворк представляет одну строку конечного кода. Такого алгоритма придерживаются и остальные производители. С него начинал и я. Следы этого остались в проекте, у меня название класса описывающего плату Network. НО. Я разрабатываю проект как среду для электриков, электронщиков, да и просто любителей. Концепция логических цепочек для них тяжела. Я сам прошол путь от простого электрика - до ведущего разработчика, так что могу представить себя в шкуре любого из них. Для них понятно название "плата". То есть какой -то законченный кусок схемы выполняющий определенные функции. А на плате может быть несколько релюшек, лампочек, да и в конце концов просто выходов для связи с другими платами. Еще одна засада. Для реализации какого то блока чаще всего недостаточно только описать строкой состояние его входа. Например для блока дисплея необходимо его задекларировать, инициализировать, подключить библиотеку, в нужный момент вывести требуемый текст, да еще и определить нет ли необходимости его очистить. Это разный код в разных частях скетча.  Так что существующий алгоритм не подходил. Я пости два месяца (точнее четыре с учетом что работаю над проектом я только на вахте) я придумывал новы, свой алгоритм. В принципе это и есть моё как говорится ноу - хау. Не хочу его полностью раскрывать, но коротко могу. Я разработал собственный алгоритм разбиения схемы на куски, и систему взаимодействия схемы и компилятора. Схема и блоки обладают определенным набором интерфейсов с которыми работает компилятор. Схема умеет себя отдавать компилятору в наиболее удобном для него виде (умная женщина, мне бы такую жену))) ).Так же блоки умеют правильно отвечать на вопросы компилятора. Реализация получилась удачной. Об этом свидетельствует то, что почти за год существования проекта мне ни разу не пришлось изменять ее. Интерфейс схемы я вообще не трогал ни разу. Иногда добавляется интерфейс блоков, когда компилятору требуется каки - е то дополнительные данные от них для реализации той или иной функции. Наверное об этом и все. Больше я об этом пока ничего не раскажу Вредный я)))))

среда, 14 января 2015 г., 1:56:01 UTC+5 пользователь Assargadon написал:
Так, теперь более...глубинный вопрос.

Как организована работа с...эээ...фазой вычислений, что ли. Когда несколько виртуальных элементов стоят каскадом, то ведь всегда возникает вопрос синхронизации. Я довольно слабо представляю себе детали, но знаю, что такое явление есть.

Прокомментируете поподробнее?

13 января 2015 г., 1:47 пользователь Сергей Глушенко <[hidden email]> написал:
Большое спасибо за помощь проекту. Кстати как раз выпустил новую версию. Скорее всего следующая будет не скоро, 15-го уезжаю домой, а дома почти сразу с семьей едем в Питер. Так что продолжения придется немного подождать. Но я буду на связи, у меня телефон умный)))

среда, 7 января 2015 г., 14:29:18 UTC+5 пользователь Assargadon написал:
Вопрос первый: а есть какая-нибудь возможность получить версию под Linux? У cincom была, насколько я помню, линуксовая VMка, так что это не должно быть слишком сложно.

Вопрос второй: FLProg на выходе генерирует каноничный C-код, или богомерзкие скетчи на этом их внутреннем ардуиновском недоСи?

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Вопросы о FLProg

Сергей Глушенко
Нормально - это конечно когда разные сигналы придти не могут. В Вашем примере это в принципе возможно. Хоть и расчет XOR занимает наносекунды в принципе есть вероятность того что за это время состояние входа изменится. Я об этой возможности рассказывал в первых видеоуроках. Так же давал решение для тех коому этот вопрос важен. Достаточно в любом месте программы счтать значение железного входа в переменную, и использовать эти переменные в программе. Тогда в течении скана программы значение этих переменных не изменится. Вообще все эти вопросы решает подход с использованием принципа образа процесса. То есть в начале скана все входа контроллера считываются в переменные, в процессе скана работа ведется только с ними. результаты работы заносятся в переменные. В конце скана полученные результаты записываются в железные выхода. Но такой подход требует выделения дополнительной памяти под образ процесса. А у ардуино ее и так немного. Поэтому я отказался от такого подхода.

среда, 14 января 2015 г., 13:34:15 UTC+5 пользователь Assargadon написал:
так что все будет нормально

Сергей, так в этом же и вопрос.
Для вас "нормально" - это как именно? :)

Нормально - это когда на вход первого и второго XOR'а могут придти разные биты? Или когда они не могут оказаться разными?

14 января 2015 г., 11:17 пользователь Сергей Глушенко <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="c8Por3zvss8J" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">sup...@...> написал:
Я для этих функций использую виндовые ножница. Безумно удобно. Но у Вас насколько я помно линукс. Печалька....
А теперь серьезно.


среда, 14 января 2015 г., 13:08:54 UTC+5 пользователь Assargadon написал:
Ок. Зацикливаться может.

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

out = (pin2 XOR (pin1 XOR pin2));
так что все будет нормально



Вот в такой схеме - может ли быть так, что на нижний вход второго XOR'а поступит не то значение, которое поступало на нижний вход первого XOR'а, потому что, за время пока вычислялся первый XOR, значение на ноге успело измениться?

14 января 2015 г., 10:37 пользователь Сергей Глушенко <[hidden email]> написал:

Наверное все таки сказывается отсутствие у меня настоящего академического образования. У меня нет вышки, и как там в фильме говорится "Я консирваториев не заканчивал". Посмотрел статьи по вашим сылкам. Честно скажу - ни.... не понял.
Что я реализовал?..... Даже не знаю как ответить. Ну наверное в общих словах компиляцию схемы в скетчь. И все.
    Я действительно когда начинаю работать над новым функционалом не знаю что получится в конце. Первый шаг - реализовать эту функцию в ArduinoIDE что бы понять что это вообще возможно. После этого приступаю к реализации в коде привязываясь к существующей архитектуре. Я почти никогда не продумываю реализацию задачи заранее. Мой подход - "код покажет". Во время работы над проектом Cadel вместе с Vladimir Musulainen у нас проводился анализ задачи с разбиением на карточки,  продумыванием архитектуры и т.д. Но самое смешное что примерно в половине случаев конечная реализация сильно отличалась от задуманного. По разным причинам. Но там это было нужно для разбиения задач по участнигам группы, и расчета ориентировочного времени на реализацию. Поскольку я работаю один и учета времени от меня никто не требует в своей работе я исключил этот этап. Жалко тратить на него время.
 Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

Да можно. Частота генерации будет зависеть от тактовой частоты контроллеа и времени выполнения скана программы. Если есть интерес я могу рассказать о модели выполнения программы в микроконтроллере, и отличия ее от событийной модели в компьютере.

среда, 14 января 2015 г., 12:02:31 UTC+5 пользователь Assargadon написал:
Сергей, вот вы начали про то, что я спросил, а потом переключились на реализацию. Рассказ про реализацию довольно интересен и познавателен, но это немного не то, о чём я спрашивал.

Я хотел узнать не то, как вы реализовали, а что именно вы реализовали. Меня сейчас интересовала не императивная, а декларативная часть вашей работы.

======

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

И это была самая настоящая, физическая релейная логика, на самых настоящих реле. И она - зацикливалась.

Поскольку математику я знал куда лучше, чем электронику, я легко пришёл к тем самым "логическим цепочкам". И это помогло мне понять связь между императивной логикой и логикой булевой, а в будущем легко понять всякие там <a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%B7%D1%8A%D1%8E%D0%BD%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BD%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B8%25D0%25B7%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGoyWwIDQlFrwWl9nkNYHWwCvtAtw';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B8%25D0%25B7%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGoyWwIDQlFrwWl9nkNYHWwCvtAtw';return true;">ДНФ и <a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%8A%D1%8E%D0%BD%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BD%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%259A%25D0%25BE%25D0%25BD%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGTy9WZIQMiSeLgsPbmxUfOy69cew';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%259A%25D0%25BE%25D0%25BD%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGTy9WZIQMiSeLgsPbmxUfOy69cew';return true;">КНФ и даже конечные автоматы. В общем, опыт был полезный.

Так вот, вопрос: схемы, построенные в FLProg, могут зацикливаться?
Это не единственный вопрос, относящийся к фазам вычислений, но с него проще всего начать.

Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

======

P.S. Обращу, кстати, внимание: перескок с задачи на её реализацию - это такая достаточно показательная вещь. Для вас, видимо, "как сделать" и "что сделать" - очень близкие вещи, тогда как на самом деле это не совсем так. Но это тема для отдельного разговора. Хотя две ссылки я всё же приведу:

<a href="https://ru.wikipedia.org/wiki/%D0%98%D0%BC%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2598%25D0%25BC%25D0%25BF%25D0%25B5%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNF5yT_W1tYkmx_qz8DAY8OB5cmjhg';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2598%25D0%25BC%25D0%25BF%25D0%25B5%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNF5yT_W1tYkmx_qz8DAY8OB5cmjhg';return true;">Википедия: Императивное программирование
<a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BA%D0%BB%D0%B0%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B5%25D0%25BA%25D0%25BB%25D0%25B0%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNGMApeHNnII_LY7EVzyuHWX2I0NTA';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B5%25D0%25BA%25D0%25BB%25D0%25B0%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNGMApeHNnII_LY7EVzyuHWX2I0NTA';return true;">Википедия: Декларативное программирование

14 января 2015 г., 8:03 пользователь Сергей Глушенко <[hidden email]> написал:

Это и было самое сложное в разработке проекта. Как преобразовать графическое представление схемы в код для контроллера. Тут требуется немного предыстории.
Основная идея была создать аналог сред программирования для промышленных (безумно дорогих) контролеров на дешёвые ардуинки. За базу я взял программу TiaPortal от Siemens. У них такая идеология: Вся схема разбивается на отдельные Nenwork - и. В каждом нетворке возможна только одна логическая цепочка. То есть один конечный элемент. Это может быть реле, переменная или что то еще. В общем какой - то объект в который производится запись. И схема которая собирает значение для записи. При компиляции каждый нетворк представляет одну строку конечного кода. Такого алгоритма придерживаются и остальные производители. С него начинал и я. Следы этого остались в проекте, у меня название класса описывающего плату Network. НО. Я разрабатываю проект как среду для электриков, электронщиков, да и просто любителей. Концепция логических цепочек для них тяжела. Я сам прошол путь от простого электрика - до ведущего разработчика, так что могу представить себя в шкуре любого из них. Для них понятно название "плата". То есть какой -то законченный кусок схемы выполняющий определенные функции. А на плате может быть несколько релюшек, лампочек, да и в конце концов просто выходов для связи с другими платами. Еще одна засада. Для реализации какого то блока чаще всего недостаточно только описать строкой состояние его входа. Например для блока дисплея необходимо его задекларировать, инициализировать, подключить библиотеку, в нужный момент вывести требуемый текст, да еще и определить нет ли необходимости его очистить. Это разный код в разных частях скетча.  Так что существующий алгоритм не подходил. Я пости два месяца (точнее четыре с учетом что работаю над проектом я только на вахте) я придумывал новы, свой алгоритм. В принципе это и есть моё как говорится ноу - хау. Не хочу его полностью раскрывать, но коротко могу. Я разработал собственный алгоритм разбиения схемы на куски, и систему взаимодействия схемы и компилятора. Схема и блоки обладают определенным набором интерфейсов с которыми работает компилятор. Схема умеет себя отдавать компилятору в наиболее удобном для него виде (умная женщина, мне бы такую жену))) ).Так же блоки умеют правильно отвечать на вопросы компилятора. Реализация получилась удачной. Об этом свидетельствует то, что почти за год существования проекта мне ни разу не пришлось изменять ее. Интерфейс схемы я вообще не трогал ни разу. Иногда добавляется интерфейс блоков, когда компилятору требуется каки - е то дополнительные данные от них для реализации той или иной функции. Наверное об этом и все. Больше я об этом пока ничего не раскажу Вредный я)))))

среда, 14 января 2015 г., 1:56:01 UTC+5 пользователь Assargadon написал:
Так, теперь более...глубинный вопрос.

Как организована работа с...эээ...фазой вычислений, что ли. Когда несколько виртуальных элементов стоят каскадом, то ведь всегда возникает вопрос синхронизации. Я довольно слабо представляю себе детали, но знаю, что такое явление есть.

Прокомментируете поподробнее?

13 января 2015 г., 1:47 пользователь Сергей Глушенко <[hidden email]> написал:
Большое спасибо за помощь проекту. Кстати как раз выпустил новую версию. Скорее всего следующая будет не скоро, 15-го уезжаю домой, а дома почти сразу с семьей едем в Питер. Так что продолжения придется немного подождать. Но я буду на связи, у меня телефон умный)))

среда, 7 января 2015 г., 14:29:18 UTC+5 пользователь Assargadon написал:
Вопрос первый: а есть какая-нибудь возможность получить версию под Linux? У cincom была, насколько я помню, линуксовая VMка, так что это не должно быть слишком сложно.

Вопрос второй: FLProg на выходе генерирует каноничный C-код, или богомерзкие скетчи на этом их внутреннем ардуиновском недоСи?

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="c8Por3zvss8J" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Вопросы о FLProg

Yuriy Mironenko
хоть и расчет XOR занимает наносекунды

Это как раз неважно. Там же может и не XOR стоять. Там может стоять цепочка в 100500 логических элементов, или ещё что-нибудь посложнее.


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

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

Поэтому я сгенерировал скетч, и вижу там
digitalWrite(2,  ( ( (digitalRead (1))) ^ ( (digitalRead (4))) ) ^ ( (digitalRead (4))) );
Я так понимаю, digitalRead - это чтение бита из порта, а не из буфера. То есть, как я понимаю, на вход второго XOR'а может попасть не тот бит, который попал на первый XOR. Поправьте, если я ошибся.


14 января 2015 г., 12:36 пользователь Сергей Глушенко <[hidden email]> написал:
Нормально - это конечно когда разные сигналы придти не могут. В Вашем примере это в принципе возможно. Хоть и расчет XOR занимает наносекунды в принципе есть вероятность того что за это время состояние входа изменится. Я об этой возможности рассказывал в первых видеоуроках. Так же давал решение для тех коому этот вопрос важен. Достаточно в любом месте программы счтать значение железного входа в переменную, и использовать эти переменные в программе. Тогда в течении скана программы значение этих переменных не изменится. Вообще все эти вопросы решает подход с использованием принципа образа процесса. То есть в начале скана все входа контроллера считываются в переменные, в процессе скана работа ведется только с ними. результаты работы заносятся в переменные. В конце скана полученные результаты записываются в железные выхода. Но такой подход требует выделения дополнительной памяти под образ процесса. А у ардуино ее и так немного. Поэтому я отказался от такого подхода.

среда, 14 января 2015 г., 13:34:15 UTC+5 пользователь Assargadon написал:
так что все будет нормально

Сергей, так в этом же и вопрос.
Для вас "нормально" - это как именно? :)

Нормально - это когда на вход первого и второго XOR'а могут придти разные биты? Или когда они не могут оказаться разными?

14 января 2015 г., 11:17 пользователь Сергей Глушенко <[hidden email]> написал:

Я для этих функций использую виндовые ножница. Безумно удобно. Но у Вас насколько я помно линукс. Печалька....
А теперь серьезно.


среда, 14 января 2015 г., 13:08:54 UTC+5 пользователь Assargadon написал:
Ок. Зацикливаться может.

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

out = (pin2 XOR (pin1 XOR pin2));
так что все будет нормально



Вот в такой схеме - может ли быть так, что на нижний вход второго XOR'а поступит не то значение, которое поступало на нижний вход первого XOR'а, потому что, за время пока вычислялся первый XOR, значение на ноге успело измениться?

14 января 2015 г., 10:37 пользователь Сергей Глушенко <[hidden email]> написал:

Наверное все таки сказывается отсутствие у меня настоящего академического образования. У меня нет вышки, и как там в фильме говорится "Я консирваториев не заканчивал". Посмотрел статьи по вашим сылкам. Честно скажу - ни.... не понял.
Что я реализовал?..... Даже не знаю как ответить. Ну наверное в общих словах компиляцию схемы в скетчь. И все.
    Я действительно когда начинаю работать над новым функционалом не знаю что получится в конце. Первый шаг - реализовать эту функцию в ArduinoIDE что бы понять что это вообще возможно. После этого приступаю к реализации в коде привязываясь к существующей архитектуре. Я почти никогда не продумываю реализацию задачи заранее. Мой подход - "код покажет". Во время работы над проектом Cadel вместе с Vladimir Musulainen у нас проводился анализ задачи с разбиением на карточки,  продумыванием архитектуры и т.д. Но самое смешное что примерно в половине случаев конечная реализация сильно отличалась от задуманного. По разным причинам. Но там это было нужно для разбиения задач по участнигам группы, и расчета ориентировочного времени на реализацию. Поскольку я работаю один и учета времени от меня никто не требует в своей работе я исключил этот этап. Жалко тратить на него время.
 Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

Да можно. Частота генерации будет зависеть от тактовой частоты контроллеа и времени выполнения скана программы. Если есть интерес я могу рассказать о модели выполнения программы в микроконтроллере, и отличия ее от событийной модели в компьютере.

среда, 14 января 2015 г., 12:02:31 UTC+5 пользователь Assargadon написал:
Сергей, вот вы начали про то, что я спросил, а потом переключились на реализацию. Рассказ про реализацию довольно интересен и познавателен, но это немного не то, о чём я спрашивал.

Я хотел узнать не то, как вы реализовали, а что именно вы реализовали. Меня сейчас интересовала не императивная, а декларативная часть вашей работы.

======

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

И это была самая настоящая, физическая релейная логика, на самых настоящих реле. И она - зацикливалась.

Поскольку математику я знал куда лучше, чем электронику, я легко пришёл к тем самым "логическим цепочкам". И это помогло мне понять связь между императивной логикой и логикой булевой, а в будущем легко понять всякие там ДНФ и КНФ и даже конечные автоматы. В общем, опыт был полезный.

Так вот, вопрос: схемы, построенные в FLProg, могут зацикливаться?
Это не единственный вопрос, относящийся к фазам вычислений, но с него проще всего начать.

Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

======

P.S. Обращу, кстати, внимание: перескок с задачи на её реализацию - это такая достаточно показательная вещь. Для вас, видимо, "как сделать" и "что сделать" - очень близкие вещи, тогда как на самом деле это не совсем так. Но это тема для отдельного разговора. Хотя две ссылки я всё же приведу:

Википедия: Императивное программирование
Википедия: Декларативное программирование

14 января 2015 г., 8:03 пользователь Сергей Глушенко <[hidden email]> написал:

Это и было самое сложное в разработке проекта. Как преобразовать графическое представление схемы в код для контроллера. Тут требуется немного предыстории.
Основная идея была создать аналог сред программирования для промышленных (безумно дорогих) контролеров на дешёвые ардуинки. За базу я взял программу TiaPortal от Siemens. У них такая идеология: Вся схема разбивается на отдельные Nenwork - и. В каждом нетворке возможна только одна логическая цепочка. То есть один конечный элемент. Это может быть реле, переменная или что то еще. В общем какой - то объект в который производится запись. И схема которая собирает значение для записи. При компиляции каждый нетворк представляет одну строку конечного кода. Такого алгоритма придерживаются и остальные производители. С него начинал и я. Следы этого остались в проекте, у меня название класса описывающего плату Network. НО. Я разрабатываю проект как среду для электриков, электронщиков, да и просто любителей. Концепция логических цепочек для них тяжела. Я сам прошол путь от простого электрика - до ведущего разработчика, так что могу представить себя в шкуре любого из них. Для них понятно название "плата". То есть какой -то законченный кусок схемы выполняющий определенные функции. А на плате может быть несколько релюшек, лампочек, да и в конце концов просто выходов для связи с другими платами. Еще одна засада. Для реализации какого то блока чаще всего недостаточно только описать строкой состояние его входа. Например для блока дисплея необходимо его задекларировать, инициализировать, подключить библиотеку, в нужный момент вывести требуемый текст, да еще и определить нет ли необходимости его очистить. Это разный код в разных частях скетча.  Так что существующий алгоритм не подходил. Я пости два месяца (точнее четыре с учетом что работаю над проектом я только на вахте) я придумывал новы, свой алгоритм. В принципе это и есть моё как говорится ноу - хау. Не хочу его полностью раскрывать, но коротко могу. Я разработал собственный алгоритм разбиения схемы на куски, и систему взаимодействия схемы и компилятора. Схема и блоки обладают определенным набором интерфейсов с которыми работает компилятор. Схема умеет себя отдавать компилятору в наиболее удобном для него виде (умная женщина, мне бы такую жену))) ).Так же блоки умеют правильно отвечать на вопросы компилятора. Реализация получилась удачной. Об этом свидетельствует то, что почти за год существования проекта мне ни разу не пришлось изменять ее. Интерфейс схемы я вообще не трогал ни разу. Иногда добавляется интерфейс блоков, когда компилятору требуется каки - е то дополнительные данные от них для реализации той или иной функции. Наверное об этом и все. Больше я об этом пока ничего не раскажу Вредный я)))))

среда, 14 января 2015 г., 1:56:01 UTC+5 пользователь Assargadon написал:
Так, теперь более...глубинный вопрос.

Как организована работа с...эээ...фазой вычислений, что ли. Когда несколько виртуальных элементов стоят каскадом, то ведь всегда возникает вопрос синхронизации. Я довольно слабо представляю себе детали, но знаю, что такое явление есть.

Прокомментируете поподробнее?

13 января 2015 г., 1:47 пользователь Сергей Глушенко <[hidden email]> написал:
Большое спасибо за помощь проекту. Кстати как раз выпустил новую версию. Скорее всего следующая будет не скоро, 15-го уезжаю домой, а дома почти сразу с семьей едем в Питер. Так что продолжения придется немного подождать. Но я буду на связи, у меня телефон умный)))

среда, 7 января 2015 г., 14:29:18 UTC+5 пользователь Assargadon написал:
Вопрос первый: а есть какая-нибудь возможность получить версию под Linux? У cincom была, насколько я помню, линуксовая VMка, так что это не должно быть слишком сложно.

Вопрос второй: FLProg на выходе генерирует каноничный C-код, или богомерзкие скетчи на этом их внутреннем ардуиновском недоСи?

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Вопросы о FLProg

Сергей Глушенко

Ключевая фраза

Достаточно в любом месте программы счтать значение железного входа в переменную...
..
 Я как раз сказал что в вашем случае вероятность того что на вход первого придет не то же значение что и второго в принципе возможна.
digitalRead (1)   это чтение состояние ноги контроллера. И да если в течении выполнения первого XORнапряжение на ноге изменится то при следующем чтении значение будет другим. Поэтому я и рекомендовал в случае критичности такой ситуации прочитать значение входа в переменную и использовать ее.
 У меня что то плохо получается вставлять картинки сюда, она вставилась в самый верх сообщения. Попробуйте собрать такую схему и посмотрите что получится в результате. Вот там точно значения не изменятся.







среда, 14 января 2015 г., 15:45:46 UTC+5 пользователь Assargadon написал:
хоть и расчет XOR занимает наносекунды

Это как раз неважно. Там же может и не XOR стоять. Там может стоять цепочка в 100500 логических элементов, или ещё что-нибудь посложнее.


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

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

Поэтому я сгенерировал скетч, и вижу там
digitalWrite(2,  ( ( (digitalRead (1))) ^ ( (digitalRead (4))) ) ^ ( (digitalRead (4))) );
Я так понимаю, digitalRead - это чтение бита из порта, а не из буфера. То есть, как я понимаю, на вход второго XOR'а может попасть не тот бит, который попал на первый XOR. Поправьте, если я ошибся.


14 января 2015 г., 12:36 пользователь Сергей Глушенко <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="yUPHAqaDQPoJ" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">sup...@...> написал:
Нормально - это конечно когда разные сигналы придти не могут. В Вашем примере это в принципе возможно. Хоть и расчет XOR занимает наносекунды в принципе есть вероятность того что за это время состояние входа изменится. Я об этой возможности рассказывал в первых видеоуроках. Так же давал решение для тех коому этот вопрос важен. Достаточно в любом месте программы счтать значение железного входа в переменную, и использовать эти переменные в программе. Тогда в течении скана программы значение этих переменных не изменится. Вообще все эти вопросы решает подход с использованием принципа образа процесса. То есть в начале скана все входа контроллера считываются в переменные, в процессе скана работа ведется только с ними. результаты работы заносятся в переменные. В конце скана полученные результаты записываются в железные выхода. Но такой подход требует выделения дополнительной памяти под образ процесса. А у ардуино ее и так немного. Поэтому я отказался от такого подхода.

среда, 14 января 2015 г., 13:34:15 UTC+5 пользователь Assargadon написал:
так что все будет нормально

Сергей, так в этом же и вопрос.
Для вас "нормально" - это как именно? :)

Нормально - это когда на вход первого и второго XOR'а могут придти разные биты? Или когда они не могут оказаться разными?

14 января 2015 г., 11:17 пользователь Сергей Глушенко <[hidden email]> написал:

Я для этих функций использую виндовые ножница. Безумно удобно. Но у Вас насколько я помно линукс. Печалька....
А теперь серьезно.


среда, 14 января 2015 г., 13:08:54 UTC+5 пользователь Assargadon написал:
Ок. Зацикливаться может.

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

out = (pin2 XOR (pin1 XOR pin2));
так что все будет нормально



Вот в такой схеме - может ли быть так, что на нижний вход второго XOR'а поступит не то значение, которое поступало на нижний вход первого XOR'а, потому что, за время пока вычислялся первый XOR, значение на ноге успело измениться?

14 января 2015 г., 10:37 пользователь Сергей Глушенко <[hidden email]> написал:

Наверное все таки сказывается отсутствие у меня настоящего академического образования. У меня нет вышки, и как там в фильме говорится "Я консирваториев не заканчивал". Посмотрел статьи по вашим сылкам. Честно скажу - ни.... не понял.
Что я реализовал?..... Даже не знаю как ответить. Ну наверное в общих словах компиляцию схемы в скетчь. И все.
    Я действительно когда начинаю работать над новым функционалом не знаю что получится в конце. Первый шаг - реализовать эту функцию в ArduinoIDE что бы понять что это вообще возможно. После этого приступаю к реализации в коде привязываясь к существующей архитектуре. Я почти никогда не продумываю реализацию задачи заранее. Мой подход - "код покажет". Во время работы над проектом Cadel вместе с Vladimir Musulainen у нас проводился анализ задачи с разбиением на карточки,  продумыванием архитектуры и т.д. Но самое смешное что примерно в половине случаев конечная реализация сильно отличалась от задуманного. По разным причинам. Но там это было нужно для разбиения задач по участнигам группы, и расчета ориентировочного времени на реализацию. Поскольку я работаю один и учета времени от меня никто не требует в своей работе я исключил этот этап. Жалко тратить на него время.
 Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

Да можно. Частота генерации будет зависеть от тактовой частоты контроллеа и времени выполнения скана программы. Если есть интерес я могу рассказать о модели выполнения программы в микроконтроллере, и отличия ее от событийной модели в компьютере.

среда, 14 января 2015 г., 12:02:31 UTC+5 пользователь Assargadon написал:
Сергей, вот вы начали про то, что я спросил, а потом переключились на реализацию. Рассказ про реализацию довольно интересен и познавателен, но это немного не то, о чём я спрашивал.

Я хотел узнать не то, как вы реализовали, а что именно вы реализовали. Меня сейчас интересовала не императивная, а декларативная часть вашей работы.

======

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

И это была самая настоящая, физическая релейная логика, на самых настоящих реле. И она - зацикливалась.

Поскольку математику я знал куда лучше, чем электронику, я легко пришёл к тем самым "логическим цепочкам". И это помогло мне понять связь между императивной логикой и логикой булевой, а в будущем легко понять всякие там <a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%B7%D1%8A%D1%8E%D0%BD%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BD%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B8%25D0%25B7%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGoyWwIDQlFrwWl9nkNYHWwCvtAtw';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B8%25D0%25B7%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGoyWwIDQlFrwWl9nkNYHWwCvtAtw';return true;">ДНФ и <a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%8A%D1%8E%D0%BD%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BD%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%259A%25D0%25BE%25D0%25BD%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGTy9WZIQMiSeLgsPbmxUfOy69cew';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%259A%25D0%25BE%25D0%25BD%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGTy9WZIQMiSeLgsPbmxUfOy69cew';return true;">КНФ и даже конечные автоматы. В общем, опыт был полезный.

Так вот, вопрос: схемы, построенные в FLProg, могут зацикливаться?
Это не единственный вопрос, относящийся к фазам вычислений, но с него проще всего начать.

Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

======

P.S. Обращу, кстати, внимание: перескок с задачи на её реализацию - это такая достаточно показательная вещь. Для вас, видимо, "как сделать" и "что сделать" - очень близкие вещи, тогда как на самом деле это не совсем так. Но это тема для отдельного разговора. Хотя две ссылки я всё же приведу:

<a href="https://ru.wikipedia.org/wiki/%D0%98%D0%BC%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2598%25D0%25BC%25D0%25BF%25D0%25B5%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNF5yT_W1tYkmx_qz8DAY8OB5cmjhg';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2598%25D0%25BC%25D0%25BF%25D0%25B5%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNF5yT_W1tYkmx_qz8DAY8OB5cmjhg';return true;">Википедия: Императивное программирование
<a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BA%D0%BB%D0%B0%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B5%25D0%25BA%25D0%25BB%25D0%25B0%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNGMApeHNnII_LY7EVzyuHWX2I0NTA';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B5%25D0%25BA%25D0%25BB%25D0%25B0%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNGMApeHNnII_LY7EVzyuHWX2I0NTA';return true;">Википедия: Декларативное программирование

14 января 2015 г., 8:03 пользователь Сергей Глушенко <[hidden email]> написал:

Это и было самое сложное в разработке проекта. Как преобразовать графическое представление схемы в код для контроллера. Тут требуется немного предыстории.
Основная идея была создать аналог сред программирования для промышленных (безумно дорогих) контролеров на дешёвые ардуинки. За базу я взял программу TiaPortal от Siemens. У них такая идеология: Вся схема разбивается на отдельные Nenwork - и. В каждом нетворке возможна только одна логическая цепочка. То есть один конечный элемент. Это может быть реле, переменная или что то еще. В общем какой - то объект в который производится запись. И схема которая собирает значение для записи. При компиляции каждый нетворк представляет одну строку конечного кода. Такого алгоритма придерживаются и остальные производители. С него начинал и я. Следы этого остались в проекте, у меня название класса описывающего плату Network. НО. Я разрабатываю проект как среду для электриков, электронщиков, да и просто любителей. Концепция логических цепочек для них тяжела. Я сам прошол путь от простого электрика - до ведущего разработчика, так что могу представить себя в шкуре любого из них. Для них понятно название "плата". То есть какой -то законченный кусок схемы выполняющий определенные функции. А на плате может быть несколько релюшек, лампочек, да и в конце концов просто выходов для связи с другими платами. Еще одна засада. Для реализации какого то блока чаще всего недостаточно только описать строкой состояние его входа. Например для блока дисплея необходимо его задекларировать, инициализировать, подключить библиотеку, в нужный момент вывести требуемый текст, да еще и определить нет ли необходимости его очистить. Это разный код в разных частях скетча.  Так что существующий алгоритм не подходил. Я пости два месяца (точнее четыре с учетом что работаю над проектом я только на вахте) я придумывал новы, свой алгоритм. В принципе это и есть моё как говорится ноу - хау. Не хочу его полностью раскрывать, но коротко могу. Я разработал собственный алгоритм разбиения схемы на куски, и систему взаимодействия схемы и компилятора. Схема и блоки обладают определенным набором интерфейсов с которыми работает компилятор. Схема умеет себя отдавать компилятору в наиболее удобном для него виде (умная женщина, мне бы такую жену))) ).Так же блоки умеют правильно отвечать на вопросы компилятора. Реализация получилась удачной. Об этом свидетельствует то, что почти за год существования проекта мне ни разу не пришлось изменять ее. Интерфейс схемы я вообще не трогал ни разу. Иногда добавляется интерфейс блоков, когда компилятору требуется каки - е то дополнительные данные от них для реализации той или иной функции. Наверное об этом и все. Больше я об этом пока ничего не раскажу Вредный я)))))

среда, 14 января 2015 г., 1:56:01 UTC+5 пользователь Assargadon написал:
Так, теперь более...глубинный вопрос.

Как организована работа с...эээ...фазой вычислений, что ли. Когда несколько виртуальных элементов стоят каскадом, то ведь всегда возникает вопрос синхронизации. Я довольно слабо представляю себе детали, но знаю, что такое явление есть.

Прокомментируете поподробнее?

13 января 2015 г., 1:47 пользователь Сергей Глушенко <[hidden email]> написал:
Большое спасибо за помощь проекту. Кстати как раз выпустил новую версию. Скорее всего следующая будет не скоро, 15-го уезжаю домой, а дома почти сразу с семьей едем в Питер. Так что продолжения придется немного подождать. Но я буду на связи, у меня телефон умный)))

среда, 7 января 2015 г., 14:29:18 UTC+5 пользователь Assargadon написал:
Вопрос первый: а есть какая-нибудь возможность получить версию под Linux? У cincom была, насколько я помню, линуксовая VMка, так что это не должно быть слишком сложно.

Вопрос второй: FLProg на выходе генерирует каноничный C-код, или богомерзкие скетчи на этом их внутреннем ардуиновском недоСи?

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="yUPHAqaDQPoJ" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Вопросы о FLProg

Yuriy Mironenko
Сергей, я прекрасно понял эту часть ваших слов, хотя за картинку спасибо. Мне просто как раз было интересно, для "управления фазой" вы использовали таблицу состояний, функциональные извращения или просто забили. Просто в начале вы сказали, что 

Код который получится в скетче (без учета синтсиса так для примера)
out = (pin2 XOR (pin1 XOR pin2)); 
так что все будет нормально

и это меня сбило, поскольку противоречило последующим словам. И я не был уверен, какой же из двух озвученных вами вариантов имеет место на самом деле :) Ну, теперь знаю. Спасибо.



14 января 2015 г., 13:56 пользователь Сергей Глушенко <[hidden email]> написал:

Ключевая фраза

Достаточно в любом месте программы счтать значение железного входа в переменную...
..
 Я как раз сказал что в вашем случае вероятность того что на вход первого придет не то же значение что и второго в принципе возможна.
digitalRead (1)   это чтение состояние ноги контроллера. И да если в течении выполнения первого XORнапряжение на ноге изменится то при следующем чтении значение будет другим. Поэтому я и рекомендовал в случае критичности такой ситуации прочитать значение входа в переменную и использовать ее.
 У меня что то плохо получается вставлять картинки сюда, она вставилась в самый верх сообщения. Попробуйте собрать такую схему и посмотрите что получится в результате. Вот там точно значения не изменятся.







среда, 14 января 2015 г., 15:45:46 UTC+5 пользователь Assargadon написал:
хоть и расчет XOR занимает наносекунды

Это как раз неважно. Там же может и не XOR стоять. Там может стоять цепочка в 100500 логических элементов, или ещё что-нибудь посложнее.


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

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

Поэтому я сгенерировал скетч, и вижу там
digitalWrite(2,  ( ( (digitalRead (1))) ^ ( (digitalRead (4))) ) ^ ( (digitalRead (4))) );
Я так понимаю, digitalRead - это чтение бита из порта, а не из буфера. То есть, как я понимаю, на вход второго XOR'а может попасть не тот бит, который попал на первый XOR. Поправьте, если я ошибся.


14 января 2015 г., 12:36 пользователь Сергей Глушенко <[hidden email]> написал:

Нормально - это конечно когда разные сигналы придти не могут. В Вашем примере это в принципе возможно. Хоть и расчет XOR занимает наносекунды в принципе есть вероятность того что за это время состояние входа изменится. Я об этой возможности рассказывал в первых видеоуроках. Так же давал решение для тех коому этот вопрос важен. Достаточно в любом месте программы счтать значение железного входа в переменную, и использовать эти переменные в программе. Тогда в течении скана программы значение этих переменных не изменится. Вообще все эти вопросы решает подход с использованием принципа образа процесса. То есть в начале скана все входа контроллера считываются в переменные, в процессе скана работа ведется только с ними. результаты работы заносятся в переменные. В конце скана полученные результаты записываются в железные выхода. Но такой подход требует выделения дополнительной памяти под образ процесса. А у ардуино ее и так немного. Поэтому я отказался от такого подхода.

среда, 14 января 2015 г., 13:34:15 UTC+5 пользователь Assargadon написал:
так что все будет нормально

Сергей, так в этом же и вопрос.
Для вас "нормально" - это как именно? :)

Нормально - это когда на вход первого и второго XOR'а могут придти разные биты? Или когда они не могут оказаться разными?

14 января 2015 г., 11:17 пользователь Сергей Глушенко <[hidden email]> написал:

Я для этих функций использую виндовые ножница. Безумно удобно. Но у Вас насколько я помно линукс. Печалька....
А теперь серьезно.


среда, 14 января 2015 г., 13:08:54 UTC+5 пользователь Assargadon написал:
Ок. Зацикливаться может.

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

out = (pin2 XOR (pin1 XOR pin2));
так что все будет нормально



Вот в такой схеме - может ли быть так, что на нижний вход второго XOR'а поступит не то значение, которое поступало на нижний вход первого XOR'а, потому что, за время пока вычислялся первый XOR, значение на ноге успело измениться?

14 января 2015 г., 10:37 пользователь Сергей Глушенко <[hidden email]> написал:

Наверное все таки сказывается отсутствие у меня настоящего академического образования. У меня нет вышки, и как там в фильме говорится "Я консирваториев не заканчивал". Посмотрел статьи по вашим сылкам. Честно скажу - ни.... не понял.
Что я реализовал?..... Даже не знаю как ответить. Ну наверное в общих словах компиляцию схемы в скетчь. И все.
    Я действительно когда начинаю работать над новым функционалом не знаю что получится в конце. Первый шаг - реализовать эту функцию в ArduinoIDE что бы понять что это вообще возможно. После этого приступаю к реализации в коде привязываясь к существующей архитектуре. Я почти никогда не продумываю реализацию задачи заранее. Мой подход - "код покажет". Во время работы над проектом Cadel вместе с Vladimir Musulainen у нас проводился анализ задачи с разбиением на карточки,  продумыванием архитектуры и т.д. Но самое смешное что примерно в половине случаев конечная реализация сильно отличалась от задуманного. По разным причинам. Но там это было нужно для разбиения задач по участнигам группы, и расчета ориентировочного времени на реализацию. Поскольку я работаю один и учета времени от меня никто не требует в своей работе я исключил этот этап. Жалко тратить на него время.
 Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

Да можно. Частота генерации будет зависеть от тактовой частоты контроллеа и времени выполнения скана программы. Если есть интерес я могу рассказать о модели выполнения программы в микроконтроллере, и отличия ее от событийной модели в компьютере.

среда, 14 января 2015 г., 12:02:31 UTC+5 пользователь Assargadon написал:
Сергей, вот вы начали про то, что я спросил, а потом переключились на реализацию. Рассказ про реализацию довольно интересен и познавателен, но это немного не то, о чём я спрашивал.

Я хотел узнать не то, как вы реализовали, а что именно вы реализовали. Меня сейчас интересовала не императивная, а декларативная часть вашей работы.

======

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

И это была самая настоящая, физическая релейная логика, на самых настоящих реле. И она - зацикливалась.

Поскольку математику я знал куда лучше, чем электронику, я легко пришёл к тем самым "логическим цепочкам". И это помогло мне понять связь между императивной логикой и логикой булевой, а в будущем легко понять всякие там ДНФ и КНФ и даже конечные автоматы. В общем, опыт был полезный.

Так вот, вопрос: схемы, построенные в FLProg, могут зацикливаться?
Это не единственный вопрос, относящийся к фазам вычислений, но с него проще всего начать.

Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

======

P.S. Обращу, кстати, внимание: перескок с задачи на её реализацию - это такая достаточно показательная вещь. Для вас, видимо, "как сделать" и "что сделать" - очень близкие вещи, тогда как на самом деле это не совсем так. Но это тема для отдельного разговора. Хотя две ссылки я всё же приведу:

Википедия: Императивное программирование
Википедия: Декларативное программирование

14 января 2015 г., 8:03 пользователь Сергей Глушенко <[hidden email]> написал:

Это и было самое сложное в разработке проекта. Как преобразовать графическое представление схемы в код для контроллера. Тут требуется немного предыстории.
Основная идея была создать аналог сред программирования для промышленных (безумно дорогих) контролеров на дешёвые ардуинки. За базу я взял программу TiaPortal от Siemens. У них такая идеология: Вся схема разбивается на отдельные Nenwork - и. В каждом нетворке возможна только одна логическая цепочка. То есть один конечный элемент. Это может быть реле, переменная или что то еще. В общем какой - то объект в который производится запись. И схема которая собирает значение для записи. При компиляции каждый нетворк представляет одну строку конечного кода. Такого алгоритма придерживаются и остальные производители. С него начинал и я. Следы этого остались в проекте, у меня название класса описывающего плату Network. НО. Я разрабатываю проект как среду для электриков, электронщиков, да и просто любителей. Концепция логических цепочек для них тяжела. Я сам прошол путь от простого электрика - до ведущего разработчика, так что могу представить себя в шкуре любого из них. Для них понятно название "плата". То есть какой -то законченный кусок схемы выполняющий определенные функции. А на плате может быть несколько релюшек, лампочек, да и в конце концов просто выходов для связи с другими платами. Еще одна засада. Для реализации какого то блока чаще всего недостаточно только описать строкой состояние его входа. Например для блока дисплея необходимо его задекларировать, инициализировать, подключить библиотеку, в нужный момент вывести требуемый текст, да еще и определить нет ли необходимости его очистить. Это разный код в разных частях скетча.  Так что существующий алгоритм не подходил. Я пости два месяца (точнее четыре с учетом что работаю над проектом я только на вахте) я придумывал новы, свой алгоритм. В принципе это и есть моё как говорится ноу - хау. Не хочу его полностью раскрывать, но коротко могу. Я разработал собственный алгоритм разбиения схемы на куски, и систему взаимодействия схемы и компилятора. Схема и блоки обладают определенным набором интерфейсов с которыми работает компилятор. Схема умеет себя отдавать компилятору в наиболее удобном для него виде (умная женщина, мне бы такую жену))) ).Так же блоки умеют правильно отвечать на вопросы компилятора. Реализация получилась удачной. Об этом свидетельствует то, что почти за год существования проекта мне ни разу не пришлось изменять ее. Интерфейс схемы я вообще не трогал ни разу. Иногда добавляется интерфейс блоков, когда компилятору требуется каки - е то дополнительные данные от них для реализации той или иной функции. Наверное об этом и все. Больше я об этом пока ничего не раскажу Вредный я)))))

среда, 14 января 2015 г., 1:56:01 UTC+5 пользователь Assargadon написал:
Так, теперь более...глубинный вопрос.

Как организована работа с...эээ...фазой вычислений, что ли. Когда несколько виртуальных элементов стоят каскадом, то ведь всегда возникает вопрос синхронизации. Я довольно слабо представляю себе детали, но знаю, что такое явление есть.

Прокомментируете поподробнее?

13 января 2015 г., 1:47 пользователь Сергей Глушенко <[hidden email]> написал:
Большое спасибо за помощь проекту. Кстати как раз выпустил новую версию. Скорее всего следующая будет не скоро, 15-го уезжаю домой, а дома почти сразу с семьей едем в Питер. Так что продолжения придется немного подождать. Но я буду на связи, у меня телефон умный)))

среда, 7 января 2015 г., 14:29:18 UTC+5 пользователь Assargadon написал:
Вопрос первый: а есть какая-нибудь возможность получить версию под Linux? У cincom была, насколько я помню, линуксовая VMка, так что это не должно быть слишком сложно.

Вопрос второй: FLProg на выходе генерирует каноничный C-код, или богомерзкие скетчи на этом их внутреннем ардуиновском недоСи?

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Вопросы о FLProg

Сергей Глушенко
Да в первом ответе я немного ошибся. Не сообразил что Вы использовали входа а не переменные. После Вашего комментария я понял ошибку, и постарался объяснить ситуацию. К сожалению из меня объясняльщик не очень, но я над собой работаю)))). Правда теперь я немного не понял. Что Вы имеете в виду под "Управлением фазой". Вроде слово фаза я нигде не использовал.

среда, 14 января 2015 г., 16:04:59 UTC+5 пользователь Assargadon написал:
Сергей, я прекрасно понял эту часть ваших слов, хотя за картинку спасибо. Мне просто как раз было интересно, для "управления фазой" вы использовали таблицу состояний, функциональные извращения или просто забили. Просто в начале вы сказали, что 

Код который получится в скетче (без учета синтсиса так для примера)
out = (pin2 XOR (pin1 XOR pin2)); 
так что все будет нормально

и это меня сбило, поскольку противоречило последующим словам. И я не был уверен, какой же из двух озвученных вами вариантов имеет место на самом деле :) Ну, теперь знаю. Спасибо.



14 января 2015 г., 13:56 пользователь Сергей Глушенко <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="iRjaiDE1cHUJ" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">sup...@...> написал:

<a style="margin-left:1em;margin-right:1em" href="https://lh3.googleusercontent.com/-i-O5WkeL2gs/VLZK6T0v1HI/AAAAAAAAAC8/dDduKcAvb-0/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA12345678.PNG" target="_blank" onmousedown="this.href='https://lh3.googleusercontent.com/-i-O5WkeL2gs/VLZK6T0v1HI/AAAAAAAAAC8/dDduKcAvb-0/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA12345678.PNG';return true;" onclick="this.href='https://lh3.googleusercontent.com/-i-O5WkeL2gs/VLZK6T0v1HI/AAAAAAAAAC8/dDduKcAvb-0/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA12345678.PNG';return true;">

Ключевая фраза

Достаточно в любом месте программы счтать значение железного входа в переменную...
..
 Я как раз сказал что в вашем случае вероятность того что на вход первого придет не то же значение что и второго в принципе возможна.
digitalRead (1)   это чтение состояние ноги контроллера. И да если в течении выполнения первого XORнапряжение на ноге изменится то при следующем чтении значение будет другим. Поэтому я и рекомендовал в случае критичности такой ситуации прочитать значение входа в переменную и использовать ее.
 У меня что то плохо получается вставлять картинки сюда, она вставилась в самый верх сообщения. Попробуйте собрать такую схему и посмотрите что получится в результате. Вот там точно значения не изменятся.







среда, 14 января 2015 г., 15:45:46 UTC+5 пользователь Assargadon написал:
хоть и расчет XOR занимает наносекунды

Это как раз неважно. Там же может и не XOR стоять. Там может стоять цепочка в 100500 логических элементов, или ещё что-нибудь посложнее.


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

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

Поэтому я сгенерировал скетч, и вижу там
digitalWrite(2,  ( ( (digitalRead (1))) ^ ( (digitalRead (4))) ) ^ ( (digitalRead (4))) );
Я так понимаю, digitalRead - это чтение бита из порта, а не из буфера. То есть, как я понимаю, на вход второго XOR'а может попасть не тот бит, который попал на первый XOR. Поправьте, если я ошибся.


14 января 2015 г., 12:36 пользователь Сергей Глушенко <[hidden email]> написал:

Нормально - это конечно когда разные сигналы придти не могут. В Вашем примере это в принципе возможно. Хоть и расчет XOR занимает наносекунды в принципе есть вероятность того что за это время состояние входа изменится. Я об этой возможности рассказывал в первых видеоуроках. Так же давал решение для тех коому этот вопрос важен. Достаточно в любом месте программы счтать значение железного входа в переменную, и использовать эти переменные в программе. Тогда в течении скана программы значение этих переменных не изменится. Вообще все эти вопросы решает подход с использованием принципа образа процесса. То есть в начале скана все входа контроллера считываются в переменные, в процессе скана работа ведется только с ними. результаты работы заносятся в переменные. В конце скана полученные результаты записываются в железные выхода. Но такой подход требует выделения дополнительной памяти под образ процесса. А у ардуино ее и так немного. Поэтому я отказался от такого подхода.

среда, 14 января 2015 г., 13:34:15 UTC+5 пользователь Assargadon написал:
так что все будет нормально

Сергей, так в этом же и вопрос.
Для вас "нормально" - это как именно? :)

Нормально - это когда на вход первого и второго XOR'а могут придти разные биты? Или когда они не могут оказаться разными?

14 января 2015 г., 11:17 пользователь Сергей Глушенко <[hidden email]> написал:

Я для этих функций использую виндовые ножница. Безумно удобно. Но у Вас насколько я помно линукс. Печалька....
А теперь серьезно.


среда, 14 января 2015 г., 13:08:54 UTC+5 пользователь Assargadon написал:
Ок. Зацикливаться может.

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

out = (pin2 XOR (pin1 XOR pin2));
так что все будет нормально



Вот в такой схеме - может ли быть так, что на нижний вход второго XOR'а поступит не то значение, которое поступало на нижний вход первого XOR'а, потому что, за время пока вычислялся первый XOR, значение на ноге успело измениться?

14 января 2015 г., 10:37 пользователь Сергей Глушенко <[hidden email]> написал:

Наверное все таки сказывается отсутствие у меня настоящего академического образования. У меня нет вышки, и как там в фильме говорится "Я консирваториев не заканчивал". Посмотрел статьи по вашим сылкам. Честно скажу - ни.... не понял.
Что я реализовал?..... Даже не знаю как ответить. Ну наверное в общих словах компиляцию схемы в скетчь. И все.
    Я действительно когда начинаю работать над новым функционалом не знаю что получится в конце. Первый шаг - реализовать эту функцию в ArduinoIDE что бы понять что это вообще возможно. После этого приступаю к реализации в коде привязываясь к существующей архитектуре. Я почти никогда не продумываю реализацию задачи заранее. Мой подход - "код покажет". Во время работы над проектом Cadel вместе с Vladimir Musulainen у нас проводился анализ задачи с разбиением на карточки,  продумыванием архитектуры и т.д. Но самое смешное что примерно в половине случаев конечная реализация сильно отличалась от задуманного. По разным причинам. Но там это было нужно для разбиения задач по участнигам группы, и расчета ориентировочного времени на реализацию. Поскольку я работаю один и учета времени от меня никто не требует в своей работе я исключил этот этап. Жалко тратить на него время.
 Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

Да можно. Частота генерации будет зависеть от тактовой частоты контроллеа и времени выполнения скана программы. Если есть интерес я могу рассказать о модели выполнения программы в микроконтроллере, и отличия ее от событийной модели в компьютере.

среда, 14 января 2015 г., 12:02:31 UTC+5 пользователь Assargadon написал:
Сергей, вот вы начали про то, что я спросил, а потом переключились на реализацию. Рассказ про реализацию довольно интересен и познавателен, но это немного не то, о чём я спрашивал.

Я хотел узнать не то, как вы реализовали, а что именно вы реализовали. Меня сейчас интересовала не императивная, а декларативная часть вашей работы.

======

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

И это была самая настоящая, физическая релейная логика, на самых настоящих реле. И она - зацикливалась.

Поскольку математику я знал куда лучше, чем электронику, я легко пришёл к тем самым "логическим цепочкам". И это помогло мне понять связь между императивной логикой и логикой булевой, а в будущем легко понять всякие там <a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%B7%D1%8A%D1%8E%D0%BD%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BD%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B8%25D0%25B7%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGoyWwIDQlFrwWl9nkNYHWwCvtAtw';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B8%25D0%25B7%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGoyWwIDQlFrwWl9nkNYHWwCvtAtw';return true;">ДНФ и <a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%8A%D1%8E%D0%BD%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BD%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%259A%25D0%25BE%25D0%25BD%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGTy9WZIQMiSeLgsPbmxUfOy69cew';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%259A%25D0%25BE%25D0%25BD%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGTy9WZIQMiSeLgsPbmxUfOy69cew';return true;">КНФ и даже конечные автоматы. В общем, опыт был полезный.

Так вот, вопрос: схемы, построенные в FLProg, могут зацикливаться?
Это не единственный вопрос, относящийся к фазам вычислений, но с него проще всего начать.

Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

======

P.S. Обращу, кстати, внимание: перескок с задачи на её реализацию - это такая достаточно показательная вещь. Для вас, видимо, "как сделать" и "что сделать" - очень близкие вещи, тогда как на самом деле это не совсем так. Но это тема для отдельного разговора. Хотя две ссылки я всё же приведу:

<a href="https://ru.wikipedia.org/wiki/%D0%98%D0%BC%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2598%25D0%25BC%25D0%25BF%25D0%25B5%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNF5yT_W1tYkmx_qz8DAY8OB5cmjhg';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2598%25D0%25BC%25D0%25BF%25D0%25B5%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNF5yT_W1tYkmx_qz8DAY8OB5cmjhg';return true;">Википедия: Императивное программирование
<a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BA%D0%BB%D0%B0%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B5%25D0%25BA%25D0%25BB%25D0%25B0%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNGMApeHNnII_LY7EVzyuHWX2I0NTA';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B5%25D0%25BA%25D0%25BB%25D0%25B0%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNGMApeHNnII_LY7EVzyuHWX2I0NTA';return true;">Википедия: Декларативное программирование

14 января 2015 г., 8:03 пользователь Сергей Глушенко <[hidden email]> написал:

Это и было самое сложное в разработке проекта. Как преобразовать графическое представление схемы в код для контроллера. Тут требуется немного предыстории.
Основная идея была создать аналог сред программирования для промышленных (безумно дорогих) контролеров на дешёвые ардуинки. За базу я взял программу TiaPortal от Siemens. У них такая идеология: Вся схема разбивается на отдельные Nenwork - и. В каждом нетворке возможна только одна логическая цепочка. То есть один конечный элемент. Это может быть реле, переменная или что то еще. В общем какой - то объект в который производится запись. И схема которая собирает значение для записи. При компиляции каждый нетворк представляет одну строку конечного кода. Такого алгоритма придерживаются и остальные производители. С него начинал и я. Следы этого остались в проекте, у меня название класса описывающего плату Network. НО. Я разрабатываю проект как среду для электриков, электронщиков, да и просто любителей. Концепция логических цепочек для них тяжела. Я сам прошол путь от простого электрика - до ведущего разработчика, так что могу представить себя в шкуре любого из них. Для них понятно название "плата". То есть какой -то законченный кусок схемы выполняющий определенные функции. А на плате может быть несколько релюшек, лампочек, да и в конце концов просто выходов для связи с другими платами. Еще одна засада. Для реализации какого то блока чаще всего недостаточно только описать строкой состояние его входа. Например для блока дисплея необходимо его задекларировать, инициализировать, подключить библиотеку, в нужный момент вывести требуемый текст, да еще и определить нет ли необходимости его очистить. Это разный код в разных частях скетча.  Так что существующий алгоритм не подходил. Я пости два месяца (точнее четыре с учетом что работаю над проектом я только на вахте) я придумывал новы, свой алгоритм. В принципе это и есть моё как говорится ноу - хау. Не хочу его полностью раскрывать, но коротко могу. Я разработал собственный алгоритм разбиения схемы на куски, и систему взаимодействия схемы и компилятора. Схема и блоки обладают определенным набором интерфейсов с которыми работает компилятор. Схема умеет себя отдавать компилятору в наиболее удобном для него виде (умная женщина, мне бы такую жену))) ).Так же блоки умеют правильно отвечать на вопросы компилятора. Реализация получилась удачной. Об этом свидетельствует то, что почти за год существования проекта мне ни разу не пришлось изменять ее. Интерфейс схемы я вообще не трогал ни разу. Иногда добавляется интерфейс блоков, когда компилятору требуется каки - е то дополнительные данные от них для реализации той или иной функции. Наверное об этом и все. Больше я об этом пока ничего не раскажу Вредный я)))))

среда, 14 января 2015 г., 1:56:01 UTC+5 пользователь Assargadon написал:
Так, теперь более...глубинный вопрос.

Как организована работа с...эээ...фазой вычислений, что ли. Когда несколько виртуальных элементов стоят каскадом, то ведь всегда возникает вопрос синхронизации. Я довольно слабо представляю себе детали, но знаю, что такое явление есть.

Прокомментируете поподробнее?

13 января 2015 г., 1:47 пользователь Сергей Глушенко <[hidden email]> написал:
Большое спасибо за помощь проекту. Кстати как раз выпустил новую версию. Скорее всего следующая будет не скоро, 15-го уезжаю домой, а дома почти сразу с семьей едем в Питер. Так что продолжения придется немного подождать. Но я буду на связи, у меня телефон умный)))

среда, 7 января 2015 г., 14:29:18 UTC+5 пользователь Assargadon написал:
Вопрос первый: а есть какая-нибудь возможность получить версию под Linux? У cincom была, насколько я помню, линуксовая VMка, так что это не должно быть слишком сложно.

Вопрос второй: FLProg на выходе генерирует каноничный C-код, или богомерзкие скетчи на этом их внутреннем ардуиновском недоСи?

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="iRjaiDE1cHUJ" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Вопросы о FLProg

Yuriy Mironenko
Вроде слово фаза я нигде не использовал.

Да, его использовал я. Не знаю, как в точности это называется.

Смысл явления в том, что на срабатывание каждого элемента необходимо определенное время. Соответственно, изменения состояния "распространяются" от входов своеобразной "волной", и эта "волна" достигает разных элементов в разное время. Именно благодаря этому системы из реле могут зацикливаться и работать как генераторы. Вот это я и называю "фазой".

Смысл выделения отдельных цепочек в логических контроллерах как раз ровно в этом - борьба с биениями выходов, исключение циклов.

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

14 января 2015 г., 14:11 пользователь Сергей Глушенко <[hidden email]> написал:
Да в первом ответе я немного ошибся. Не сообразил что Вы использовали входа а не переменные. После Вашего комментария я понял ошибку, и постарался объяснить ситуацию. К сожалению из меня объясняльщик не очень, но я над собой работаю)))). Правда теперь я немного не понял. Что Вы имеете в виду под "Управлением фазой". Вроде слово фаза я нигде не использовал.

среда, 14 января 2015 г., 16:04:59 UTC+5 пользователь Assargadon написал:
Сергей, я прекрасно понял эту часть ваших слов, хотя за картинку спасибо. Мне просто как раз было интересно, для "управления фазой" вы использовали таблицу состояний, функциональные извращения или просто забили. Просто в начале вы сказали, что 

Код который получится в скетче (без учета синтсиса так для примера)
out = (pin2 XOR (pin1 XOR pin2)); 
так что все будет нормально

и это меня сбило, поскольку противоречило последующим словам. И я не был уверен, какой же из двух озвученных вами вариантов имеет место на самом деле :) Ну, теперь знаю. Спасибо.



14 января 2015 г., 13:56 пользователь Сергей Глушенко <[hidden email]> написал:

Ключевая фраза

Достаточно в любом месте программы счтать значение железного входа в переменную...
..
 Я как раз сказал что в вашем случае вероятность того что на вход первого придет не то же значение что и второго в принципе возможна.
digitalRead (1)   это чтение состояние ноги контроллера. И да если в течении выполнения первого XORнапряжение на ноге изменится то при следующем чтении значение будет другим. Поэтому я и рекомендовал в случае критичности такой ситуации прочитать значение входа в переменную и использовать ее.
 У меня что то плохо получается вставлять картинки сюда, она вставилась в самый верх сообщения. Попробуйте собрать такую схему и посмотрите что получится в результате. Вот там точно значения не изменятся.







среда, 14 января 2015 г., 15:45:46 UTC+5 пользователь Assargadon написал:
хоть и расчет XOR занимает наносекунды

Это как раз неважно. Там же может и не XOR стоять. Там может стоять цепочка в 100500 логических элементов, или ещё что-нибудь посложнее.


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

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

Поэтому я сгенерировал скетч, и вижу там
digitalWrite(2,  ( ( (digitalRead (1))) ^ ( (digitalRead (4))) ) ^ ( (digitalRead (4))) );
Я так понимаю, digitalRead - это чтение бита из порта, а не из буфера. То есть, как я понимаю, на вход второго XOR'а может попасть не тот бит, который попал на первый XOR. Поправьте, если я ошибся.


14 января 2015 г., 12:36 пользователь Сергей Глушенко <[hidden email]> написал:

Нормально - это конечно когда разные сигналы придти не могут. В Вашем примере это в принципе возможно. Хоть и расчет XOR занимает наносекунды в принципе есть вероятность того что за это время состояние входа изменится. Я об этой возможности рассказывал в первых видеоуроках. Так же давал решение для тех коому этот вопрос важен. Достаточно в любом месте программы счтать значение железного входа в переменную, и использовать эти переменные в программе. Тогда в течении скана программы значение этих переменных не изменится. Вообще все эти вопросы решает подход с использованием принципа образа процесса. То есть в начале скана все входа контроллера считываются в переменные, в процессе скана работа ведется только с ними. результаты работы заносятся в переменные. В конце скана полученные результаты записываются в железные выхода. Но такой подход требует выделения дополнительной памяти под образ процесса. А у ардуино ее и так немного. Поэтому я отказался от такого подхода.

среда, 14 января 2015 г., 13:34:15 UTC+5 пользователь Assargadon написал:
так что все будет нормально

Сергей, так в этом же и вопрос.
Для вас "нормально" - это как именно? :)

Нормально - это когда на вход первого и второго XOR'а могут придти разные биты? Или когда они не могут оказаться разными?

14 января 2015 г., 11:17 пользователь Сергей Глушенко <[hidden email]> написал:

Я для этих функций использую виндовые ножница. Безумно удобно. Но у Вас насколько я помно линукс. Печалька....
А теперь серьезно.


среда, 14 января 2015 г., 13:08:54 UTC+5 пользователь Assargadon написал:
Ок. Зацикливаться может.

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

out = (pin2 XOR (pin1 XOR pin2));
так что все будет нормально



Вот в такой схеме - может ли быть так, что на нижний вход второго XOR'а поступит не то значение, которое поступало на нижний вход первого XOR'а, потому что, за время пока вычислялся первый XOR, значение на ноге успело измениться?

14 января 2015 г., 10:37 пользователь Сергей Глушенко <[hidden email]> написал:

Наверное все таки сказывается отсутствие у меня настоящего академического образования. У меня нет вышки, и как там в фильме говорится "Я консирваториев не заканчивал". Посмотрел статьи по вашим сылкам. Честно скажу - ни.... не понял.
Что я реализовал?..... Даже не знаю как ответить. Ну наверное в общих словах компиляцию схемы в скетчь. И все.
    Я действительно когда начинаю работать над новым функционалом не знаю что получится в конце. Первый шаг - реализовать эту функцию в ArduinoIDE что бы понять что это вообще возможно. После этого приступаю к реализации в коде привязываясь к существующей архитектуре. Я почти никогда не продумываю реализацию задачи заранее. Мой подход - "код покажет". Во время работы над проектом Cadel вместе с Vladimir Musulainen у нас проводился анализ задачи с разбиением на карточки,  продумыванием архитектуры и т.д. Но самое смешное что примерно в половине случаев конечная реализация сильно отличалась от задуманного. По разным причинам. Но там это было нужно для разбиения задач по участнигам группы, и расчета ориентировочного времени на реализацию. Поскольку я работаю один и учета времени от меня никто не требует в своей работе я исключил этот этап. Жалко тратить на него время.
 Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

Да можно. Частота генерации будет зависеть от тактовой частоты контроллеа и времени выполнения скана программы. Если есть интерес я могу рассказать о модели выполнения программы в микроконтроллере, и отличия ее от событийной модели в компьютере.

среда, 14 января 2015 г., 12:02:31 UTC+5 пользователь Assargadon написал:
Сергей, вот вы начали про то, что я спросил, а потом переключились на реализацию. Рассказ про реализацию довольно интересен и познавателен, но это немного не то, о чём я спрашивал.

Я хотел узнать не то, как вы реализовали, а что именно вы реализовали. Меня сейчас интересовала не императивная, а декларативная часть вашей работы.

======

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

И это была самая настоящая, физическая релейная логика, на самых настоящих реле. И она - зацикливалась.

Поскольку математику я знал куда лучше, чем электронику, я легко пришёл к тем самым "логическим цепочкам". И это помогло мне понять связь между императивной логикой и логикой булевой, а в будущем легко понять всякие там ДНФ и КНФ и даже конечные автоматы. В общем, опыт был полезный.

Так вот, вопрос: схемы, построенные в FLProg, могут зацикливаться?
Это не единственный вопрос, относящийся к фазам вычислений, но с него проще всего начать.

Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

======

P.S. Обращу, кстати, внимание: перескок с задачи на её реализацию - это такая достаточно показательная вещь. Для вас, видимо, "как сделать" и "что сделать" - очень близкие вещи, тогда как на самом деле это не совсем так. Но это тема для отдельного разговора. Хотя две ссылки я всё же приведу:

Википедия: Императивное программирование
Википедия: Декларативное программирование

14 января 2015 г., 8:03 пользователь Сергей Глушенко <[hidden email]> написал:

Это и было самое сложное в разработке проекта. Как преобразовать графическое представление схемы в код для контроллера. Тут требуется немного предыстории.
Основная идея была создать аналог сред программирования для промышленных (безумно дорогих) контролеров на дешёвые ардуинки. За базу я взял программу TiaPortal от Siemens. У них такая идеология: Вся схема разбивается на отдельные Nenwork - и. В каждом нетворке возможна только одна логическая цепочка. То есть один конечный элемент. Это может быть реле, переменная или что то еще. В общем какой - то объект в который производится запись. И схема которая собирает значение для записи. При компиляции каждый нетворк представляет одну строку конечного кода. Такого алгоритма придерживаются и остальные производители. С него начинал и я. Следы этого остались в проекте, у меня название класса описывающего плату Network. НО. Я разрабатываю проект как среду для электриков, электронщиков, да и просто любителей. Концепция логических цепочек для них тяжела. Я сам прошол путь от простого электрика - до ведущего разработчика, так что могу представить себя в шкуре любого из них. Для них понятно название "плата". То есть какой -то законченный кусок схемы выполняющий определенные функции. А на плате может быть несколько релюшек, лампочек, да и в конце концов просто выходов для связи с другими платами. Еще одна засада. Для реализации какого то блока чаще всего недостаточно только описать строкой состояние его входа. Например для блока дисплея необходимо его задекларировать, инициализировать, подключить библиотеку, в нужный момент вывести требуемый текст, да еще и определить нет ли необходимости его очистить. Это разный код в разных частях скетча.  Так что существующий алгоритм не подходил. Я пости два месяца (точнее четыре с учетом что работаю над проектом я только на вахте) я придумывал новы, свой алгоритм. В принципе это и есть моё как говорится ноу - хау. Не хочу его полностью раскрывать, но коротко могу. Я разработал собственный алгоритм разбиения схемы на куски, и систему взаимодействия схемы и компилятора. Схема и блоки обладают определенным набором интерфейсов с которыми работает компилятор. Схема умеет себя отдавать компилятору в наиболее удобном для него виде (умная женщина, мне бы такую жену))) ).Так же блоки умеют правильно отвечать на вопросы компилятора. Реализация получилась удачной. Об этом свидетельствует то, что почти за год существования проекта мне ни разу не пришлось изменять ее. Интерфейс схемы я вообще не трогал ни разу. Иногда добавляется интерфейс блоков, когда компилятору требуется каки - е то дополнительные данные от них для реализации той или иной функции. Наверное об этом и все. Больше я об этом пока ничего не раскажу Вредный я)))))

среда, 14 января 2015 г., 1:56:01 UTC+5 пользователь Assargadon написал:
Так, теперь более...глубинный вопрос.

Как организована работа с...эээ...фазой вычислений, что ли. Когда несколько виртуальных элементов стоят каскадом, то ведь всегда возникает вопрос синхронизации. Я довольно слабо представляю себе детали, но знаю, что такое явление есть.

Прокомментируете поподробнее?

13 января 2015 г., 1:47 пользователь Сергей Глушенко <[hidden email]> написал:
Большое спасибо за помощь проекту. Кстати как раз выпустил новую версию. Скорее всего следующая будет не скоро, 15-го уезжаю домой, а дома почти сразу с семьей едем в Питер. Так что продолжения придется немного подождать. Но я буду на связи, у меня телефон умный)))

среда, 7 января 2015 г., 14:29:18 UTC+5 пользователь Assargadon написал:
Вопрос первый: а есть какая-нибудь возможность получить версию под Linux? У cincom была, насколько я помню, линуксовая VMка, так что это не должно быть слишком сложно.

Вопрос второй: FLProg на выходе генерирует каноничный C-код, или богомерзкие скетчи на этом их внутреннем ардуиновском недоСи?

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Вопросы о FLProg

Сергей Глушенко
Падения происходят из за компилятора. При поиске предыдущего блока при создании цепочки если есть прямая связь без переменной  между выходом одного блока со входом другого в пределах той же цепочки, компилятор зацикливается и программа зависает. Я сейчас ищу способ запретить создание таких связей с минимальным торможением при отрисовке. Пока не нашёл, хотя подвижка уже есть. Но такое может возникнуть и при одной цепочке и при образе процесса. У сименса такие фокусы с прямым соеденением то же программно запрещенны. ТОлько через переменную


среда, 14 января 2015 г., 18:58:16 UTC+5 пользователь Assargadon написал:
Вроде слово фаза я нигде не использовал.

Да, его использовал я. Не знаю, как в точности это называется.

Смысл явления в том, что на срабатывание каждого элемента необходимо определенное время. Соответственно, изменения состояния "распространяются" от входов своеобразной "волной", и эта "волна" достигает разных элементов в разное время. Именно благодаря этому системы из реле могут зацикливаться и работать как генераторы. Вот это я и называю "фазой".

Смысл выделения отдельных цепочек в логических контроллерах как раз ровно в этом - борьба с биениями выходов, исключение циклов.

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

14 января 2015 г., 14:11 пользователь Сергей Глушенко <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="ZHYr-28bqLEJ" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">sup...@...> написал:
Да в первом ответе я немного ошибся. Не сообразил что Вы использовали входа а не переменные. После Вашего комментария я понял ошибку, и постарался объяснить ситуацию. К сожалению из меня объясняльщик не очень, но я над собой работаю)))). Правда теперь я немного не понял. Что Вы имеете в виду под "Управлением фазой". Вроде слово фаза я нигде не использовал.

среда, 14 января 2015 г., 16:04:59 UTC+5 пользователь Assargadon написал:
Сергей, я прекрасно понял эту часть ваших слов, хотя за картинку спасибо. Мне просто как раз было интересно, для "управления фазой" вы использовали таблицу состояний, функциональные извращения или просто забили. Просто в начале вы сказали, что 

Код который получится в скетче (без учета синтсиса так для примера)
out = (pin2 XOR (pin1 XOR pin2)); 
так что все будет нормально

и это меня сбило, поскольку противоречило последующим словам. И я не был уверен, какой же из двух озвученных вами вариантов имеет место на самом деле :) Ну, теперь знаю. Спасибо.



14 января 2015 г., 13:56 пользователь Сергей Глушенко <[hidden email]> написал:

<a style="margin-left:1em;margin-right:1em" href="https://lh3.googleusercontent.com/-i-O5WkeL2gs/VLZK6T0v1HI/AAAAAAAAAC8/dDduKcAvb-0/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA12345678.PNG" target="_blank" onmousedown="this.href='https://lh3.googleusercontent.com/-i-O5WkeL2gs/VLZK6T0v1HI/AAAAAAAAAC8/dDduKcAvb-0/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA12345678.PNG';return true;" onclick="this.href='https://lh3.googleusercontent.com/-i-O5WkeL2gs/VLZK6T0v1HI/AAAAAAAAAC8/dDduKcAvb-0/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA12345678.PNG';return true;">

Ключевая фраза

Достаточно в любом месте программы счтать значение железного входа в переменную...
..
 Я как раз сказал что в вашем случае вероятность того что на вход первого придет не то же значение что и второго в принципе возможна.
digitalRead (1)   это чтение состояние ноги контроллера. И да если в течении выполнения первого XORнапряжение на ноге изменится то при следующем чтении значение будет другим. Поэтому я и рекомендовал в случае критичности такой ситуации прочитать значение входа в переменную и использовать ее.
 У меня что то плохо получается вставлять картинки сюда, она вставилась в самый верх сообщения. Попробуйте собрать такую схему и посмотрите что получится в результате. Вот там точно значения не изменятся.







среда, 14 января 2015 г., 15:45:46 UTC+5 пользователь Assargadon написал:
хоть и расчет XOR занимает наносекунды

Это как раз неважно. Там же может и не XOR стоять. Там может стоять цепочка в 100500 логических элементов, или ещё что-нибудь посложнее.


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

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

Поэтому я сгенерировал скетч, и вижу там
digitalWrite(2,  ( ( (digitalRead (1))) ^ ( (digitalRead (4))) ) ^ ( (digitalRead (4))) );
Я так понимаю, digitalRead - это чтение бита из порта, а не из буфера. То есть, как я понимаю, на вход второго XOR'а может попасть не тот бит, который попал на первый XOR. Поправьте, если я ошибся.


14 января 2015 г., 12:36 пользователь Сергей Глушенко <[hidden email]> написал:

Нормально - это конечно когда разные сигналы придти не могут. В Вашем примере это в принципе возможно. Хоть и расчет XOR занимает наносекунды в принципе есть вероятность того что за это время состояние входа изменится. Я об этой возможности рассказывал в первых видеоуроках. Так же давал решение для тех коому этот вопрос важен. Достаточно в любом месте программы счтать значение железного входа в переменную, и использовать эти переменные в программе. Тогда в течении скана программы значение этих переменных не изменится. Вообще все эти вопросы решает подход с использованием принципа образа процесса. То есть в начале скана все входа контроллера считываются в переменные, в процессе скана работа ведется только с ними. результаты работы заносятся в переменные. В конце скана полученные результаты записываются в железные выхода. Но такой подход требует выделения дополнительной памяти под образ процесса. А у ардуино ее и так немного. Поэтому я отказался от такого подхода.

среда, 14 января 2015 г., 13:34:15 UTC+5 пользователь Assargadon написал:
так что все будет нормально

Сергей, так в этом же и вопрос.
Для вас "нормально" - это как именно? :)

Нормально - это когда на вход первого и второго XOR'а могут придти разные биты? Или когда они не могут оказаться разными?

14 января 2015 г., 11:17 пользователь Сергей Глушенко <[hidden email]> написал:

Я для этих функций использую виндовые ножница. Безумно удобно. Но у Вас насколько я помно линукс. Печалька....
А теперь серьезно.


среда, 14 января 2015 г., 13:08:54 UTC+5 пользователь Assargadon написал:
Ок. Зацикливаться может.

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

out = (pin2 XOR (pin1 XOR pin2));
так что все будет нормально



Вот в такой схеме - может ли быть так, что на нижний вход второго XOR'а поступит не то значение, которое поступало на нижний вход первого XOR'а, потому что, за время пока вычислялся первый XOR, значение на ноге успело измениться?

14 января 2015 г., 10:37 пользователь Сергей Глушенко <[hidden email]> написал:

Наверное все таки сказывается отсутствие у меня настоящего академического образования. У меня нет вышки, и как там в фильме говорится "Я консирваториев не заканчивал". Посмотрел статьи по вашим сылкам. Честно скажу - ни.... не понял.
Что я реализовал?..... Даже не знаю как ответить. Ну наверное в общих словах компиляцию схемы в скетчь. И все.
    Я действительно когда начинаю работать над новым функционалом не знаю что получится в конце. Первый шаг - реализовать эту функцию в ArduinoIDE что бы понять что это вообще возможно. После этого приступаю к реализации в коде привязываясь к существующей архитектуре. Я почти никогда не продумываю реализацию задачи заранее. Мой подход - "код покажет". Во время работы над проектом Cadel вместе с Vladimir Musulainen у нас проводился анализ задачи с разбиением на карточки,  продумыванием архитектуры и т.д. Но самое смешное что примерно в половине случаев конечная реализация сильно отличалась от задуманного. По разным причинам. Но там это было нужно для разбиения задач по участнигам группы, и расчета ориентировочного времени на реализацию. Поскольку я работаю один и учета времени от меня никто не требует в своей работе я исключил этот этап. Жалко тратить на него время.
 Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

Да можно. Частота генерации будет зависеть от тактовой частоты контроллеа и времени выполнения скана программы. Если есть интерес я могу рассказать о модели выполнения программы в микроконтроллере, и отличия ее от событийной модели в компьютере.

среда, 14 января 2015 г., 12:02:31 UTC+5 пользователь Assargadon написал:
Сергей, вот вы начали про то, что я спросил, а потом переключились на реализацию. Рассказ про реализацию довольно интересен и познавателен, но это немного не то, о чём я спрашивал.

Я хотел узнать не то, как вы реализовали, а что именно вы реализовали. Меня сейчас интересовала не императивная, а декларативная часть вашей работы.

======

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

И это была самая настоящая, физическая релейная логика, на самых настоящих реле. И она - зацикливалась.

Поскольку математику я знал куда лучше, чем электронику, я легко пришёл к тем самым "логическим цепочкам". И это помогло мне понять связь между императивной логикой и логикой булевой, а в будущем легко понять всякие там <a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%B7%D1%8A%D1%8E%D0%BD%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BD%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B8%25D0%25B7%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGoyWwIDQlFrwWl9nkNYHWwCvtAtw';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B8%25D0%25B7%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGoyWwIDQlFrwWl9nkNYHWwCvtAtw';return true;">ДНФ и <a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%8A%D1%8E%D0%BD%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BD%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%259A%25D0%25BE%25D0%25BD%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGTy9WZIQMiSeLgsPbmxUfOy69cew';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%259A%25D0%25BE%25D0%25BD%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGTy9WZIQMiSeLgsPbmxUfOy69cew';return true;">КНФ и даже конечные автоматы. В общем, опыт был полезный.

Так вот, вопрос: схемы, построенные в FLProg, могут зацикливаться?
Это не единственный вопрос, относящийся к фазам вычислений, но с него проще всего начать.

Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

======

P.S. Обращу, кстати, внимание: перескок с задачи на её реализацию - это такая достаточно показательная вещь. Для вас, видимо, "как сделать" и "что сделать" - очень близкие вещи, тогда как на самом деле это не совсем так. Но это тема для отдельного разговора. Хотя две ссылки я всё же приведу:

<a href="https://ru.wikipedia.org/wiki/%D0%98%D0%BC%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2598%25D0%25BC%25D0%25BF%25D0%25B5%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNF5yT_W1tYkmx_qz8DAY8OB5cmjhg';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2598%25D0%25BC%25D0%25BF%25D0%25B5%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNF5yT_W1tYkmx_qz8DAY8OB5cmjhg';return true;">Википедия: Императивное программирование
<a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BA%D0%BB%D0%B0%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B5%25D0%25BA%25D0%25BB%25D0%25B0%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNGMApeHNnII_LY7EVzyuHWX2I0NTA';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B5%25D0%25BA%25D0%25BB%25D0%25B0%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNGMApeHNnII_LY7EVzyuHWX2I0NTA';return true;">Википедия: Декларативное программирование

14 января 2015 г., 8:03 пользователь Сергей Глушенко <[hidden email]> написал:

Это и было самое сложное в разработке проекта. Как преобразовать графическое представление схемы в код для контроллера. Тут требуется немного предыстории.
Основная идея была создать аналог сред программирования для промышленных (безумно дорогих) контролеров на дешёвые ардуинки. За базу я взял программу TiaPortal от Siemens. У них такая идеология: Вся схема разбивается на отдельные Nenwork - и. В каждом нетворке возможна только одна логическая цепочка. То есть один конечный элемент. Это может быть реле, переменная или что то еще. В общем какой - то объект в который производится запись. И схема которая собирает значение для записи. При компиляции каждый нетворк представляет одну строку конечного кода. Такого алгоритма придерживаются и остальные производители. С него начинал и я. Следы этого остались в проекте, у меня название класса описывающего плату Network. НО. Я разрабатываю проект как среду для электриков, электронщиков, да и просто любителей. Концепция логических цепочек для них тяжела. Я сам прошол путь от простого электрика - до ведущего разработчика, так что могу представить себя в шкуре любого из них. Для них понятно название "плата". То есть какой -то законченный кусок схемы выполняющий определенные функции. А на плате может быть несколько релюшек, лампочек, да и в конце концов просто выходов для связи с другими платами. Еще одна засада. Для реализации какого то блока чаще всего недостаточно только описать строкой состояние его входа. Например для блока дисплея необходимо его задекларировать, инициализировать, подключить библиотеку, в нужный момент вывести требуемый текст, да еще и определить нет ли необходимости его очистить. Это разный код в разных частях скетча.  Так что существующий алгоритм не подходил. Я пости два месяца (точнее четыре с учетом что работаю над проектом я только на вахте) я придумывал новы, свой алгоритм. В принципе это и есть моё как говорится ноу - хау. Не хочу его полностью раскрывать, но коротко могу. Я разработал собственный алгоритм разбиения схемы на куски, и систему взаимодействия схемы и компилятора. Схема и блоки обладают определенным набором интерфейсов с которыми работает компилятор. Схема умеет себя отдавать компилятору в наиболее удобном для него виде (умная женщина, мне бы такую жену))) ).Так же блоки умеют правильно отвечать на вопросы компилятора. Реализация получилась удачной. Об этом свидетельствует то, что почти за год существования проекта мне ни разу не пришлось изменять ее. Интерфейс схемы я вообще не трогал ни разу. Иногда добавляется интерфейс блоков, когда компилятору требуется каки - е то дополнительные данные от них для реализации той или иной функции. Наверное об этом и все. Больше я об этом пока ничего не раскажу Вредный я)))))

среда, 14 января 2015 г., 1:56:01 UTC+5 пользователь Assargadon написал:
Так, теперь более...глубинный вопрос.

Как организована работа с...эээ...фазой вычислений, что ли. Когда несколько виртуальных элементов стоят каскадом, то ведь всегда возникает вопрос синхронизации. Я довольно слабо представляю себе детали, но знаю, что такое явление есть.

Прокомментируете поподробнее?

13 января 2015 г., 1:47 пользователь Сергей Глушенко <[hidden email]> написал:
Большое спасибо за помощь проекту. Кстати как раз выпустил новую версию. Скорее всего следующая будет не скоро, 15-го уезжаю домой, а дома почти сразу с семьей едем в Питер. Так что продолжения придется немного подождать. Но я буду на связи, у меня телефон умный)))

среда, 7 января 2015 г., 14:29:18 UTC+5 пользователь Assargadon написал:
Вопрос первый: а есть какая-нибудь возможность получить версию под Linux? У cincom была, насколько я помню, линуксовая VMка, так что это не должно быть слишком сложно.

Вопрос второй: FLProg на выходе генерирует каноничный C-код, или богомерзкие скетчи на этом их внутреннем ардуиновском недоСи?

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="ZHYr-28bqLEJ" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Вопросы о FLProg

Yuriy Mironenko
Ну да. Обработка циклов - это один из элементов управления фазой.
Увы, я очень мало про это знаю - знаю, что такое есть, знаю, что от этого бывают проблемы - но ни терминологии, ни что придумали в качестве решений - нету. Я потому и задавал вопрос вам - надеялся узнать :)


Я сейчас ищу способ запретить создание таких связей с минимальным торможением при отрисовке.

В начале рисования просто составляете список всех точек, куда можно присоединить выход и просто не присоединяете его туда, куда нельзя. Всё равно вы это делаете в рудиментарном виде - ведь завести выход на собственный вход нельзя. Если не делать этот обсчёт при каждом mouse move, а только вначале - тормозить не будет.

Но для начала вы бы добавили этот запрет в проверку проекта. Если есть цикл - проект некорректен.

14 января 2015 г., 17:11 пользователь Сергей Глушенко <[hidden email]> написал:
Падения происходят из за компилятора. При поиске предыдущего блока при создании цепочки если есть прямая связь без переменной  между выходом одного блока со входом другого в пределах той же цепочки, компилятор зацикливается и программа зависает. Я сейчас ищу способ запретить создание таких связей с минимальным торможением при отрисовке. Пока не нашёл, хотя подвижка уже есть. Но такое может возникнуть и при одной цепочке и при образе процесса. У сименса такие фокусы с прямым соеденением то же программно запрещенны. ТОлько через переменную


среда, 14 января 2015 г., 18:58:16 UTC+5 пользователь Assargadon написал:
Вроде слово фаза я нигде не использовал.

Да, его использовал я. Не знаю, как в точности это называется.

Смысл явления в том, что на срабатывание каждого элемента необходимо определенное время. Соответственно, изменения состояния "распространяются" от входов своеобразной "волной", и эта "волна" достигает разных элементов в разное время. Именно благодаря этому системы из реле могут зацикливаться и работать как генераторы. Вот это я и называю "фазой".

Смысл выделения отдельных цепочек в логических контроллерах как раз ровно в этом - борьба с биениями выходов, исключение циклов.

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

14 января 2015 г., 14:11 пользователь Сергей Глушенко <[hidden email]> написал:

Да в первом ответе я немного ошибся. Не сообразил что Вы использовали входа а не переменные. После Вашего комментария я понял ошибку, и постарался объяснить ситуацию. К сожалению из меня объясняльщик не очень, но я над собой работаю)))). Правда теперь я немного не понял. Что Вы имеете в виду под "Управлением фазой". Вроде слово фаза я нигде не использовал.

среда, 14 января 2015 г., 16:04:59 UTC+5 пользователь Assargadon написал:
Сергей, я прекрасно понял эту часть ваших слов, хотя за картинку спасибо. Мне просто как раз было интересно, для "управления фазой" вы использовали таблицу состояний, функциональные извращения или просто забили. Просто в начале вы сказали, что 

Код который получится в скетче (без учета синтсиса так для примера)
out = (pin2 XOR (pin1 XOR pin2)); 
так что все будет нормально

и это меня сбило, поскольку противоречило последующим словам. И я не был уверен, какой же из двух озвученных вами вариантов имеет место на самом деле :) Ну, теперь знаю. Спасибо.



14 января 2015 г., 13:56 пользователь Сергей Глушенко <[hidden email]> написал:

Ключевая фраза

Достаточно в любом месте программы счтать значение железного входа в переменную...
..
 Я как раз сказал что в вашем случае вероятность того что на вход первого придет не то же значение что и второго в принципе возможна.
digitalRead (1)   это чтение состояние ноги контроллера. И да если в течении выполнения первого XORнапряжение на ноге изменится то при следующем чтении значение будет другим. Поэтому я и рекомендовал в случае критичности такой ситуации прочитать значение входа в переменную и использовать ее.
 У меня что то плохо получается вставлять картинки сюда, она вставилась в самый верх сообщения. Попробуйте собрать такую схему и посмотрите что получится в результате. Вот там точно значения не изменятся.







среда, 14 января 2015 г., 15:45:46 UTC+5 пользователь Assargadon написал:
хоть и расчет XOR занимает наносекунды

Это как раз неважно. Там же может и не XOR стоять. Там может стоять цепочка в 100500 логических элементов, или ещё что-нибудь посложнее.


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

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

Поэтому я сгенерировал скетч, и вижу там
digitalWrite(2,  ( ( (digitalRead (1))) ^ ( (digitalRead (4))) ) ^ ( (digitalRead (4))) );
Я так понимаю, digitalRead - это чтение бита из порта, а не из буфера. То есть, как я понимаю, на вход второго XOR'а может попасть не тот бит, который попал на первый XOR. Поправьте, если я ошибся.


14 января 2015 г., 12:36 пользователь Сергей Глушенко <[hidden email]> написал:

Нормально - это конечно когда разные сигналы придти не могут. В Вашем примере это в принципе возможно. Хоть и расчет XOR занимает наносекунды в принципе есть вероятность того что за это время состояние входа изменится. Я об этой возможности рассказывал в первых видеоуроках. Так же давал решение для тех коому этот вопрос важен. Достаточно в любом месте программы счтать значение железного входа в переменную, и использовать эти переменные в программе. Тогда в течении скана программы значение этих переменных не изменится. Вообще все эти вопросы решает подход с использованием принципа образа процесса. То есть в начале скана все входа контроллера считываются в переменные, в процессе скана работа ведется только с ними. результаты работы заносятся в переменные. В конце скана полученные результаты записываются в железные выхода. Но такой подход требует выделения дополнительной памяти под образ процесса. А у ардуино ее и так немного. Поэтому я отказался от такого подхода.

среда, 14 января 2015 г., 13:34:15 UTC+5 пользователь Assargadon написал:
так что все будет нормально

Сергей, так в этом же и вопрос.
Для вас "нормально" - это как именно? :)

Нормально - это когда на вход первого и второго XOR'а могут придти разные биты? Или когда они не могут оказаться разными?

14 января 2015 г., 11:17 пользователь Сергей Глушенко <[hidden email]> написал:

Я для этих функций использую виндовые ножница. Безумно удобно. Но у Вас насколько я помно линукс. Печалька....
А теперь серьезно.


среда, 14 января 2015 г., 13:08:54 UTC+5 пользователь Assargadon написал:
Ок. Зацикливаться может.

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

out = (pin2 XOR (pin1 XOR pin2));
так что все будет нормально



Вот в такой схеме - может ли быть так, что на нижний вход второго XOR'а поступит не то значение, которое поступало на нижний вход первого XOR'а, потому что, за время пока вычислялся первый XOR, значение на ноге успело измениться?

14 января 2015 г., 10:37 пользователь Сергей Глушенко <[hidden email]> написал:

Наверное все таки сказывается отсутствие у меня настоящего академического образования. У меня нет вышки, и как там в фильме говорится "Я консирваториев не заканчивал". Посмотрел статьи по вашим сылкам. Честно скажу - ни.... не понял.
Что я реализовал?..... Даже не знаю как ответить. Ну наверное в общих словах компиляцию схемы в скетчь. И все.
    Я действительно когда начинаю работать над новым функционалом не знаю что получится в конце. Первый шаг - реализовать эту функцию в ArduinoIDE что бы понять что это вообще возможно. После этого приступаю к реализации в коде привязываясь к существующей архитектуре. Я почти никогда не продумываю реализацию задачи заранее. Мой подход - "код покажет". Во время работы над проектом Cadel вместе с Vladimir Musulainen у нас проводился анализ задачи с разбиением на карточки,  продумыванием архитектуры и т.д. Но самое смешное что примерно в половине случаев конечная реализация сильно отличалась от задуманного. По разным причинам. Но там это было нужно для разбиения задач по участнигам группы, и расчета ориентировочного времени на реализацию. Поскольку я работаю один и учета времени от меня никто не требует в своей работе я исключил этот этап. Жалко тратить на него время.
 Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

Да можно. Частота генерации будет зависеть от тактовой частоты контроллеа и времени выполнения скана программы. Если есть интерес я могу рассказать о модели выполнения программы в микроконтроллере, и отличия ее от событийной модели в компьютере.

среда, 14 января 2015 г., 12:02:31 UTC+5 пользователь Assargadon написал:
Сергей, вот вы начали про то, что я спросил, а потом переключились на реализацию. Рассказ про реализацию довольно интересен и познавателен, но это немного не то, о чём я спрашивал.

Я хотел узнать не то, как вы реализовали, а что именно вы реализовали. Меня сейчас интересовала не императивная, а декларативная часть вашей работы.

======

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

И это была самая настоящая, физическая релейная логика, на самых настоящих реле. И она - зацикливалась.

Поскольку математику я знал куда лучше, чем электронику, я легко пришёл к тем самым "логическим цепочкам". И это помогло мне понять связь между императивной логикой и логикой булевой, а в будущем легко понять всякие там ДНФ и КНФ и даже конечные автоматы. В общем, опыт был полезный.

Так вот, вопрос: схемы, построенные в FLProg, могут зацикливаться?
Это не единственный вопрос, относящийся к фазам вычислений, но с него проще всего начать.

Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

======

P.S. Обращу, кстати, внимание: перескок с задачи на её реализацию - это такая достаточно показательная вещь. Для вас, видимо, "как сделать" и "что сделать" - очень близкие вещи, тогда как на самом деле это не совсем так. Но это тема для отдельного разговора. Хотя две ссылки я всё же приведу:

Википедия: Императивное программирование
Википедия: Декларативное программирование

14 января 2015 г., 8:03 пользователь Сергей Глушенко <[hidden email]> написал:

Это и было самое сложное в разработке проекта. Как преобразовать графическое представление схемы в код для контроллера. Тут требуется немного предыстории.
Основная идея была создать аналог сред программирования для промышленных (безумно дорогих) контролеров на дешёвые ардуинки. За базу я взял программу TiaPortal от Siemens. У них такая идеология: Вся схема разбивается на отдельные Nenwork - и. В каждом нетворке возможна только одна логическая цепочка. То есть один конечный элемент. Это может быть реле, переменная или что то еще. В общем какой - то объект в который производится запись. И схема которая собирает значение для записи. При компиляции каждый нетворк представляет одну строку конечного кода. Такого алгоритма придерживаются и остальные производители. С него начинал и я. Следы этого остались в проекте, у меня название класса описывающего плату Network. НО. Я разрабатываю проект как среду для электриков, электронщиков, да и просто любителей. Концепция логических цепочек для них тяжела. Я сам прошол путь от простого электрика - до ведущего разработчика, так что могу представить себя в шкуре любого из них. Для них понятно название "плата". То есть какой -то законченный кусок схемы выполняющий определенные функции. А на плате может быть несколько релюшек, лампочек, да и в конце концов просто выходов для связи с другими платами. Еще одна засада. Для реализации какого то блока чаще всего недостаточно только описать строкой состояние его входа. Например для блока дисплея необходимо его задекларировать, инициализировать, подключить библиотеку, в нужный момент вывести требуемый текст, да еще и определить нет ли необходимости его очистить. Это разный код в разных частях скетча.  Так что существующий алгоритм не подходил. Я пости два месяца (точнее четыре с учетом что работаю над проектом я только на вахте) я придумывал новы, свой алгоритм. В принципе это и есть моё как говорится ноу - хау. Не хочу его полностью раскрывать, но коротко могу. Я разработал собственный алгоритм разбиения схемы на куски, и систему взаимодействия схемы и компилятора. Схема и блоки обладают определенным набором интерфейсов с которыми работает компилятор. Схема умеет себя отдавать компилятору в наиболее удобном для него виде (умная женщина, мне бы такую жену))) ).Так же блоки умеют правильно отвечать на вопросы компилятора. Реализация получилась удачной. Об этом свидетельствует то, что почти за год существования проекта мне ни разу не пришлось изменять ее. Интерфейс схемы я вообще не трогал ни разу. Иногда добавляется интерфейс блоков, когда компилятору требуется каки - е то дополнительные данные от них для реализации той или иной функции. Наверное об этом и все. Больше я об этом пока ничего не раскажу Вредный я)))))

среда, 14 января 2015 г., 1:56:01 UTC+5 пользователь Assargadon написал:
Так, теперь более...глубинный вопрос.

Как организована работа с...эээ...фазой вычислений, что ли. Когда несколько виртуальных элементов стоят каскадом, то ведь всегда возникает вопрос синхронизации. Я довольно слабо представляю себе детали, но знаю, что такое явление есть.

Прокомментируете поподробнее?

13 января 2015 г., 1:47 пользователь Сергей Глушенко <[hidden email]> написал:
Большое спасибо за помощь проекту. Кстати как раз выпустил новую версию. Скорее всего следующая будет не скоро, 15-го уезжаю домой, а дома почти сразу с семьей едем в Питер. Так что продолжения придется немного подождать. Но я буду на связи, у меня телефон умный)))

среда, 7 января 2015 г., 14:29:18 UTC+5 пользователь Assargadon написал:
Вопрос первый: а есть какая-нибудь возможность получить версию под Linux? У cincom была, насколько я помню, линуксовая VMка, так что это не должно быть слишком сложно.

Вопрос второй: FLProg на выходе генерирует каноничный C-код, или богомерзкие скетчи на этом их внутреннем ардуиновском недоСи?

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Вопросы о FLProg

Сергей Глушенко
Список точек наверное будет не правильно. Его же придется составлять отдельно для каждого выхода. Ну и наверное тогда не список точек а список входов к  которым нельзя прицепиться. Хотя стоит подумать над таким кэшем. и список можно составлять не для всех входов а только для не подключенных.  к подключенным входам нельзя подключить другой выход. Спасибо за идею

среда, 14 января 2015 г., 19:23:04 UTC+5 пользователь Assargadon написал:
Ну да. Обработка циклов - это один из элементов управления фазой.
Увы, я очень мало про это знаю - знаю, что такое есть, знаю, что от этого бывают проблемы - но ни терминологии, ни что придумали в качестве решений - нету. Я потому и задавал вопрос вам - надеялся узнать :)


Я сейчас ищу способ запретить создание таких связей с минимальным торможением при отрисовке.

В начале рисования просто составляете список всех точек, куда можно присоединить выход и просто не присоединяете его туда, куда нельзя. Всё равно вы это делаете в рудиментарном виде - ведь завести выход на собственный вход нельзя. Если не делать этот обсчёт при каждом mouse move, а только вначале - тормозить не будет.

Но для начала вы бы добавили этот запрет в проверку проекта. Если есть цикл - проект некорректен.

14 января 2015 г., 17:11 пользователь Сергей Глушенко <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="FHoTqeKV8WoJ" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">sup...@...> написал:
Падения происходят из за компилятора. При поиске предыдущего блока при создании цепочки если есть прямая связь без переменной  между выходом одного блока со входом другого в пределах той же цепочки, компилятор зацикливается и программа зависает. Я сейчас ищу способ запретить создание таких связей с минимальным торможением при отрисовке. Пока не нашёл, хотя подвижка уже есть. Но такое может возникнуть и при одной цепочке и при образе процесса. У сименса такие фокусы с прямым соеденением то же программно запрещенны. ТОлько через переменную


среда, 14 января 2015 г., 18:58:16 UTC+5 пользователь Assargadon написал:
Вроде слово фаза я нигде не использовал.

Да, его использовал я. Не знаю, как в точности это называется.

Смысл явления в том, что на срабатывание каждого элемента необходимо определенное время. Соответственно, изменения состояния "распространяются" от входов своеобразной "волной", и эта "волна" достигает разных элементов в разное время. Именно благодаря этому системы из реле могут зацикливаться и работать как генераторы. Вот это я и называю "фазой".

Смысл выделения отдельных цепочек в логических контроллерах как раз ровно в этом - борьба с биениями выходов, исключение циклов.

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

14 января 2015 г., 14:11 пользователь Сергей Глушенко <[hidden email]> написал:

Да в первом ответе я немного ошибся. Не сообразил что Вы использовали входа а не переменные. После Вашего комментария я понял ошибку, и постарался объяснить ситуацию. К сожалению из меня объясняльщик не очень, но я над собой работаю)))). Правда теперь я немного не понял. Что Вы имеете в виду под "Управлением фазой". Вроде слово фаза я нигде не использовал.

среда, 14 января 2015 г., 16:04:59 UTC+5 пользователь Assargadon написал:
Сергей, я прекрасно понял эту часть ваших слов, хотя за картинку спасибо. Мне просто как раз было интересно, для "управления фазой" вы использовали таблицу состояний, функциональные извращения или просто забили. Просто в начале вы сказали, что 

Код который получится в скетче (без учета синтсиса так для примера)
out = (pin2 XOR (pin1 XOR pin2)); 
так что все будет нормально

и это меня сбило, поскольку противоречило последующим словам. И я не был уверен, какой же из двух озвученных вами вариантов имеет место на самом деле :) Ну, теперь знаю. Спасибо.



14 января 2015 г., 13:56 пользователь Сергей Глушенко <[hidden email]> написал:

<a style="margin-left:1em;margin-right:1em" href="https://lh3.googleusercontent.com/-i-O5WkeL2gs/VLZK6T0v1HI/AAAAAAAAAC8/dDduKcAvb-0/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA12345678.PNG" target="_blank" onmousedown="this.href='https://lh3.googleusercontent.com/-i-O5WkeL2gs/VLZK6T0v1HI/AAAAAAAAAC8/dDduKcAvb-0/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA12345678.PNG';return true;" onclick="this.href='https://lh3.googleusercontent.com/-i-O5WkeL2gs/VLZK6T0v1HI/AAAAAAAAAC8/dDduKcAvb-0/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA12345678.PNG';return true;">

Ключевая фраза

Достаточно в любом месте программы счтать значение железного входа в переменную...
..
 Я как раз сказал что в вашем случае вероятность того что на вход первого придет не то же значение что и второго в принципе возможна.
digitalRead (1)   это чтение состояние ноги контроллера. И да если в течении выполнения первого XORнапряжение на ноге изменится то при следующем чтении значение будет другим. Поэтому я и рекомендовал в случае критичности такой ситуации прочитать значение входа в переменную и использовать ее.
 У меня что то плохо получается вставлять картинки сюда, она вставилась в самый верх сообщения. Попробуйте собрать такую схему и посмотрите что получится в результате. Вот там точно значения не изменятся.







среда, 14 января 2015 г., 15:45:46 UTC+5 пользователь Assargadon написал:
хоть и расчет XOR занимает наносекунды

Это как раз неважно. Там же может и не XOR стоять. Там может стоять цепочка в 100500 логических элементов, или ещё что-нибудь посложнее.


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

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

Поэтому я сгенерировал скетч, и вижу там
digitalWrite(2,  ( ( (digitalRead (1))) ^ ( (digitalRead (4))) ) ^ ( (digitalRead (4))) );
Я так понимаю, digitalRead - это чтение бита из порта, а не из буфера. То есть, как я понимаю, на вход второго XOR'а может попасть не тот бит, который попал на первый XOR. Поправьте, если я ошибся.


14 января 2015 г., 12:36 пользователь Сергей Глушенко <[hidden email]> написал:

Нормально - это конечно когда разные сигналы придти не могут. В Вашем примере это в принципе возможно. Хоть и расчет XOR занимает наносекунды в принципе есть вероятность того что за это время состояние входа изменится. Я об этой возможности рассказывал в первых видеоуроках. Так же давал решение для тех коому этот вопрос важен. Достаточно в любом месте программы счтать значение железного входа в переменную, и использовать эти переменные в программе. Тогда в течении скана программы значение этих переменных не изменится. Вообще все эти вопросы решает подход с использованием принципа образа процесса. То есть в начале скана все входа контроллера считываются в переменные, в процессе скана работа ведется только с ними. результаты работы заносятся в переменные. В конце скана полученные результаты записываются в железные выхода. Но такой подход требует выделения дополнительной памяти под образ процесса. А у ардуино ее и так немного. Поэтому я отказался от такого подхода.

среда, 14 января 2015 г., 13:34:15 UTC+5 пользователь Assargadon написал:
так что все будет нормально

Сергей, так в этом же и вопрос.
Для вас "нормально" - это как именно? :)

Нормально - это когда на вход первого и второго XOR'а могут придти разные биты? Или когда они не могут оказаться разными?

14 января 2015 г., 11:17 пользователь Сергей Глушенко <[hidden email]> написал:

Я для этих функций использую виндовые ножница. Безумно удобно. Но у Вас насколько я помно линукс. Печалька....
А теперь серьезно.


среда, 14 января 2015 г., 13:08:54 UTC+5 пользователь Assargadon написал:
Ок. Зацикливаться может.

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

out = (pin2 XOR (pin1 XOR pin2));
так что все будет нормально



Вот в такой схеме - может ли быть так, что на нижний вход второго XOR'а поступит не то значение, которое поступало на нижний вход первого XOR'а, потому что, за время пока вычислялся первый XOR, значение на ноге успело измениться?

14 января 2015 г., 10:37 пользователь Сергей Глушенко <[hidden email]> написал:

Наверное все таки сказывается отсутствие у меня настоящего академического образования. У меня нет вышки, и как там в фильме говорится "Я консирваториев не заканчивал". Посмотрел статьи по вашим сылкам. Честно скажу - ни.... не понял.
Что я реализовал?..... Даже не знаю как ответить. Ну наверное в общих словах компиляцию схемы в скетчь. И все.
    Я действительно когда начинаю работать над новым функционалом не знаю что получится в конце. Первый шаг - реализовать эту функцию в ArduinoIDE что бы понять что это вообще возможно. После этого приступаю к реализации в коде привязываясь к существующей архитектуре. Я почти никогда не продумываю реализацию задачи заранее. Мой подход - "код покажет". Во время работы над проектом Cadel вместе с Vladimir Musulainen у нас проводился анализ задачи с разбиением на карточки,  продумыванием архитектуры и т.д. Но самое смешное что примерно в половине случаев конечная реализация сильно отличалась от задуманного. По разным причинам. Но там это было нужно для разбиения задач по участнигам группы, и расчета ориентировочного времени на реализацию. Поскольку я работаю один и учета времени от меня никто не требует в своей работе я исключил этот этап. Жалко тратить на него время.
 Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

Да можно. Частота генерации будет зависеть от тактовой частоты контроллеа и времени выполнения скана программы. Если есть интерес я могу рассказать о модели выполнения программы в микроконтроллере, и отличия ее от событийной модели в компьютере.

среда, 14 января 2015 г., 12:02:31 UTC+5 пользователь Assargadon написал:
Сергей, вот вы начали про то, что я спросил, а потом переключились на реализацию. Рассказ про реализацию довольно интересен и познавателен, но это немного не то, о чём я спрашивал.

Я хотел узнать не то, как вы реализовали, а что именно вы реализовали. Меня сейчас интересовала не императивная, а декларативная часть вашей работы.

======

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

И это была самая настоящая, физическая релейная логика, на самых настоящих реле. И она - зацикливалась.

Поскольку математику я знал куда лучше, чем электронику, я легко пришёл к тем самым "логическим цепочкам". И это помогло мне понять связь между императивной логикой и логикой булевой, а в будущем легко понять всякие там <a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%B7%D1%8A%D1%8E%D0%BD%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BD%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B8%25D0%25B7%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGoyWwIDQlFrwWl9nkNYHWwCvtAtw';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B8%25D0%25B7%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGoyWwIDQlFrwWl9nkNYHWwCvtAtw';return true;">ДНФ и <a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%8A%D1%8E%D0%BD%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BD%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%259A%25D0%25BE%25D0%25BD%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGTy9WZIQMiSeLgsPbmxUfOy69cew';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%259A%25D0%25BE%25D0%25BD%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGTy9WZIQMiSeLgsPbmxUfOy69cew';return true;">КНФ и даже конечные автоматы. В общем, опыт был полезный.

Так вот, вопрос: схемы, построенные в FLProg, могут зацикливаться?
Это не единственный вопрос, относящийся к фазам вычислений, но с него проще всего начать.

Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

======

P.S. Обращу, кстати, внимание: перескок с задачи на её реализацию - это такая достаточно показательная вещь. Для вас, видимо, "как сделать" и "что сделать" - очень близкие вещи, тогда как на самом деле это не совсем так. Но это тема для отдельного разговора. Хотя две ссылки я всё же приведу:

<a href="https://ru.wikipedia.org/wiki/%D0%98%D0%BC%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2598%25D0%25BC%25D0%25BF%25D0%25B5%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNF5yT_W1tYkmx_qz8DAY8OB5cmjhg';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2598%25D0%25BC%25D0%25BF%25D0%25B5%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNF5yT_W1tYkmx_qz8DAY8OB5cmjhg';return true;">Википедия: Императивное программирование
<a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BA%D0%BB%D0%B0%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B5%25D0%25BA%25D0%25BB%25D0%25B0%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNGMApeHNnII_LY7EVzyuHWX2I0NTA';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B5%25D0%25BA%25D0%25BB%25D0%25B0%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNGMApeHNnII_LY7EVzyuHWX2I0NTA';return true;">Википедия: Декларативное программирование

14 января 2015 г., 8:03 пользователь Сергей Глушенко <[hidden email]> написал:

Это и было самое сложное в разработке проекта. Как преобразовать графическое представление схемы в код для контроллера. Тут требуется немного предыстории.
Основная идея была создать аналог сред программирования для промышленных (безумно дорогих) контролеров на дешёвые ардуинки. За базу я взял программу TiaPortal от Siemens. У них такая идеология: Вся схема разбивается на отдельные Nenwork - и. В каждом нетворке возможна только одна логическая цепочка. То есть один конечный элемент. Это может быть реле, переменная или что то еще. В общем какой - то объект в который производится запись. И схема которая собирает значение для записи. При компиляции каждый нетворк представляет одну строку конечного кода. Такого алгоритма придерживаются и остальные производители. С него начинал и я. Следы этого остались в проекте, у меня название класса описывающего плату Network. НО. Я разрабатываю проект как среду для электриков, электронщиков, да и просто любителей. Концепция логических цепочек для них тяжела. Я сам прошол путь от простого электрика - до ведущего разработчика, так что могу представить себя в шкуре любого из них. Для них понятно название "плата". То есть какой -то законченный кусок схемы выполняющий определенные функции. А на плате может быть несколько релюшек, лампочек, да и в конце концов просто выходов для связи с другими платами. Еще одна засада. Для реализации какого то блока чаще всего недостаточно только описать строкой состояние его входа. Например для блока дисплея необходимо его задекларировать, инициализировать, подключить библиотеку, в нужный момент вывести требуемый текст, да еще и определить нет ли необходимости его очистить. Это разный код в разных частях скетча.  Так что существующий алгоритм не подходил. Я пости два месяца (точнее четыре с учетом что работаю над проектом я только на вахте) я придумывал новы, свой алгоритм. В принципе это и есть моё как говорится ноу - хау. Не хочу его полностью раскрывать, но коротко могу. Я разработал собственный алгоритм разбиения схемы на куски, и систему взаимодействия схемы и компилятора. Схема и блоки обладают определенным набором интерфейсов с которыми работает компилятор. Схема умеет себя отдавать компилятору в наиболее удобном для него виде (умная женщина, мне бы такую жену))) ).Так же блоки умеют правильно отвечать на вопросы компилятора. Реализация получилась удачной. Об этом свидетельствует то, что почти за год существования проекта мне ни разу не пришлось изменять ее. Интерфейс схемы я вообще не трогал ни разу. Иногда добавляется интерфейс блоков, когда компилятору требуется каки - е то дополнительные данные от них для реализации той или иной функции. Наверное об этом и все. Больше я об этом пока ничего не раскажу Вредный я)))))

среда, 14 января 2015 г., 1:56:01 UTC+5 пользователь Assargadon написал:
Так, теперь более...глубинный вопрос.

Как организована работа с...эээ...фазой вычислений, что ли. Когда несколько виртуальных элементов стоят каскадом, то ведь всегда возникает вопрос синхронизации. Я довольно слабо представляю себе детали, но знаю, что такое явление есть.

Прокомментируете поподробнее?

13 января 2015 г., 1:47 пользователь Сергей Глушенко <[hidden email]> написал:
Большое спасибо за помощь проекту. Кстати как раз выпустил новую версию. Скорее всего следующая будет не скоро, 15-го уезжаю домой, а дома почти сразу с семьей едем в Питер. Так что продолжения придется немного подождать. Но я буду на связи, у меня телефон умный)))

среда, 7 января 2015 г., 14:29:18 UTC+5 пользователь Assargadon написал:
Вопрос первый: а есть какая-нибудь возможность получить версию под Linux? У cincom была, насколько я помню, линуксовая VMка, так что это не должно быть слишком сложно.

Вопрос второй: FLProg на выходе генерирует каноничный C-код, или богомерзкие скетчи на этом их внутреннем ардуиновском недоСи?

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="FHoTqeKV8WoJ" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Вопросы о FLProg

Yuriy Mironenko
Список точек наверное будет не правильно.
 
Когда я говорил о "точках", я имел в виду не "пиксели изображения", а как раз "точки подключения". Выходы для входов и входы для выходов.

Хотя стоит подумать над таким кэшем. Спасибо за идею

Пожалуйста. Обращайтесь.

P.S. Но, конечно, хотя мне льстит ваша благодарность, должен сказать, что это не вполне корректно назвать "идеей". Это стандартный общеизвестный приём. Никто ведь не назовёт забивание в стенку гвоздя "идеей по размещению пальто" :)

14 января 2015 г., 18:47 пользователь Сергей Глушенко <[hidden email]> написал:
Список точек наверное будет не правильно. Его же придется составлять отдельно для каждого выхода. Ну и наверное тогда не список точек а список входов к  которым нельзя прицепиться. Хотя стоит подумать над таким кэшем. и список можно составлять не для всех входов а только для не подключенных.  к подключенным входам нельзя подключить другой выход. Спасибо за идею

среда, 14 января 2015 г., 19:23:04 UTC+5 пользователь Assargadon написал:
Ну да. Обработка циклов - это один из элементов управления фазой.
Увы, я очень мало про это знаю - знаю, что такое есть, знаю, что от этого бывают проблемы - но ни терминологии, ни что придумали в качестве решений - нету. Я потому и задавал вопрос вам - надеялся узнать :)


Я сейчас ищу способ запретить создание таких связей с минимальным торможением при отрисовке.

В начале рисования просто составляете список всех точек, куда можно присоединить выход и просто не присоединяете его туда, куда нельзя. Всё равно вы это делаете в рудиментарном виде - ведь завести выход на собственный вход нельзя. Если не делать этот обсчёт при каждом mouse move, а только вначале - тормозить не будет.

Но для начала вы бы добавили этот запрет в проверку проекта. Если есть цикл - проект некорректен.

14 января 2015 г., 17:11 пользователь Сергей Глушенко <[hidden email]> написал:

Падения происходят из за компилятора. При поиске предыдущего блока при создании цепочки если есть прямая связь без переменной  между выходом одного блока со входом другого в пределах той же цепочки, компилятор зацикливается и программа зависает. Я сейчас ищу способ запретить создание таких связей с минимальным торможением при отрисовке. Пока не нашёл, хотя подвижка уже есть. Но такое может возникнуть и при одной цепочке и при образе процесса. У сименса такие фокусы с прямым соеденением то же программно запрещенны. ТОлько через переменную


среда, 14 января 2015 г., 18:58:16 UTC+5 пользователь Assargadon написал:
Вроде слово фаза я нигде не использовал.

Да, его использовал я. Не знаю, как в точности это называется.

Смысл явления в том, что на срабатывание каждого элемента необходимо определенное время. Соответственно, изменения состояния "распространяются" от входов своеобразной "волной", и эта "волна" достигает разных элементов в разное время. Именно благодаря этому системы из реле могут зацикливаться и работать как генераторы. Вот это я и называю "фазой".

Смысл выделения отдельных цепочек в логических контроллерах как раз ровно в этом - борьба с биениями выходов, исключение циклов.

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

14 января 2015 г., 14:11 пользователь Сергей Глушенко <[hidden email]> написал:

Да в первом ответе я немного ошибся. Не сообразил что Вы использовали входа а не переменные. После Вашего комментария я понял ошибку, и постарался объяснить ситуацию. К сожалению из меня объясняльщик не очень, но я над собой работаю)))). Правда теперь я немного не понял. Что Вы имеете в виду под "Управлением фазой". Вроде слово фаза я нигде не использовал.

среда, 14 января 2015 г., 16:04:59 UTC+5 пользователь Assargadon написал:
Сергей, я прекрасно понял эту часть ваших слов, хотя за картинку спасибо. Мне просто как раз было интересно, для "управления фазой" вы использовали таблицу состояний, функциональные извращения или просто забили. Просто в начале вы сказали, что 

Код который получится в скетче (без учета синтсиса так для примера)
out = (pin2 XOR (pin1 XOR pin2)); 
так что все будет нормально

и это меня сбило, поскольку противоречило последующим словам. И я не был уверен, какой же из двух озвученных вами вариантов имеет место на самом деле :) Ну, теперь знаю. Спасибо.



14 января 2015 г., 13:56 пользователь Сергей Глушенко <[hidden email]> написал:

Ключевая фраза

Достаточно в любом месте программы счтать значение железного входа в переменную...
..
 Я как раз сказал что в вашем случае вероятность того что на вход первого придет не то же значение что и второго в принципе возможна.
digitalRead (1)   это чтение состояние ноги контроллера. И да если в течении выполнения первого XORнапряжение на ноге изменится то при следующем чтении значение будет другим. Поэтому я и рекомендовал в случае критичности такой ситуации прочитать значение входа в переменную и использовать ее.
 У меня что то плохо получается вставлять картинки сюда, она вставилась в самый верх сообщения. Попробуйте собрать такую схему и посмотрите что получится в результате. Вот там точно значения не изменятся.







среда, 14 января 2015 г., 15:45:46 UTC+5 пользователь Assargadon написал:
хоть и расчет XOR занимает наносекунды

Это как раз неважно. Там же может и не XOR стоять. Там может стоять цепочка в 100500 логических элементов, или ещё что-нибудь посложнее.


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

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

Поэтому я сгенерировал скетч, и вижу там
digitalWrite(2,  ( ( (digitalRead (1))) ^ ( (digitalRead (4))) ) ^ ( (digitalRead (4))) );
Я так понимаю, digitalRead - это чтение бита из порта, а не из буфера. То есть, как я понимаю, на вход второго XOR'а может попасть не тот бит, который попал на первый XOR. Поправьте, если я ошибся.


14 января 2015 г., 12:36 пользователь Сергей Глушенко <[hidden email]> написал:

Нормально - это конечно когда разные сигналы придти не могут. В Вашем примере это в принципе возможно. Хоть и расчет XOR занимает наносекунды в принципе есть вероятность того что за это время состояние входа изменится. Я об этой возможности рассказывал в первых видеоуроках. Так же давал решение для тех коому этот вопрос важен. Достаточно в любом месте программы счтать значение железного входа в переменную, и использовать эти переменные в программе. Тогда в течении скана программы значение этих переменных не изменится. Вообще все эти вопросы решает подход с использованием принципа образа процесса. То есть в начале скана все входа контроллера считываются в переменные, в процессе скана работа ведется только с ними. результаты работы заносятся в переменные. В конце скана полученные результаты записываются в железные выхода. Но такой подход требует выделения дополнительной памяти под образ процесса. А у ардуино ее и так немного. Поэтому я отказался от такого подхода.

среда, 14 января 2015 г., 13:34:15 UTC+5 пользователь Assargadon написал:
так что все будет нормально

Сергей, так в этом же и вопрос.
Для вас "нормально" - это как именно? :)

Нормально - это когда на вход первого и второго XOR'а могут придти разные биты? Или когда они не могут оказаться разными?

14 января 2015 г., 11:17 пользователь Сергей Глушенко <[hidden email]> написал:

Я для этих функций использую виндовые ножница. Безумно удобно. Но у Вас насколько я помно линукс. Печалька....
А теперь серьезно.


среда, 14 января 2015 г., 13:08:54 UTC+5 пользователь Assargadon написал:
Ок. Зацикливаться может.

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

out = (pin2 XOR (pin1 XOR pin2));
так что все будет нормально



Вот в такой схеме - может ли быть так, что на нижний вход второго XOR'а поступит не то значение, которое поступало на нижний вход первого XOR'а, потому что, за время пока вычислялся первый XOR, значение на ноге успело измениться?

14 января 2015 г., 10:37 пользователь Сергей Глушенко <[hidden email]> написал:

Наверное все таки сказывается отсутствие у меня настоящего академического образования. У меня нет вышки, и как там в фильме говорится "Я консирваториев не заканчивал". Посмотрел статьи по вашим сылкам. Честно скажу - ни.... не понял.
Что я реализовал?..... Даже не знаю как ответить. Ну наверное в общих словах компиляцию схемы в скетчь. И все.
    Я действительно когда начинаю работать над новым функционалом не знаю что получится в конце. Первый шаг - реализовать эту функцию в ArduinoIDE что бы понять что это вообще возможно. После этого приступаю к реализации в коде привязываясь к существующей архитектуре. Я почти никогда не продумываю реализацию задачи заранее. Мой подход - "код покажет". Во время работы над проектом Cadel вместе с Vladimir Musulainen у нас проводился анализ задачи с разбиением на карточки,  продумыванием архитектуры и т.д. Но самое смешное что примерно в половине случаев конечная реализация сильно отличалась от задуманного. По разным причинам. Но там это было нужно для разбиения задач по участнигам группы, и расчета ориентировочного времени на реализацию. Поскольку я работаю один и учета времени от меня никто не требует в своей работе я исключил этот этап. Жалко тратить на него время.
 Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

Да можно. Частота генерации будет зависеть от тактовой частоты контроллеа и времени выполнения скана программы. Если есть интерес я могу рассказать о модели выполнения программы в микроконтроллере, и отличия ее от событийной модели в компьютере.

среда, 14 января 2015 г., 12:02:31 UTC+5 пользователь Assargadon написал:
Сергей, вот вы начали про то, что я спросил, а потом переключились на реализацию. Рассказ про реализацию довольно интересен и познавателен, но это немного не то, о чём я спрашивал.

Я хотел узнать не то, как вы реализовали, а что именно вы реализовали. Меня сейчас интересовала не императивная, а декларативная часть вашей работы.

======

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

И это была самая настоящая, физическая релейная логика, на самых настоящих реле. И она - зацикливалась.

Поскольку математику я знал куда лучше, чем электронику, я легко пришёл к тем самым "логическим цепочкам". И это помогло мне понять связь между императивной логикой и логикой булевой, а в будущем легко понять всякие там ДНФ и КНФ и даже конечные автоматы. В общем, опыт был полезный.

Так вот, вопрос: схемы, построенные в FLProg, могут зацикливаться?
Это не единственный вопрос, относящийся к фазам вычислений, но с него проще всего начать.

Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

======

P.S. Обращу, кстати, внимание: перескок с задачи на её реализацию - это такая достаточно показательная вещь. Для вас, видимо, "как сделать" и "что сделать" - очень близкие вещи, тогда как на самом деле это не совсем так. Но это тема для отдельного разговора. Хотя две ссылки я всё же приведу:

Википедия: Императивное программирование
Википедия: Декларативное программирование

14 января 2015 г., 8:03 пользователь Сергей Глушенко <[hidden email]> написал:

Это и было самое сложное в разработке проекта. Как преобразовать графическое представление схемы в код для контроллера. Тут требуется немного предыстории.
Основная идея была создать аналог сред программирования для промышленных (безумно дорогих) контролеров на дешёвые ардуинки. За базу я взял программу TiaPortal от Siemens. У них такая идеология: Вся схема разбивается на отдельные Nenwork - и. В каждом нетворке возможна только одна логическая цепочка. То есть один конечный элемент. Это может быть реле, переменная или что то еще. В общем какой - то объект в который производится запись. И схема которая собирает значение для записи. При компиляции каждый нетворк представляет одну строку конечного кода. Такого алгоритма придерживаются и остальные производители. С него начинал и я. Следы этого остались в проекте, у меня название класса описывающего плату Network. НО. Я разрабатываю проект как среду для электриков, электронщиков, да и просто любителей. Концепция логических цепочек для них тяжела. Я сам прошол путь от простого электрика - до ведущего разработчика, так что могу представить себя в шкуре любого из них. Для них понятно название "плата". То есть какой -то законченный кусок схемы выполняющий определенные функции. А на плате может быть несколько релюшек, лампочек, да и в конце концов просто выходов для связи с другими платами. Еще одна засада. Для реализации какого то блока чаще всего недостаточно только описать строкой состояние его входа. Например для блока дисплея необходимо его задекларировать, инициализировать, подключить библиотеку, в нужный момент вывести требуемый текст, да еще и определить нет ли необходимости его очистить. Это разный код в разных частях скетча.  Так что существующий алгоритм не подходил. Я пости два месяца (точнее четыре с учетом что работаю над проектом я только на вахте) я придумывал новы, свой алгоритм. В принципе это и есть моё как говорится ноу - хау. Не хочу его полностью раскрывать, но коротко могу. Я разработал собственный алгоритм разбиения схемы на куски, и систему взаимодействия схемы и компилятора. Схема и блоки обладают определенным набором интерфейсов с которыми работает компилятор. Схема умеет себя отдавать компилятору в наиболее удобном для него виде (умная женщина, мне бы такую жену))) ).Так же блоки умеют правильно отвечать на вопросы компилятора. Реализация получилась удачной. Об этом свидетельствует то, что почти за год существования проекта мне ни разу не пришлось изменять ее. Интерфейс схемы я вообще не трогал ни разу. Иногда добавляется интерфейс блоков, когда компилятору требуется каки - е то дополнительные данные от них для реализации той или иной функции. Наверное об этом и все. Больше я об этом пока ничего не раскажу Вредный я)))))

среда, 14 января 2015 г., 1:56:01 UTC+5 пользователь Assargadon написал:
Так, теперь более...глубинный вопрос.

Как организована работа с...эээ...фазой вычислений, что ли. Когда несколько виртуальных элементов стоят каскадом, то ведь всегда возникает вопрос синхронизации. Я довольно слабо представляю себе детали, но знаю, что такое явление есть.

Прокомментируете поподробнее?

13 января 2015 г., 1:47 пользователь Сергей Глушенко <[hidden email]> написал:
Большое спасибо за помощь проекту. Кстати как раз выпустил новую версию. Скорее всего следующая будет не скоро, 15-го уезжаю домой, а дома почти сразу с семьей едем в Питер. Так что продолжения придется немного подождать. Но я буду на связи, у меня телефон умный)))

среда, 7 января 2015 г., 14:29:18 UTC+5 пользователь Assargadon написал:
Вопрос первый: а есть какая-нибудь возможность получить версию под Linux? У cincom была, насколько я помню, линуксовая VMка, так что это не должно быть слишком сложно.

Вопрос второй: FLProg на выходе генерирует каноничный C-код, или богомерзкие скетчи на этом их внутреннем ардуиновском недоСи?

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Вопросы о FLProg

Сергей Глушенко
Может и стандартный прием, но я обычно хранил кэш в самих инстансах, и мне как то не приходила в голову идея внешнего кэша.

четверг, 15 января 2015 г., 0:52:10 UTC+5 пользователь Assargadon написал:
Список точек наверное будет не правильно.
 
Когда я говорил о "точках", я имел в виду не "пиксели изображения", а как раз "точки подключения". Выходы для входов и входы для выходов.

Хотя стоит подумать над таким кэшем. Спасибо за идею

Пожалуйста. Обращайтесь.

P.S. Но, конечно, хотя мне льстит ваша благодарность, должен сказать, что это не вполне корректно назвать "идеей". Это стандартный общеизвестный приём. Никто ведь не назовёт забивание в стенку гвоздя "идеей по размещению пальто" :)

14 января 2015 г., 18:47 пользователь Сергей Глушенко <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="GiZ1rdMczLQJ" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">sup...@...> написал:
Список точек наверное будет не правильно. Его же придется составлять отдельно для каждого выхода. Ну и наверное тогда не список точек а список входов к  которым нельзя прицепиться. Хотя стоит подумать над таким кэшем. и список можно составлять не для всех входов а только для не подключенных.  к подключенным входам нельзя подключить другой выход. Спасибо за идею

среда, 14 января 2015 г., 19:23:04 UTC+5 пользователь Assargadon написал:
Ну да. Обработка циклов - это один из элементов управления фазой.
Увы, я очень мало про это знаю - знаю, что такое есть, знаю, что от этого бывают проблемы - но ни терминологии, ни что придумали в качестве решений - нету. Я потому и задавал вопрос вам - надеялся узнать :)


Я сейчас ищу способ запретить создание таких связей с минимальным торможением при отрисовке.

В начале рисования просто составляете список всех точек, куда можно присоединить выход и просто не присоединяете его туда, куда нельзя. Всё равно вы это делаете в рудиментарном виде - ведь завести выход на собственный вход нельзя. Если не делать этот обсчёт при каждом mouse move, а только вначале - тормозить не будет.

Но для начала вы бы добавили этот запрет в проверку проекта. Если есть цикл - проект некорректен.

14 января 2015 г., 17:11 пользователь Сергей Глушенко <[hidden email]> написал:

Падения происходят из за компилятора. При поиске предыдущего блока при создании цепочки если есть прямая связь без переменной  между выходом одного блока со входом другого в пределах той же цепочки, компилятор зацикливается и программа зависает. Я сейчас ищу способ запретить создание таких связей с минимальным торможением при отрисовке. Пока не нашёл, хотя подвижка уже есть. Но такое может возникнуть и при одной цепочке и при образе процесса. У сименса такие фокусы с прямым соеденением то же программно запрещенны. ТОлько через переменную


среда, 14 января 2015 г., 18:58:16 UTC+5 пользователь Assargadon написал:
Вроде слово фаза я нигде не использовал.

Да, его использовал я. Не знаю, как в точности это называется.

Смысл явления в том, что на срабатывание каждого элемента необходимо определенное время. Соответственно, изменения состояния "распространяются" от входов своеобразной "волной", и эта "волна" достигает разных элементов в разное время. Именно благодаря этому системы из реле могут зацикливаться и работать как генераторы. Вот это я и называю "фазой".

Смысл выделения отдельных цепочек в логических контроллерах как раз ровно в этом - борьба с биениями выходов, исключение циклов.

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

14 января 2015 г., 14:11 пользователь Сергей Глушенко <[hidden email]> написал:

Да в первом ответе я немного ошибся. Не сообразил что Вы использовали входа а не переменные. После Вашего комментария я понял ошибку, и постарался объяснить ситуацию. К сожалению из меня объясняльщик не очень, но я над собой работаю)))). Правда теперь я немного не понял. Что Вы имеете в виду под "Управлением фазой". Вроде слово фаза я нигде не использовал.

среда, 14 января 2015 г., 16:04:59 UTC+5 пользователь Assargadon написал:
Сергей, я прекрасно понял эту часть ваших слов, хотя за картинку спасибо. Мне просто как раз было интересно, для "управления фазой" вы использовали таблицу состояний, функциональные извращения или просто забили. Просто в начале вы сказали, что 

Код который получится в скетче (без учета синтсиса так для примера)
out = (pin2 XOR (pin1 XOR pin2)); 
так что все будет нормально

и это меня сбило, поскольку противоречило последующим словам. И я не был уверен, какой же из двух озвученных вами вариантов имеет место на самом деле :) Ну, теперь знаю. Спасибо.



14 января 2015 г., 13:56 пользователь Сергей Глушенко <[hidden email]> написал:

<a style="margin-left:1em;margin-right:1em" href="https://lh3.googleusercontent.com/-i-O5WkeL2gs/VLZK6T0v1HI/AAAAAAAAAC8/dDduKcAvb-0/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA12345678.PNG" target="_blank" onmousedown="this.href='https://lh3.googleusercontent.com/-i-O5WkeL2gs/VLZK6T0v1HI/AAAAAAAAAC8/dDduKcAvb-0/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA12345678.PNG';return true;" onclick="this.href='https://lh3.googleusercontent.com/-i-O5WkeL2gs/VLZK6T0v1HI/AAAAAAAAAC8/dDduKcAvb-0/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA12345678.PNG';return true;">

Ключевая фраза

Достаточно в любом месте программы счтать значение железного входа в переменную...
..
 Я как раз сказал что в вашем случае вероятность того что на вход первого придет не то же значение что и второго в принципе возможна.
digitalRead (1)   это чтение состояние ноги контроллера. И да если в течении выполнения первого XORнапряжение на ноге изменится то при следующем чтении значение будет другим. Поэтому я и рекомендовал в случае критичности такой ситуации прочитать значение входа в переменную и использовать ее.
 У меня что то плохо получается вставлять картинки сюда, она вставилась в самый верх сообщения. Попробуйте собрать такую схему и посмотрите что получится в результате. Вот там точно значения не изменятся.







среда, 14 января 2015 г., 15:45:46 UTC+5 пользователь Assargadon написал:
хоть и расчет XOR занимает наносекунды

Это как раз неважно. Там же может и не XOR стоять. Там может стоять цепочка в 100500 логических элементов, или ещё что-нибудь посложнее.


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

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

Поэтому я сгенерировал скетч, и вижу там
digitalWrite(2,  ( ( (digitalRead (1))) ^ ( (digitalRead (4))) ) ^ ( (digitalRead (4))) );
Я так понимаю, digitalRead - это чтение бита из порта, а не из буфера. То есть, как я понимаю, на вход второго XOR'а может попасть не тот бит, который попал на первый XOR. Поправьте, если я ошибся.


14 января 2015 г., 12:36 пользователь Сергей Глушенко <[hidden email]> написал:

Нормально - это конечно когда разные сигналы придти не могут. В Вашем примере это в принципе возможно. Хоть и расчет XOR занимает наносекунды в принципе есть вероятность того что за это время состояние входа изменится. Я об этой возможности рассказывал в первых видеоуроках. Так же давал решение для тех коому этот вопрос важен. Достаточно в любом месте программы счтать значение железного входа в переменную, и использовать эти переменные в программе. Тогда в течении скана программы значение этих переменных не изменится. Вообще все эти вопросы решает подход с использованием принципа образа процесса. То есть в начале скана все входа контроллера считываются в переменные, в процессе скана работа ведется только с ними. результаты работы заносятся в переменные. В конце скана полученные результаты записываются в железные выхода. Но такой подход требует выделения дополнительной памяти под образ процесса. А у ардуино ее и так немного. Поэтому я отказался от такого подхода.

среда, 14 января 2015 г., 13:34:15 UTC+5 пользователь Assargadon написал:
так что все будет нормально

Сергей, так в этом же и вопрос.
Для вас "нормально" - это как именно? :)

Нормально - это когда на вход первого и второго XOR'а могут придти разные биты? Или когда они не могут оказаться разными?

14 января 2015 г., 11:17 пользователь Сергей Глушенко <[hidden email]> написал:

Я для этих функций использую виндовые ножница. Безумно удобно. Но у Вас насколько я помно линукс. Печалька....
А теперь серьезно.


среда, 14 января 2015 г., 13:08:54 UTC+5 пользователь Assargadon написал:
Ок. Зацикливаться может.

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

out = (pin2 XOR (pin1 XOR pin2));
так что все будет нормально



Вот в такой схеме - может ли быть так, что на нижний вход второго XOR'а поступит не то значение, которое поступало на нижний вход первого XOR'а, потому что, за время пока вычислялся первый XOR, значение на ноге успело измениться?

14 января 2015 г., 10:37 пользователь Сергей Глушенко <[hidden email]> написал:

Наверное все таки сказывается отсутствие у меня настоящего академического образования. У меня нет вышки, и как там в фильме говорится "Я консирваториев не заканчивал". Посмотрел статьи по вашим сылкам. Честно скажу - ни.... не понял.
Что я реализовал?..... Даже не знаю как ответить. Ну наверное в общих словах компиляцию схемы в скетчь. И все.
    Я действительно когда начинаю работать над новым функционалом не знаю что получится в конце. Первый шаг - реализовать эту функцию в ArduinoIDE что бы понять что это вообще возможно. После этого приступаю к реализации в коде привязываясь к существующей архитектуре. Я почти никогда не продумываю реализацию задачи заранее. Мой подход - "код покажет". Во время работы над проектом Cadel вместе с Vladimir Musulainen у нас проводился анализ задачи с разбиением на карточки,  продумыванием архитектуры и т.д. Но самое смешное что примерно в половине случаев конечная реализация сильно отличалась от задуманного. По разным причинам. Но там это было нужно для разбиения задач по участнигам группы, и расчета ориентировочного времени на реализацию. Поскольку я работаю один и учета времени от меня никто не требует в своей работе я исключил этот этап. Жалко тратить на него время.
 Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

Да можно. Частота генерации будет зависеть от тактовой частоты контроллеа и времени выполнения скана программы. Если есть интерес я могу рассказать о модели выполнения программы в микроконтроллере, и отличия ее от событийной модели в компьютере.

среда, 14 января 2015 г., 12:02:31 UTC+5 пользователь Assargadon написал:
Сергей, вот вы начали про то, что я спросил, а потом переключились на реализацию. Рассказ про реализацию довольно интересен и познавателен, но это немного не то, о чём я спрашивал.

Я хотел узнать не то, как вы реализовали, а что именно вы реализовали. Меня сейчас интересовала не императивная, а декларативная часть вашей работы.

======

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

И это была самая настоящая, физическая релейная логика, на самых настоящих реле. И она - зацикливалась.

Поскольку математику я знал куда лучше, чем электронику, я легко пришёл к тем самым "логическим цепочкам". И это помогло мне понять связь между императивной логикой и логикой булевой, а в будущем легко понять всякие там <a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%B7%D1%8A%D1%8E%D0%BD%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BD%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B8%25D0%25B7%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGoyWwIDQlFrwWl9nkNYHWwCvtAtw';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B8%25D0%25B7%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGoyWwIDQlFrwWl9nkNYHWwCvtAtw';return true;">ДНФ и <a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%8A%D1%8E%D0%BD%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BD%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%259A%25D0%25BE%25D0%25BD%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGTy9WZIQMiSeLgsPbmxUfOy69cew';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%259A%25D0%25BE%25D0%25BD%25D1%258A%25D1%258E%25D0%25BD%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BD%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0%25D0%25BB%25D1%258C%25D0%25BD%25D0%25B0%25D1%258F_%25D1%2584%25D0%25BE%25D1%2580%25D0%25BC%25D0%25B0\46sa\75D\46sntz\0751\46usg\75AFQjCNGTy9WZIQMiSeLgsPbmxUfOy69cew';return true;">КНФ и даже конечные автоматы. В общем, опыт был полезный.

Так вот, вопрос: схемы, построенные в FLProg, могут зацикливаться?
Это не единственный вопрос, относящийся к фазам вычислений, но с него проще всего начать.

Могу я построить генератор типа "саморазмыкающееся реле"?
А если могу - с какой частотой он будет осциллировать?

======

P.S. Обращу, кстати, внимание: перескок с задачи на её реализацию - это такая достаточно показательная вещь. Для вас, видимо, "как сделать" и "что сделать" - очень близкие вещи, тогда как на самом деле это не совсем так. Но это тема для отдельного разговора. Хотя две ссылки я всё же приведу:

<a href="https://ru.wikipedia.org/wiki/%D0%98%D0%BC%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2598%25D0%25BC%25D0%25BF%25D0%25B5%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNF5yT_W1tYkmx_qz8DAY8OB5cmjhg';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2598%25D0%25BC%25D0%25BF%25D0%25B5%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNF5yT_W1tYkmx_qz8DAY8OB5cmjhg';return true;">Википедия: Императивное программирование
<a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BA%D0%BB%D0%B0%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" target="_blank" onmousedown="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B5%25D0%25BA%25D0%25BB%25D0%25B0%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNGMApeHNnII_LY7EVzyuHWX2I0NTA';return true;" onclick="this.href='https://www.google.com/url?q\75https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2594%25D0%25B5%25D0%25BA%25D0%25BB%25D0%25B0%25D1%2580%25D0%25B0%25D1%2582%25D0%25B8%25D0%25B2%25D0%25BD%25D0%25BE%25D0%25B5_%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B3%25D1%2580%25D0%25B0%25D0%25BC%25D0%25BC%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5\46sa\75D\46sntz\0751\46usg\75AFQjCNGMApeHNnII_LY7EVzyuHWX2I0NTA';return true;">Википедия: Декларативное программирование

14 января 2015 г., 8:03 пользователь Сергей Глушенко <[hidden email]> написал:

Это и было самое сложное в разработке проекта. Как преобразовать графическое представление схемы в код для контроллера. Тут требуется немного предыстории.
Основная идея была создать аналог сред программирования для промышленных (безумно дорогих) контролеров на дешёвые ардуинки. За базу я взял программу TiaPortal от Siemens. У них такая идеология: Вся схема разбивается на отдельные Nenwork - и. В каждом нетворке возможна только одна логическая цепочка. То есть один конечный элемент. Это может быть реле, переменная или что то еще. В общем какой - то объект в который производится запись. И схема которая собирает значение для записи. При компиляции каждый нетворк представляет одну строку конечного кода. Такого алгоритма придерживаются и остальные производители. С него начинал и я. Следы этого остались в проекте, у меня название класса описывающего плату Network. НО. Я разрабатываю проект как среду для электриков, электронщиков, да и просто любителей. Концепция логических цепочек для них тяжела. Я сам прошол путь от простого электрика - до ведущего разработчика, так что могу представить себя в шкуре любого из них. Для них понятно название "плата". То есть какой -то законченный кусок схемы выполняющий определенные функции. А на плате может быть несколько релюшек, лампочек, да и в конце концов просто выходов для связи с другими платами. Еще одна засада. Для реализации какого то блока чаще всего недостаточно только описать строкой состояние его входа. Например для блока дисплея необходимо его задекларировать, инициализировать, подключить библиотеку, в нужный момент вывести требуемый текст, да еще и определить нет ли необходимости его очистить. Это разный код в разных частях скетча.  Так что существующий алгоритм не подходил. Я пости два месяца (точнее четыре с учетом что работаю над проектом я только на вахте) я придумывал новы, свой алгоритм. В принципе это и есть моё как говорится ноу - хау. Не хочу его полностью раскрывать, но коротко могу. Я разработал собственный алгоритм разбиения схемы на куски, и систему взаимодействия схемы и компилятора. Схема и блоки обладают определенным набором интерфейсов с которыми работает компилятор. Схема умеет себя отдавать компилятору в наиболее удобном для него виде (умная женщина, мне бы такую жену))) ).Так же блоки умеют правильно отвечать на вопросы компилятора. Реализация получилась удачной. Об этом свидетельствует то, что почти за год существования проекта мне ни разу не пришлось изменять ее. Интерфейс схемы я вообще не трогал ни разу. Иногда добавляется интерфейс блоков, когда компилятору требуется каки - е то дополнительные данные от них для реализации той или иной функции. Наверное об этом и все. Больше я об этом пока ничего не раскажу Вредный я)))))

среда, 14 января 2015 г., 1:56:01 UTC+5 пользователь Assargadon написал:
Так, теперь более...глубинный вопрос.

Как организована работа с...эээ...фазой вычислений, что ли. Когда несколько виртуальных элементов стоят каскадом, то ведь всегда возникает вопрос синхронизации. Я довольно слабо представляю себе детали, но знаю, что такое явление есть.

Прокомментируете поподробнее?

13 января 2015 г., 1:47 пользователь Сергей Глушенко <[hidden email]> написал:
Большое спасибо за помощь проекту. Кстати как раз выпустил новую версию. Скорее всего следующая будет не скоро, 15-го уезжаю домой, а дома почти сразу с семьей едем в Питер. Так что продолжения придется немного подождать. Но я буду на связи, у меня телефон умный)))

среда, 7 января 2015 г., 14:29:18 UTC+5 пользователь Assargadon написал:
Вопрос первый: а есть какая-нибудь возможность получить версию под Linux? У cincom была, насколько я помню, линуксовая VMка, так что это не должно быть слишком сложно.

Вопрос второй: FLProg на выходе генерирует каноничный C-код, или богомерзкие скетчи на этом их внутреннем ардуиновском недоСи?

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" onmousedown="this.href='http://groups.google.ru/group/sugr';return true;" onclick="this.href='http://groups.google.ru/group/sugr';return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="GiZ1rdMczLQJ" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
12