PDA

Просмотр полной версии : АСУ ТП в облаке — быстрая разработка проектов



Миних В.А.
27.01.2016, 09:23
При разработке программного обеспечения проекта АСУ ТП, от проекта к проекту инженер совершает много рутинных действий:
- переписывает из ТЗ в проект перечень сигналов;
- задает шкалы приборов;
- создает перечни механизмов;
- формирует списки сигналов для SCADA и переносит их туда;
- почти по всем входным сигналам создает типовые АПС (аварийно-предупредительные сообщения) по обрывам каналов, выходам за диапазон и т.д.;
- далее, на основании этих АПС, перечней сигналов и механизмов создает логику в программе, которая по сути типовая (одинаковая для большинства сигналов и механизмов).

Насколько я знаю, да и сам так делал, большинство инженеров уже автоматизировали эти действия с помощью Excel.
В Excel вводятся исходные данные и далее, с помощью макросов, генерируется логика для импорта в среду разработки (Simatic Manager, GE Proficy ME и т.д). Другие макросы генерируют перечни сигналов для импорта в ту же среду разработки и в SCADA системы. Иногда этого достаточно, но по своему опыту знаю, что у каждого инженера есть свой «эксельчик», который он холит и лелеет, и потихонечку забивает его макросами до тех пор, пока там не начинается ад.

Наигравшись с экселем мы решили разработать концепт такого конфигуратора, но уже на java. Это приложение должно работать в облаке организации, и быть доступно всем инженерам. Инженер может создать свой проект с нуля, или сделать копию с уже существующего. Появляется возможность создать для проекта своего рода базу данных, в которой будут храниться все данные. Набивку сигналов можно поручить менее квалифицированным специалистам. У инженера появится больше времени на разработку и отладку логики работы и алгоритмов, а у организации появится возможность выбора платформы под желания заказчика.
Конфигуратор должен уметь генерировать данные для большинства контроллеров (ПЛК и SCADA систем. В отличии от систем автоматизации вроде PCS7 и PPS, которые умеют работать с общей базой сигналов и механизмов, наша система позволит отвязаться от платформы.

Как вы думаете, был бы разработчикам интересен такой инструмент?
Приглашаю к дискуссии.

Демо идеи:

https://youtu.be/CI0W338PDQo

Вот предварительное описание идеи (будет дополняться), скриншоты взял из прототипа.

Разработка проекта начинается с ввода пользователем исходных данных в конфигуратор. Исходными данными является перечень сигналов. Для каждого сигнала задается алгоритмическое имя, описание, клеммы подключения, клеммники, преобразователи, позиция в модуле контроллера и т.д. Для сигналов по которым формируются аварийные и предупредительные сообщения АПС, вводятся уставки срабатывания и типы АПС. Для аналоговых сигналов задаются диапазоны измерения.
22575
Так же в качестве исходных данных может выступать перечень исполнительных механизмов (ИМ). В этом случае пользователь вводит перечень в конфигуратор, а соответствующие сигналы, которые подключены к каждому механизму создаются автоматически (при условии что они отсутствуют в перечне сигналов). Например если ввести ИМ "Кран 1", то автоматически будут сформированы сигналы "Кран 1. открыт", "Кран 1. закрыт", "Кран 1. открыть", "Кран 1. закрыть" и т.д.
Для каждого ИМ задается алгоритмическое имя, описание, тип механизма, диагностические таймера и осуществляется привязка к перечню дискретных сигналов.
22576
После того, как станет известна конфигурация аппаратной части контроллера, ее необходимо ввести в конфигуратор. На основании этой информации будут формироваться АПС по диагностике аппаратной части контроллера. Конфигурация контроллера осуществляется путем выбора из библиотечных данных типов модулей.
22577
Вся информация сохраняется в базе данных (БД). Так же в БД сохраняется справочная информация: типы модулей, преобразователей, клеммников и др. оборудования. Справочная информация будет дополняться в процессе эксплуатации конфигуратора. В дальнейшем эта информация может использоваться для составления смет и спецификаций оборудования для конкретного проекта.
Конфигуратор осуществляет контроль уникальности имен переменных, автоматическое присвоение сигналам регистровых значение из заданного диапазона. Все это позволяет избежать ошибок связанных с человеческим фактором: ошибок в расхождении адресов для ME и SCADA, в проектировании логики обработки АПС и ИМ.
Т.к. вся информация храниться в единой БД, то исключается вероятность ошибок связанных с дублированием данных.

На основании введенной информации формируются следующие файлы и документы:
- файл с перечнем сигналов для импорта в Machine Edition (ME)
- XML файл логики обработки аналоговых сигналов для импорта в ME
- XML файл логики обработки исполнительных механизмов (ИМ) для импорта в ME
- XML файл логики обработки аварийно-предупредительных сигналов (АПС) для импорта в ME
- файл с перечнем сигналов для импорта в SCADA систему
- файл с перечнем ИМ и связанных с ними сигналов для импорта в SCADA систему
- ТЭ5, перечень сигналов, перечень АПС, спецификация.
Файлы с перечнем сигналов представляют из себя текстовые документы в формате CSV, которые позволяют быстро и без ошибок осуществлять импорт новых и обновление существующих сигналов в ME и SCADA систему.
XML файлы с логикой представляют из себя текстовые документы в формате XML которые позволяют осуществлять импорт логики в ME, избежать ошибок и ускорить время разработки ПО.

Хочу сказать, что на этом прототипе я сделал проект для компрессорной станции.


Тут пример как это делаем в Excel
http://www.owen.ru/forum/showthread.php?t=23191&p=197395&viewfull=1#post197395

Scream
27.01.2016, 10:13
Ну... видео красивое, молодцы, за видео 5.

Миних В.А.
27.01.2016, 10:22
Ну... видео красивое, молодцы, за видео 5.
Мы старались!

Вольд
27.01.2016, 10:34
И по чем будет это удовольствие ?

Миних В.А.
27.01.2016, 10:44
И по чем будет это удовольствие ?

Мы про цену еще не думали, хотим сначала понять нужно ли это кому нибудь?

Миних В.А.
27.01.2016, 10:46
У нас есть много наработок по "эксельчикам" и прототип с минимальным функционалом. Но надо понять какой функционал необходим

krollcbas
27.01.2016, 12:35
Владимир, привет!
Подолью я немного скептицизма (ложку дегтя) к данной идее.
1. Много что в мире стоит денег и очень малым составом из всего того платного изобилия я пользуюсь.
Скорее сказать пользуюсь только тогда, когда руки выкручены и никак иначе уже не получается, USB HASP KEY не удается обойти
2. Каждый инженер, ты прав, привыкает к каким то методам работы (своим методам работы). Вряд ли кто-то захочет ими делиться, хотя по сути не верно. Если бы все однообразно работали и передавали бесплатно плоды труда, наследуемость проектов была бы лучше. Правда тогда идея капитализма рухнет и все станем строить большой социалистический муравейник.
3. Задача моя как инженера сводится к тому, чтоб как можно больше работы переложить на плечи Заказчика. Он платит, он проверяет, от его участия в проекте сильно зависит общий результат. Соответственно мне удобнее для работы и было и будет использовать Эксель+Визио+Автокад

Николаев Андрей
27.01.2016, 12:48
Видео красивое.
С интересом буду следить за проектом.
Но, честно говоря, согласен с Вячеславом - присутствует доля скептицизма.
Очень, очень большая работа. Соответственно такой продукт, если он качественный, не может быть дешевым.
И Вы попадете на стык с программами для монтажников AutoCAD с библиотеками, Eplan portal и т.д. И порталами производителей оборудования, типа TIA портал от Семена и соответствующих продуктов других производителей. Большинство из них имеет экспорт в xml.

Миних В.А.
27.01.2016, 13:09
я работал в компании, дочерней от газпрома. У нас было много проектов с большим количеством сигналов (~400) и разработчики тратили много времени на подготовку к проекту. Причем у каждого был свой эксельчик. А потом мы получали большой зоопарк проектов. И надо было наладчиков потом обучать. И остро стоял вопроc в таком вот инструменте. Даже хотели PPS за много долларов купить.
С точки зрения инженера, этот продукт скорее всего не нужен, каждый разработчик включает режим бога (сам так же поступал) и говорил: зачем? я сам все напишу! и тратил кучу времени.
А вот компании, которые платят инженерам, вот тут думаю интерес будет. Грамотный руководитель лучше заплатит за инструмент, чем за время, которое его инженеры будут тратить на этот инструмент.
Но может я не прав... Для выяснения я и завел данную тему.

Миних В.А.
27.01.2016, 13:28
Очень, очень большая работа. Соответственно такой продукт, если он качественный, не может быть дешевым.

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


И Вы попадете на стык с программами для монтажников AutoCAD с библиотеками, Eplan portal и т.д. И порталами производителей оборудования, типа TIA портал от Семена и соответствующих продуктов других производителей. Большинство из них имеет экспорт в xml.
да, многие программы умеют делать импорт/экспорт, но они не имеют главного: единой базы данных. Все это отдельные продукты и надо писать кучу макросов. а тут идея создать надстройку над всем этим. и без привязки к конкретной платформе. Я знаю некоторые делают выгрузки из Simatic HW config в автокад! и генерируют оттуда чертежи рэка.

Я просто отработав 15 лет в АСУ ТП, теперь перешел в Java разработчики. Я вижу какие тут есть инструменты. Потому что люди делают их сообща, а не пилют для себя свои эксельчики. Может нам тоже надо начать упрощать себе жизнь?
Взять и сообща сделать крутой продукт!

lara197a
27.01.2016, 13:36
Мы тут только локальными проектами занимаемся.
Такой продукт не нужен.
Для больших проектов, как верно замечено есть ТИА к примеру.
Ваш труд по достоинству могут оценить только в крупной компании.
Кто к примеру свои АЭС, заводы строит.
Т.е. это для большого нишевого проекта.
А мы мелочевкой промышляем.
В основном случайные проекты.
Даже не мелкосерийные. а как правило разовые.
Нет смыла пытаться продвигать подобные решения в этой аудитории.

Владимир Ситников
27.01.2016, 13:37
Может нам тоже надо начать упрощать себе жизнь?

Вот "игра наоборот" (10 лет в java, и сейчас буду развлекаться с плк110): http://www.owen.ru/forum/showthread.php?t=23013
Но мне, честно говоря про "АСУ ТП часть" пока сложно судить. Из видео реально непонятно. Хоть какой-нибудь end-to-end пример бы.

Миних В.А.
27.01.2016, 13:47
Вот "игра наоборот" (10 лет в java, и сейчас буду развлекаться с плк110): http://www.owen.ru/forum/showthread.php?t=23013
Но мне, честно говоря про "АСУ ТП часть" пока сложно судить. Из видео реально непонятно. Хоть какой-нибудь end-to-end пример бы.

Владимир, я вас понимаю! игра наоборот - это ад))) Если сравнивать Intellij IDEA с любой АСУТПшной IDE, так лучше и не сравнивать (это не наезд, имел возможность сам оценить). Жаль никто из инженеров не пробовали работать в Intellij IDEA. И жаль нет таких инструментов в АСУ ТП.

Миних В.А.
27.01.2016, 15:04
Из видео реально непонятно. Хоть какой-нибудь end-to-end пример бы.

пример такой:
Вот вы используете Intellij Idea или эклипс, ну может еще нет бинс. И если возникает какая то рутинная задача (или например задача, которую вы описали в http://www.owen.ru/forum/showthread.php?t=23013) , то пишется плагин. тк сред разработки немного, то все ок.
В АСУ ТП большой зоопарк контроллеров, у каждого своя IDE. еще есть большое кол-во SCADA систем.
Теперь в соответствии с ТЗ составляется перечень сигналов, которые обрабатывает ПЛК. Далее сигналы передаются в SCADA, причем сигнал может иметь другой адрес (для логической развязки или масштабирования). Приходится делать макрос в Excel, который создаст сигналы для ПЛК и SCADA. И это только одна из задач.
Да вы, я думаю, и сами заметили сколько проблем возникает (когда попробовали CodeSys). А это не самая худшая среда.
У всех АСУТПшных IDE одна проблема - минимальное наличие автоматизации рутинных операций.

Решение предложенное в http://www.owen.ru/forum/showthread.php?t=23013 крутое, но мы вряд ли сможем (по крайней мере не так быстро) написать плагин под IDEA.

Может попробовать сообща сделать хороший продукт? Вы, как java специалист (я был на лекции на java.jug), и мы как автоматчики. Может еще кто присоединиться.

Миних В.А.
27.01.2016, 15:06
Нет смыла пытаться продвигать подобные решения в этой аудитории.
Спасибо за ответ!
Опять же повторюсь, я не продвигаю, а спрашиваю мнения.

capzap
27.01.2016, 18:15
это как то с санкциями связано что ли, такой наплыв желающих помочь бедным программистам асутп автоматизировать процесс написания кода впоследний месяц, мне кстати тоже поступало предложение поучаствовать в группе разработчиков чего то подобного, получается либо таких фирм будет много, либо это одни и те же.
А по теме, всем не угодите как ни старайтесь, в любом случае клиенты захотят свой ексельчик, хоть и на яве написаный

Миних В.А.
27.01.2016, 18:36
это как то с санкциями связано что ли, такой наплыв желающих помочь бедным программистам асутп автоматизировать процесс написания кода впоследний месяц, мне кстати тоже поступало предложение поучаствовать в группе разработчиков чего то подобного, получается либо таких фирм будет много, либо это одни и те же.
А по теме, всем не угодите как ни старайтесь, в любом случае клиенты захотят свой ексельчик, хоть и на яве написаный

Просто хочется вывести процесс разработки проектов в АСУ ТП на новый уровень) может конечно я замахнулся... но вот Владимир http://www.owen.ru/forum/showthread.php?t=23013 показал, как можно сделать инструмент для более продуктивной работы. Чтобы не ексельчики плодить, а использовать больше времени на разработку и тестирование логики. А если еще и тестирование автоматизировать! ууу!!

lara197a
27.01.2016, 18:44
... но вот Владимир ....
по большей части предлагал нововведения, которые уже есть в КДС.
Он просто не читал инструкцию и не знал где это находится.
Мне это напомнило Дениса Попова и его операционную систему - BolgenOS...
http://trindelka.net/forum/programmi-soft/denis-popov-i-ego-operatcionnaya-sistema-bolgenos-t4556.html

Миних В.А.
27.01.2016, 18:49
по большей части предлагал нововведения, которые уже есть в КДС.
http://trindelka.net/forum/programmi-soft/denis-popov-i-ego-operatcionnaya-sistema-bolgenos-t4556.html
Да вы что, то что я видел на видео в CS нету. я вот думаю Владимир еще и версионирование сделает в git.
Насколько я знаю, пока что большинство инженеров асутп пользуются инструментом версионирования под названием rar...
Просто он делал свой продукт всего месяц)

Миних В.А.
27.01.2016, 18:51
На самом деле очень хорошо, что некоторые не хотят мириться с существующими проблемами и пытаются как то поменять существующий много лет порядок вещей.

lara197a
27.01.2016, 19:31
Занимаюсь автоматикой с нулевых.
на моих глазах происходило развитие
систем программирования Сименса, как самой сильно эволюционировавшей среды.
Вот относительно нее и нужно сравнивать всех остальных.
почти у всех- копирайт сименса.
Из наших, очень оригинальных разработок, начавших свой путь в 10-х, посмотрите на ZWorkbench, FBDEdit, cannylab.
Ребята уже не один год занимаются своими средствами разработки и программирования.
Зная сколько в это вложено, как это дается, я скептически отношусь к "революциям" за одну ночь сделанной
одиночкой в порыве озарения и прочим продуктам написанным на коленке.
это время давно прошло.

Миних В.А.
27.01.2016, 19:45
Из наших, очень оригинальных разработок, начавших свой путь в 10-х, посмотрите на ZWorkbench, FBDEdit, cannylab.


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

Миних В.А.
27.01.2016, 20:09
Из наших, очень оригинальных разработок, начавших свой путь в 10-х, посмотрите на ZWorkbench, FBDEdit, cannylab.


Сдается мне, что это не совсем то, что я предлагаю. я не собираюсь делать среду разработки. я собираюсь сделать надстройку над ней.
Вот как автокад - это же крутой продукт, но для него есть очень много надстроек для решения конкретных задач.
Иначе зачем все разработчики, и многие об этом пишут в данной теме, делают свои эксельчики? Они их делают для расширения возможностей.
И я так делал. а теперь предлагаю обобщить эти знания в один продукт. Чтоб у всех был такой эксельчик.

Миних В.А.
27.01.2016, 20:10
Пока я убеждаюсь, что такой инструмент инженерам не очень нужен.
Надо пробовать выходить на начальство инженеров) и хозяев фирм по автоматизации.
Сместить так сказать целевую аудиторию.

rovki
27.01.2016, 20:31
Пока я убеждаюсь, что такой инструмент инженерам не очень нужен.
Надо пробовать выходить на начальство инженеров) и хозяев фирм по автоматизации.
Сместить так сказать целевую аудиторию.
Крупных фирм .....:cool:

lara197a
27.01.2016, 21:10
Владимир, я не про Вашу нишу писал.
У Вас действительно др. продукт.
Новый и оригинальный.

qs212
27.01.2016, 21:19
Добрый день.
Специально зарегился на вашем форуме, чтобы обсудить данный проект.
ТС, а Вы не пытались поискать у иностранцев что то подобное? Идея то наверняка многим в голову приходила
Еще, КМК в России оно не будет очень востребовано, так как промышленности у нас не много и с автоматизацией не очень
И еще, опять же ИМХО, коммерческая версия такого продукта должна быть развитием бесплатной. Тогда не будет вопросов что это за зверь и зачем он нужен.

Scream
27.01.2016, 21:30
ага, давайте так будем делать "ну у кого-то уже такое есть, значит делать не буду"

Миних В.А.
27.01.2016, 22:00
Добрый день.
ТС, а Вы не пытались поискать у иностранцев что то подобное? Идея то наверняка многим в голову приходила

Может быть кто нибудь из уважаемого сообщества знает ответ на этот вопрос? Буду очень благодарен! Сам пробовал искать, но пока ничего, кроме PCS7 и PPS не нашел.
PCS7 умеет работать (опять же насколько я знаю) только с Simatic + WinCC.
PPS умеет работать с GE-IP + Cimplicity или iFix.
Получается что гиганты заточены только на свое оборудование и свой софт. И цена у них, извините...



И еще, опять же ИМХО, коммерческая версия такого продукта должна быть развитием бесплатной. Тогда не будет вопросов что это за зверь и зачем он нужен.
На данный момент есть небольшой бэкэнд для GE Proficy ME и Intouch. Интерфейс тоже есть, но он десктопный и сыроватый.. Если решим, что продукт необходим, можно будет собрать в облаке небольшую демку для бесплатного опробования.

qs212
27.01.2016, 23:09
PCS кстати тоже не заточен под автоматизацию рутинных операций. Там все интегрировано, это да. Но копипастингом заниматься тоже приходится. Причем в графических средах (SFC, CFC) с автоматизацией вообще никак.

ЗЫ: Как то у меня была задачка - молочный завод. На симатике без PCS. Там была распределенная периферия, около 30 таких вот шкафов:

22093

В шкафу ~50 клапанов, несколько датчиков температуры, давления.
Как представил себе процесс копипастинга вызовов функций обработки всего этого, так и быстренько написал скриптик, которому на входе шаблон и имена объектов, а на выходе SCL код. Хотя понятно, что ради нескольких десятков объектов не стоит заморачиваться.

krollcbas
28.01.2016, 01:17
Владимир, стоит наверное указать
1. назначение данного продукта, для каких именно брендов будет работать
2. какие выгоды получит интегратор от использования продукта
3. какая будет стоимость и как будет защищена программа

Часто скрытые косяки в системе выявляются при написании руководства оператора)

lara197a
28.01.2016, 01:32
ЗЫ: Как то у меня была задачка - молочный завод. На симатике без PCS. Там была распределенная периферия, около 30 таких вот шкафов:
Как представил себе процесс копипастинга вызовов функций обработки всего этого, так и быстренько написал скриптик, которому на входе шаблон и имена объектов, а на выходе SCL код. Хотя понятно, что ради нескольких десятков объектов не стоит заморачиваться.
Не понял, хардвером не пользуетесь?
Сименс сам адресное пространство распределяет.
вложение не работает.
Я обслуживал мультиконтроллерные объекты,
по 4шт S300 и 4шт S400 с большой переферией,
типа завод, на несколько тысяч точек ввода-вывода.
Все в ручную немец писал. И все понятно.

Миних В.А.
28.01.2016, 11:10
Владимир, стоит наверное указать
1. назначение данного продукта, для каких именно брендов будет работать

Основное назначение продукта: ускорение разработки проектов АСУ ТП за счет автоматизации рутинных операций. Обобщение опыта (перенос из эксельчиков) разработчиков в одном продукте.
Бренды: думаю сименс обязательно, потом аленбредли, омрон. Поддержка кодесис.
Из SCADA: WinCC, Intouch.


2. какие выгоды получит интегратор от использования продукта

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


3. какая будет стоимость и как будет защищена программа

Про стоимость наверное еще рано...
Защита: программа будет в облаке, поэтому скопировать себе ее будет невозможно.

На досуге подумаю о более конкретном описании.

qs212
28.01.2016, 14:12
Не понял, хардвером не пользуетесь?
Сименс сам адресное пространство распределяет.


Не спорю. Я про программную часть.
Разберем к примеру функцию обработки ошибок положения клапана:

CALL "OE1NonActFB"
Q :="Valve".V3020.Q
I :="Valve".V3020.FdBk
Pulse :="1_Sec"
AlarmAck:="AckSpecialArea"
DelaySP :="ValveETSetp".V3020
DelayAcc:="ValveETActual".V3020
QIObject:="Valve".V3020

И так 500, а может 1000, может и больше раз..
Нетрудно заметить, что кроме названия объекта ничего не меняется. Идея автоматизации напрашивается сама собой.

Миних В.А.
28.01.2016, 18:20
чел, который ещё год назад пользовался стрингбуффером, вместо билдера, уже безопасные облачные хранилища втюхивает, начинаю глядеть на Вас с опаской

Не совсем понял замечание...
Ничего зазорного в использовании стрингбуффера не вижу, к тому же чему отдать предпочтение зависит от контекста применения.

Миних В.А.
28.01.2016, 18:28
Не спорю. Я про программную часть.
Разберем к примеру функцию обработки ошибок положения клапана:

CALL "OE1NonActFB"
Q :="Valve".V3020.Q
I :="Valve".V3020.FdBk
Pulse :="1_Sec"
AlarmAck:="AckSpecialArea"
DelaySP :="ValveETSetp".V3020
DelayAcc:="ValveETActual".V3020
QIObject:="Valve".V3020

И так 500, а может 1000, может и больше раз..
Нетрудно заметить, что кроме названия объекта ничего не меняется. Идея автоматизации напрашивается сама собой.

Да, этот пример попадает под нашу концепцию!

Миних В.А.
28.01.2016, 19:14
замечание возникло потому, потому что я решил посмотреть код который Вы пишите, чтоб понять кто предлагает ПО
не помню дословно что пишет среда разработки для явы, но суть следующая не используйте устаревший класс стрингбуффером, используйте стрингбильдер, так что рассуждать о контексте использования давайте не будем
и последнее, тот форумчанин который тут за регился чтоб поучаствовать в дискусс,ии, засланец из Вашей команды, предлагает что? тысячу клапанов описать построчно Вашим продуктом и кому нужен этот говнокод, есть в наших языках и массивы и циклы

Откуда столько негатива?

qs212
28.01.2016, 19:33
и последнее, тот форумчанин который тут за регился чтоб поучаствовать в дискусс,ии, засланец из Вашей команды, предлагает что? Гуляю сам по себе исключительно. АСУТП занимаюсь последние лет 10.


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


http://www.youtube.com/watch?v=uxbD8IOG3OM


ЗЫ: Вспомнил пример интегрированной среды разработки у АВВ (http://new.abb.com/control-systems/service/customer-support/satt) Там вообще все интересно - контроллер программируется через SCADА. Ни у кого больше такого не видел.

Миних В.А.
28.01.2016, 19:43
но суть следующая не используйте устаревший класс стрингбуффером, используйте стрингбильдер,

ссылка на официальную документацию по Java
https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html

и вот строка: Instances of StringBuilder are not safe for use by multiple threads. If such synchronization is required then it is recommended that StringBuffer be used.

а тут немного на русском:
http://www.quizful.net/interview/java/string-stringbuffer-difference

Поэтому и говорил про контекст, нужна потокобезопасность или нет. А вообще спасибо, я хоть немного в памяти всё это освежил))

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

Миних В.А.
28.01.2016, 19:46
Циклы это конечно здорово, и я сам бы тоже самое написал, когда начинал заниматься промышленной автоматизацией. Но потом понял, что для систем, которые постоянно переделываются/совершенствуются/дополняются это не есть хорошо. Потому как код должен быть понятен человеку "почти что с улицы", а править желательно на ходу, не отправляя контроллер в стоп. И подобный говнокод используется в частности тут:


Наверное опять подумают, что мы сговорились, но снова соглашусь.
Я тоже сначала увлекался циклами и косвенной адресацией, но иногда после тебя этот код будут смотреть и дополнять/править/ругать еще и наладчики. Вот зачем им на объекте эти качели?
Им надо взять код и сразу все понять и поправить.

Владимир Ситников
28.01.2016, 20:02
Я тоже сначала увлекался циклами и косвенной адресацией, но иногда после тебя этот код будут смотреть и дополнять/править/ругать еще и наладчики. Вот зачем им на объекте эти качели?
"что за нахи" всё равно будут: http://commadot.com/wtf-per-minute/

Можно всё-таки увидеть какой-нибудь пример?
"Была задача такая-то", "обычно решается так-то", "предлагается решать так-то", "экономия на разработке -- 10 дней", "экономия на поддержке -- 20 дней", "затраты на доп обучение -- 15 дней", "затраты на программиста -- 25 дней"

Вот классика жанра на тему автоматизации: https://www.youtube.com/watch?v=5Qn9arOe41c&feature=youtu.be&t=4170

Владимир Ситников
28.01.2016, 21:01
не используйте устаревший класс стрингбуффером, используйте стрингбильдер

Вообще говоря, претензия не обоснована.
Я ни разу не встречал случаев, когда замена StringBuffer на StringBuilder хоть как-то улучшила производительность (ну так, чтобы клиент заметил).
"Сложение в цикле без String**er" -- такое, да, часто. Но вот чтобы Builder vs Buffer -- ни разу.

Вот материал по теме: http://shipilev.net/talks/jpoint-April2015-string-catechism.pdf, https://youtu.be/YgGAUGC9ksk?t=462

И, да, в java9 вообще переделают компиляцию string+string, т.е. там явное использование String*** может оказаться медленнее, чем простое сложение строк (разумеется, вне циклов).



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

"контекст" может иметь следующе право на жизнь: пользуемся сторонней библиотекой, и она, собака, требует StringBuffer как один из аргументов. Ну, тут придётся использовать StringBuffer и на Builder никак не заменить.

Но это всё лирика. Не понимаю, как Builder vs Buffer может относиться к АСУТП.
Блин. Я уже знаю как АСУТП пишется, и понятия не имею что оно значит )

krollcbas
28.01.2016, 21:06
Кстати вот, вспомнил. Идеи создать что-либо более оптимальное для создания проектов уже разрабатывались, но спотыкались на внедрении
SimInTech от 3В-технологии
http://www.remmag.ru/admin/upload_data/remmag/09-3/3VTech.pdf

Вот к примеру был автоматом создан проект какой-либо умной софтиной, допустим есть экономическая выгода.
Что тогда делать службе эксплуатации, так же покупать этот софт для корректировки (например датчик добавили)?

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

capzap
28.01.2016, 21:44
Гуляю сам по себе исключительно. АСУТП занимаюсь последние лет 10.


Циклы это конечно здорово, и я сам бы тоже самое написал, когда начинал заниматься промышленной автоматизацией. Но потом понял, что для систем, которые постоянно переделываются/совершенствуются/дополняются это не есть хорошо. Потому как код должен быть понятен человеку "почти что с улицы", а править желательно на ходу, не отправляя контроллер в стоп. И подобный говнокод используется в частности тут:


http://www.youtube.com/watch?v=uxbD8IOG3OM


ЗЫ: Вспомнил пример интегрированной среды разработки у АВВ (http://new.abb.com/control-systems/service/customer-support/satt) Там вообще все интересно - контроллер программируется через SCADА. Ни у кого больше такого не видел.

что Вы хотели сказать этим видео, начнем с банального: моя твоя не понимать

а в принципе, я пока не увидел эффективности в построчном описании каждого объекта. Вот Вы пишите
код должен быть понятен человеку "почти что с улицы", другими словами ему должно быть понятно, что в "портянке" из тысячи однотипных строк (а у Вас в примере на обработку клапана ушло 8 строк, значит умножаем на восемь) у него всё в полном порядке и почему это должно быть более понятным, чем всё тоже самое в цикле занимающем всего 10 строк, они так то для этого и придуманы и в стороннем ПО будет делаться тоже самое

capzap
28.01.2016, 21:52
Наверное опять подумают, что мы сговорились, но снова соглашусь.
Я тоже сначала увлекался циклами и косвенной адресацией, но иногда после тебя этот код будут смотреть и дополнять/править/ругать еще и наладчики. Вот зачем им на объекте эти качели?
Им надо взять код и сразу все понять и поправить.
в чем качели, либо Вы спасаете программиста от рутинной работы ускоряя процесс копипастинга однотипных операций, а это значит если в коде объекта у Вас ошибка, то это касается всех объектов, если это какая то индивидуальная особенность одного из множества объектов, то его в цикле не обработаешь ни в самом проекте, не с помощью внешних вспомогательных ПО

qs212
28.01.2016, 22:36
что Вы хотели сказать этим видео, начнем с банального: моя твоя не понимать
Было где то дельное видео по этому продукту, но я его к сожалению сейчас не нашел. Эта система есть надстройка над симатиком или рс лоджиком, сильно ускоряющая процесс проектирования. На ней даже в России построены десятки заводов. Ну это так, к слову.

а в принципе, я пока не увидел эффективности в построчном описании каждого объекта. Вот Вы пишите, другими словами ему должно быть понятно, что в "портянке" из тысячи однотипных строк (а у Вас в примере на обработку клапана ушло 8 строк, значит умножаем на восемь) у него всё в полном порядке и почему это должно быть более понятным, чем всё тоже самое в цикле занимающем всего 10 строк, они так то для этого и придуманы и в стороннем ПО будет делаться тоже самое
Все верно. А теперь представьте себе, что нужно отрезать часть оборудования, к примеру процентов 20. И время на остановку дается пару раз по пару часов, чтобы переконфигурировать сеть. . В данном случае закомментировал ручками, вгрузил и вперед, разбирать. И ресурсы в контроллере без проблем освободились.

Владимир Ситников
28.01.2016, 22:40
ну я же уже писал, что решил проверить насколько Вы способны писать профессиональный код.
Вообще говоря, закодировать это самое простое.
Гораздо сложнее понять что именно нужно кодировать. И понять "нужно ли". А для этого нужна экспертиза, которая, в конкретном случае, может с программированием мало чего общего иметь.

Вон, если окажется, что продукт нужен, то, может и команда набраться. Из тех, кто умеет ролики снимать (а как же без документации?), и из тех, кто программировать умеет.


Вот поэтому у меня и сложилось впечатление, что человек пытающийся предложить автоматизацию программирования, не пользуется возможностями среды разработки
Если в контексте "человек не пользовался автоматизацией, которую предлагают Java IDE, а значит, он и в АСУ ТП автоматизации ничего не понимает", то, может, что-то в этом и есть.
Но, по-моему, это как-то уж слишком далеко идущие выводы. В конце концов, изначальный вопрос задавался далеко не про Java.


на скрине сразу подчеркивается что стоит заменить буффер на билдер и верю разработчикам нетбинса больше чем Вам
Если говорить про конкретное "подчёркивание", то в 99.9999% случаев вы вообще никак не ощутите разницу скорости StringBuilder и StringBuffer.
Поэтому так напирать на Buffer и Builder крайне и крайне странно.

Ещё раз: если рассматривать с точки зрения "новичка", то, безусловно, невежественно игнорировать подсказки IDE. Но мы-то тут не на java программировать учимся. А, с точки зрения опытного разработчика, тыкать в Builder vs Buffer нехорошо.


верю разработчикам нетбинса больше чем Вам
В производительность не нужно верить. Её нужно измерять.
Вот вам пример на эту же тему (~рекомендация среды): http://shipilev.net/blog/2016/arrays-wisdom-ancients/#img-idea

Вообще все кому не лень рекомендуют вместо collection.toArray(new Foo[0]) использовать collection.toArray(new Foo[collection.size()]).
Интуитивно кажется, что рекомендация хорошая (сразу создаём массив нужного размера). Но реальные замеры показывают, что такая замена только ухудшает производительность.

И, да, Лёша Шипилёв это один из инженеров по производительности Oracle JDK. Т.е. он не просто "кто-то с горы", а тот, кто напрямую занимается производительностью Oracle Java.

capzap
28.01.2016, 22:42
Все верно. А теперь представьте себе, что нужно отрезать часть оборудования, к примеру процентов 20. И время на остановку дается пару раз по пару часов, чтобы переконфигурировать сеть. . В данном случае закомментировал ручками, вгрузил и вперед, разбирать. И ресурсы в контроллере без проблем освободились.

Вы будете комментировать 20% строк кода? давай те посмотрим на мой подход к такой реализации, я в теле цикла ставлю условие или кейс, где исключаю обработку не задействованных на данный момент объектов, ну максимум четыре строки придется добавить, что скажите?

qs212
28.01.2016, 23:16
Вы будете комментировать 20% строк кода? давай те посмотрим на мой подход к такой реализации, я в теле цикла ставлю условие или кейс, где исключаю обработку не задействованных на данный момент объектов, ну максимум четыре строки придется добавить, что скажите?
20% то зачем? Закоментировать нужно строку с вызовом функции.
Скажу, что если то, что нужно удалить идет не подряд, а как попало, то это будет не весело.

Владимир Ситников
28.01.2016, 23:22
при чем тут пользователь
При том, что именно пользователь определяет границу, когда "тормозит", а когда "удовлетворительно быстро работает".
Это называется нефункциональные требования (https://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%82%D1%80% D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9#.D 0.9D.D0.B5.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0. BE.D0.BD.D0.B0.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5_.D1.8 2.D1.80.D0.B5.D0.B1.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8. D1.8F) на производительность.

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


что говорит элементарный профилировщик, понятно что одно использование будет показывать минимальную единицу времени, а ту же самую тысячу использований?
Так я же ссылку показывал: http://shipilev.net/talks/jpoint-April2015-string-catechism.pdf, слайд 16.

Цитирую слайд:

public String stringBuilder() {
StringBuilder sb = new StringBuilder();
for(int c = 0; c < 1000; c++) {
sb.append ("Bar");
}
return sb.toString ();
}


Buffer: 125270 операций/сек
Builder: 116173 операций/сек
String+String: 3250 операций/сек

(одна операция -- 1000 сложений)

Во-первых Buffer быстрее 1
Во-вторых, даже если Лёша опечатался и перепутал, то разница мизерная.

Переведу с русского на русский: за одну секунду StringBuffer успевает построить строку длинной 125270*1000*3=375'810'000, а StringBuilder -- строку длинной 116173*1000*3=348'519'000 символов.
Для сравнения, если цикл сделан без Builder/Buffer, а по-крестьянски складываются строки, то удаётся сгенерировать всего 3250*1000*3=9'750'000 символов.

Если в реальной задаче действительно возникает потребность создавать _так много_ строк, то наверняка будет ещё более эффективное решение, чем эти builder/buffer'ы (например, распараллеливать задачу между несколькими вычислительными потоками)

1 Разумеется, всё может сильно зависеть от модели процессора, от версии java, от характера складываемых строк.
Но, блин, так напирать на Builder это жесть просто. Нету там разницы. Нету.

Владимир Ситников
28.01.2016, 23:27
20% то зачем? Закоментировать нужно строку с вызовом функции.
Скажу, что если то, что нужно удалить идет не подряд, а как попало, то это будет не весело.

Вообще говоря, практика PVS-Studio показывает (https://habrahabr.ru/company/pvs-studio/), что в copy&paste коде крайне много ошибок. В их анализаторе много правил именно по copy&paste направлению, и они много чего находят.

В каждой первой программе находится вот такая ошибка:
xc=xa+xb;
yc=ya+yb;
zc=ya+yb;

Если это портянка на 1000 копипастов, то я боюсь представить сколько там ошибок.
Цикл реально звучит более правдоподобным и поддерживаемым решением.

Миних В.А.
28.01.2016, 23:35
"что за нахи" всё равно будут: http://commadot.com/wtf-per-minute/

Да, качество кода измеряется количеством "чезанахов" в минуту))



Можно всё-таки увидеть какой-нибудь пример?
"Была задача такая-то", "обычно решается так-то", "предлагается решать так-то", "экономия на разработке -- 10 дней", "экономия на поддержке -- 20 дней", "затраты на доп обучение -- 15 дней", "затраты на программиста -- 25 дней"

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

На самом деле данный пост показал, что нет единой концепции в рядах разработчиков АСУ ТП.
Я благодарен всем, кто не пожалел своего времени и принял участие в дискуссии.
Для меня это ценная информация.



Вот классика жанра на тему автоматизации: https://www.youtube.com/watch?v=5Qn9arOe41c&feature=youtu.be&t=4170
Я повеселился!!! :D

qs212
28.01.2016, 23:46
Вообще говоря, практика PVS-Studio показывает (https://habrahabr.ru/company/pvs-studio/), что в copy&paste коде крайне много ошибок. В их анализаторе много правил именно по copy&paste направлению, и они много чего находят.

В каждой первой программе находится вот такая ошибка:
xc=xa+xb;
yc=ya+yb;
zc=ya+yb;

Если это портянка на 1000 копипастов, то я боюсь представить сколько там ошибок.
Цикл реально звучит более правдоподобным и поддерживаемым решением.

Все верно, но копипастинг весьма примитивно автоматизируется, а если и это лень, то тогда через поиск и замену в выделенной области. А в ручную да, будет полная беда.

Ну и вообще, АСУТП от объекта автоматизации зависит. Например вся пищевка - дискретное производство. То есть "большой" объект, состоящий из кучи несложных функций в количестве дофига. В отличие от к примеру энергетики, где "сложные" объекты, состоящие из кучи связанных процессов. И редко что то переделывается.
А в пищевке часто запуск нового продукта сопровождается переделками технологической схемы, с добавлением/убиранием объектов, функций, блокировок. На крупных заводах этот процесс идет непрерывно, поэтому важна большая гибкость и простота перепрограммирования.

Миних В.А.
28.01.2016, 23:47
Цикл реально звучит более правдоподобным и поддерживаемым решением.
Или автоматизация копипаста))
Насколько я знаю, ребята, которые работают в эксплуатации (не разработчики, а именно эксплуатация), очень не любят разбираться со всякими замутами вроде циклов/косвенной адресации/и всякой магии. Особенно когда у тебя многомиллионная линия встала и плюшки на конвейерах сохнут. Им надо быстро найти по поиску нужную переменную и быстро ее "зафорсить". И времени вычислять циклы и вставлять кейсы у них нету. Поэтому банальная релейная логика им очень нравится, она очень хорошо ложиться на их понимание релейных схем. Хорошо, если у них есть грамотный спец, который сможет раскурить эту магию. А чаще всего есть дядя Ваня КИПовец, которого научили как открыть Simatic Manager и найти нужную строчку и нажать нужную кнопку чтобы все поехало. Потому что над ним стоит начальник цеха с топором и грозит лишением премии, если плюшки засохнут. Вот такая стрессовая ситуация))) Извините, сам начинал с КИП 20 лет назад и насмотрелся всякого (например на специалистов, которые измеряют напряжение лампочкой, и говорят что у них батарейка села в стрелочном вольтметре и нечем замерить напряжение).

capzap
29.01.2016, 00:54
20% то зачем? Закоментировать нужно строку с вызовом функции.
Скажу, что если то, что нужно удалить идет не подряд, а как попало, то это будет не весело.

Вас ни кто за язык не тянул, Вы сами обозначили цифру 20 и даже пускай закомментить требуется только вызов функции наладчику требуется влюбом случае пробежаться по всему коду ставя комменты только в нужных местах,что ещё больше его напряжет, повторяю в цикле я бы в одном из кейсов определил номера с которыми ни чего делать не надо,а по дефолту все что предписано, у меня как у НАЛАДЧИКА займёт меньше времени,чем комменты поставлять. Теперь что касается разработчика,такой ситуации вообще допускать нельзя, подобным занятием должна заниматься скала, не требуется использование объекта, отключить его в визуализации

Владимир Ситников
29.01.2016, 00:57
а зацените тестирование по этой ссылке https://m.habrahabr.ru/post/260767/ здесь билдера выигрывает

Там не тестирование, а порнография полнейшая.
Без http://openjdk.java.net/projects/code-tools/jmh/ тест на производительность вообще невозможно написать.

Комментарии к статье смотрели?
Вот тут Лёша по-русски рассказывает почему нельзя просто так брать и использовать System.currentTimeMillis: https://www.youtube.com/watch?v=8pMfUopQ9Es&feature=youtu.be&t=20
И второй доклад тоже есть в комментариях.

qs212
29.01.2016, 02:01
Вас ни кто за язык не тянул, Вы сами обозначили цифру 20 и даже пускай закомментить требуется только вызов функции наладчику требуется влюбом случае пробежаться по всему коду ставя комменты только в нужных местах,что ещё больше его напряжет, повторяю в цикле я бы в одном из кейсов определил номера с которыми ни чего делать не надо,а по дефолту все что предписано, у меня как у НАЛАДЧИКА займёт меньше времени,чем комменты поставлять.
Вот нифига не понял. Если заранее подумано, и есть флаг, что объект не используется, все равно придется пробежаться по блоку данных и в нужных местах их расставить. То же самое получается.


Теперь что касается разработчика,такой ситуации вообще допускать нельзя, подобным занятием должна заниматься скала, не требуется использование объекта, отключить его в визуализации
А смысл? Если часть проекта удаляется навсегда, то хорошо бы освободить место для дальнейшего использования. И из скады тоже удалить нафиг.

capzap
29.01.2016, 07:26
Вот нифига не понял. Если заранее подумано, и есть флаг, что объект не используется, все равно придется пробежаться по блоку данных и в нужных местах их расставить. То же самое получается.


А смысл? Если часть проекта удаляется навсегда, то хорошо бы освободить место для дальнейшего использования. И из скады тоже удалить нафиг.

так Вы вообще имеете опыт работы с заказчиком по внедрению автгмктизации? Это значит заказчик оплатил стоимость N-ого количества клапанов, оплатил монтаж оборудования, соответственно оплатил проектные работы и тут появляется программист, который говорит ну тут 20% клапанов вообще не нужны, их смело можно выкидывать из программы, знаете за что Вас повесят на ближайшей березе? Особенно когда курс евро под сотню

qs212
29.01.2016, 11:33
так Вы вообще имеете опыт работы с заказчиком по внедрению автгмктизации? Это значит заказчик оплатил стоимость N-ого количества клапанов, оплатил монтаж оборудования, соответственно оплатил проектные работы и тут появляется программист, который говорит ну тут 20% клапанов вообще не нужны, их смело можно выкидывать из программы, знаете за что Вас повесят на ближайшей березе? Особенно когда курс евро под сотню
Ну как бэ не совсем так это выглядит. Предположим, построили новый цех. И он проработал год -два. Исходя из текущих потребностей выяснилось, что один из участков себя не оправдывает, и его можно демонтировать. А на его месте собрать что то необходимое. Применительно к молочке, к примеру заменить участок ферментации йогурта на установку ультрафильтрации творога.
Или, как счас модно на теме импортозамещения, заменить приемку цельного молока на участок разведения пальмового жира))

Владимир Ситников
29.01.2016, 11:34
а не какой то там Лёша
Вы, похоже, думаете, что, если результат получен у вас, то он гораздо точнее и надёжнее того, чем получен у "какого-то" Лёши.
Так не работает. Тот самый Лёша гораздо лучше знает как нужно измерять. Какие инструменты применять, и как проверять догадки.

Этот "какой-то там Лёша" напрямую занимается производительностью сложения строк в Oracle JVM: http://openjdk.java.net/jeps/280
И не просто "что-то там мутит", а результаты его работы напрямую включаются в состав java машины.

И что? К кому мы больше прислушиваемся? К непонятному автору на habr'е, у которого всего три статьи и "про строки" это первая из них?
Или к Лёше, который активно вносит правки в OpenJDK, выступает на конференциях, и пишет статьи?

В Google хотя бы попробуйте: https://www.google.ru/search?q=alexey+shipilev

Хоть по одной ссылке ходили, которую я приводил? (я понимаю, что просмотреть те несколько часов видео адова туча времени, но я специально указывал на нужные моменты)


я с ним не знаком и режет слух, когда к отсутствующей третьей стороне так обращаются
А мне, например, режет слух, когда "capzap" или "Валенок" вместо имени.
Конечно, capzap это менее ругательное имя, чем "Валенок", но, блин, чтобы упомянуть второе, и оно не звучало ругательно, нужно очень постараться.

По существу:

http://shipilev.livejournal.com/ : Привет, меня зовут Алексей Шипилёв. В отношении меня можно использовать имена Лёша, Алексей, Лёха, или в крайнем случае, Шипилёв.

Т.е. "Лёша" это первое из обращений, которые Шипилёв сам рекомендует. И рекомендует для всех, а не только для тех, кто "пиво пил".


прежде чем дать ссылку я прогнал подобный код через профилировщик и смотрел на время за которое выполняется метод, результат такой же
Не обижайтесь, но так происходит у всех, кто начинает заниматься производительностью.
Я вот не верю, что под профилировщиком вы имели ввиду perf или Solaris Studio Performance Analyzer.

Всё остальное в данном контексте не может дать нужную точность.
Нужная точность в конкретном случае -- ассемблерный код и раскладка по времени на каждую инструкцию.
Т.е. нужно посмотреть в какой машинный код в конечном итоге компилируется builder, в какой buffer и т.п.


раз результат получился не в Вашу пользу, значит по Вашему так нельзя делать
Нет. "значит" у вас неверное.

"так нелья делать" не из-за того, что результат не в мою пользу получился. Нельзя делать из-за того, что инструменты для измерения и анализа там неверные.
Попробую привести аналогию: нужно измерить длину провода, но рулетки нет. Зато есть лист А4. Прикладываем его и считаем количество. 297мм же. Можно измерить? Какие проблемы? Зачем брать рулетку? Всем же известно, что 297мм. Умножаем на количество листов и вот она, наша длина провода.

Повторюсь: вы (и автор упомянутой статьи на habr'е) далеко не первые, кто использует неподходящие инструменты для измерения производительности.
Даже эссе есть на эту тему: http://shipilev.net/blog/2015/voltmeter/


Алексей Шипилёв: Порядочное количество диалогов о производительности и её измерении звучит так. Приходит ко мне какой-нибудь Василий и спрашивает:

Вася: Как померить напряжение в розетке?
Я: Возьми вольтметр и измерь.
Вася: Но я не умею в вольтметр, смотри, у меня есть лампочка
Я: Лампочкой напряжение не узнать, возьми вольтметр.
Вася: Ну как же!...

Если вы докажете, что эффект есть, то я без проблем соглашусь. Если вы готовы тратить своё время, я готов помочь в анализе результатов и показать где именно у вас косяк. Но вообще-то, пункт №1 это замена currentTimeMillis на http://openjdk.java.net/projects/code-tools/jmh/
currentTimeMillis==лампочка
code-tools/jmh==вольтметр

Заметьте: я ни разу не говорил, что "нужно всегда использовать buffer". Не говорил и про "нужно всегда использовать builder".
Я говорил лишь про то, что замена buffer на builder (или наоборот) никак не скажется на общей производительности программы.

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

И, да, я не привожу своих замеров не из-за того, что "не умею измерять" или "лень тратить время". На тему buffer vs builder уже есть более авторитетный замер. Я могу повторить его, но какой смысл смотреть на производные, если можно посмотреть на оригинал?

Владимир Ситников
29.01.2016, 15:30
найдите
"Но я не умею в вольтметр, смотри, у меня есть лампочка"

Вот код. Я специально закомментировал всё лишнее, чтобы можно было тестировать отдельно.
И добавил цикл. Мы же программу не ради однократного запуска ускоряем?


public class MyTest {
public static void main(String[] args) {
new MyTest();
}

public MyTest() {
for(int i=0; i<100; i++) {
long time = System.currentTimeMillis();
// try {
// strTestD(new StringBuilder());
// } catch (Exception e) {}
try {
strTestU(new StringBuffer());
} catch (Exception e) {}
// strTestQ(new StringBuilder());
// strTestT(new StringBuffer());
// strTestS();
// strTestV();
time = System.currentTimeMillis() - time;
System.out.println(i + ", StringBuffer = " + time);
}
}
private void strTestU(Appendable obj) throws IOException {
for (int i = 0; i < 1E7; i++) {
obj.append("Irbis");
}
System.out.println("StringBuffer "+obj.toString().length());
}
private void strTestD(Appendable obj) throws IOException{
for (int i = 0; i < 1E7; i++) {
obj.append("Irbis");
}
System.out.println("StringBuilder "+obj.toString().length());
}
private void strTestT(StringBuffer obj) {
for (int i = 0; i < 1E7; i++) {
obj.append("Irbis");
}
System.out.println("StringBuffer "+obj.toString().length());
}
private void strTestQ(StringBuilder obj) {
for (int i = 0; i < 1E7; i++) {
obj.append("Irbis");
}
System.out.println("StringBuilder "+obj.toString().length());
}
private void strTestV() {
StringBuffer obj = new StringBuffer();
for (int i = 0; i < 1E7; i++) {
obj.append("Irbis");
}
System.out.println("StringBuffer "+obj.toString().length());
}
private void strTestS() {
StringBuilder obj = new StringBuilder();
for (int i = 0; i < 1E7; i++) {
obj.append("Irbis");
}
System.out.println("StringBuilder "+obj.toString().length());
}
}


Вот результаты у меня:


StringBuffer 50000000
0, time = 680
StringBuffer 50000000
1, time = 1064
StringBuffer 50000000
2, time = 774
StringBuffer 50000000
3, time = 622
StringBuffer 50000000
4, time = 529
StringBuffer 50000000
5, time = 391
StringBuffer 50000000
6, time = 241
StringBuffer 50000000
7, time = 491
StringBuffer 50000000
8, time = 228
StringBuffer 50000000
9, time = 183
StringBuffer 50000000
10, time = 238
StringBuffer 50000000
11, time = 135
StringBuffer 50000000
12, time = 215
StringBuffer 50000000
13, time = 217
StringBuffer 50000000
14, time = 190
StringBuffer 50000000
15, time = 232
StringBuffer 50000000
16, time = 241
StringBuffer 50000000
17, time = 142
StringBuffer 50000000
18, time = 228
StringBuffer 50000000


Вот результаты для builder'а


StringBuilder 50000000
0, StringBuilder = 413
StringBuilder 50000000
1, StringBuilder = 429
StringBuilder 50000000
2, StringBuilder = 437
StringBuilder 50000000
3, StringBuilder = 361
StringBuilder 50000000
4, StringBuilder = 277
StringBuilder 50000000
5, StringBuilder = 243
StringBuilder 50000000
6, StringBuilder = 224
StringBuilder 50000000
7, StringBuilder = 472
StringBuilder 50000000
8, StringBuilder = 238
StringBuilder 50000000
9, StringBuilder = 187
StringBuilder 50000000
10, StringBuilder = 338
StringBuilder 50000000
11, StringBuilder = 131
StringBuilder 50000000
12, StringBuilder = 133
StringBuilder 50000000
13, StringBuilder = 143
StringBuilder 50000000
14, StringBuilder = 131
StringBuilder 50000000
15, StringBuilder = 186
StringBuilder 50000000
16, StringBuilder = 210
StringBuilder 50000000
17, StringBuilder = 155
StringBuilder 50000000
18, StringBuilder = 154
StringBuilder 50000000
19, StringBuilder = 263
StringBuilder 50000000
20, StringBuilder = 175
StringBuilder 50000000
21, StringBuilder = 160
StringBuilder 50000000
22, StringBuilder = 151
StringBuilder 50000000
23, StringBuilder = 167
StringBuilder 50000000
24, StringBuilder = 166
StringBuilder 50000000
25, StringBuilder = 159


Во первых, первые выполнения работают медленнее, чем последующие.

Во-вторых, результаты сильно завязаны на работу garbage collector'а. Ещё бы. Тут создаётся строка на 100 мегабайт и тут же выбрасывается.
Если добавить -verbose:gc, то сразу видно, что в начале работы JVM наращивает память (число в скобках растёт):

-verbose:gc

StringBuffer 50000000
0, StringBuilder = 511
[GC (Allocation Failure) 416330K->365519K(497152K), 0.0094296 secs]
StringBuffer 50000000
1, StringBuilder = 601
[GC (Allocation Failure) 749030K->679696K(882688K), 0.0055799 secs]
StringBuffer 50000000
2, StringBuilder = 729
[GC (Allocation Failure) 1101541K->1012296K(1202688K), 0.0132236 secs]
StringBuffer 50000000
3, StringBuilder = 459
[GC (Allocation Failure) 1386750K->1266657K(1579520K), 0.0077790 secs]
StringBuffer 50000000
4, StringBuilder = 475
[GC (Allocation Failure) 1659860K->1414081K(1727488K), 0.0096428 secs]
StringBuffer 50000000
5, StringBuilder = 423
[GC (Allocation Failure) 1807284K->1561569K(2141184K), 0.0084224 secs]


А если сразу выделить нужное количество памяти, то тест "разгоняется" гораздо бодрее:

-verbose:gc -Xms2g -Xmx2g

StringBuffer 50000000
0, StringBuilder = 459
[GC (Allocation Failure) 501368K->37511K(2010112K), 0.0235897 secs]
StringBuffer 50000000
1, StringBuilder = 484
[GC (Allocation Failure) 504648K->74336K(2010112K), 0.0412089 secs]
StringBuffer 50000000
2, StringBuilder = 344
[GC (Allocation Failure) 476581K->74288K(2010112K), 0.0269566 secs]
StringBuffer 50000000
3, StringBuilder = 348
[GC (Allocation Failure) 467187K->74368K(2010112K), 0.0090283 secs]
StringBuffer 50000000
4, StringBuilder = 310
[GC (Allocation Failure) 467553K->74336K(1997824K), 0.0092012 secs]
StringBuffer 50000000
5, StringBuilder = 340
[GC (Allocation Failure) 467747K->74344K(2001920K), 0.0123743 secs]
StringBuffer 50000000
6, StringBuilder = 330
[GC (Allocation Failure) 467572K->74254K(2001408K), 0.0167865 secs]


О чём это я?

О том, что конкретным замером вы измеряете не скорость StringBuilder, а:
1) "Время однократного запуска". Тут вообще просто свет тушить можно. Даже от простого перезапуска (или от перестановки порядка вызовов) диспозиция может измениться.
2) Работу garbage collector'а (и эргономик по автоматической настройке памяти, ведь, вы не указывали -Xms/-Xmx?)
3) Работу on-stack-replacement (http://openjdk.java.net/groups/hotspot/docs/HotSpotGlossary.html#onStackReplacement). Известно (из многочисленных экспериментов, и из того, что пишут сами авторы), что OSR генерирует менее эффективный машинный код.
4) Работу непонятного кода. Необходимость построить 10 мегабайтную строку и тут же её выбросить у вас часто возникала? Я не говорю, что именно такой тест замерять нельзя. Я просто говорю, что изначально тема развилась из "buffer капец как тормозной".

1, 2 и 3 устраняются, если использовать jmh. Вы специально упираетесь, и не используете jmh?

Владимир Ситников
29.01.2016, 15:47
вот есть авторитетный замерщик ему можно верить
Опять перевираете.
Полностью звучит так: вот есть способ проверить.

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

Расчехляем jmh, и получаем, что скорость выполнения одна и та же.



import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.concurrent.TimeUnit;

@Fork(value = 3, jvmArgsPrepend = {"-Xms2g", "-Xmx2g"})
@Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
@Warmup(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
@State(Scope.Thread)
@Threads(1)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class StringConcat {

@Benchmark
public String builder() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1e7; i++) {
sb.append("Irbis");
}
return sb.toString();
}

@Benchmark
public String buffer() {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 1e7; i++) {
sb.append("Irbis");
}
return sb.toString();
}

public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(StringConcat.class.getSimpleName())
//.addProfiler(GCProfiler.class)
.detectJvmArgs()
.build();

new Runner(opt).run();
}

}




# JMH 1.11.2 (released 92 days ago, please consider updating!)
# VM version: JDK 1.8.0_60, VM 25.60-b23
# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/bin/java
# VM options: -Xms2g -Xmx2g -Didea.launcher.port=7532 -Didea.launcher.bin.path=/Applications/IntelliJ IDEA 15.app/Contents/bin -Dfile.encoding=UTF-8
# Warmup: 10 iterations, 1 s each
# Measurement: 10 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: org.postgresql.util.StringConcat.buffer

# Run progress: 0,00% complete, ETA 00:02:00
# Fork: 1 of 3
# Warmup Iteration 1: 504,478 ms/op
# Warmup Iteration 2: 167,282 ms/op
# Warmup Iteration 3: 156,712 ms/op
# Warmup Iteration 4: 142,019 ms/op
# Warmup Iteration 5: 130,716 ms/op
# Warmup Iteration 6: 132,175 ms/op
# Warmup Iteration 7: 130,494 ms/op
# Warmup Iteration 8: 128,751 ms/op
# Warmup Iteration 9: 128,376 ms/op
# Warmup Iteration 10: 135,927 ms/op
Iteration 1: 142,503 ms/op
Iteration 2: 126,427 ms/op
Iteration 3: 121,183 ms/op
Iteration 4: 123,705 ms/op
Iteration 5: 134,235 ms/op
Iteration 6: 122,471 ms/op
Iteration 7: 124,813 ms/op
Iteration 8: 127,109 ms/op
Iteration 9: 122,452 ms/op
Iteration 10: 128,862 ms/op

# Run progress: 16,67% complete, ETA 00:01:50
# Fork: 2 of 3
# Warmup Iteration 1: 290,340 ms/op
# Warmup Iteration 2: 133,337 ms/op
# Warmup Iteration 3: 123,226 ms/op
# Warmup Iteration 4: 131,857 ms/op
# Warmup Iteration 5: 128,725 ms/op
# Warmup Iteration 6: 129,772 ms/op
# Warmup Iteration 7: 123,170 ms/op
# Warmup Iteration 8: 122,863 ms/op
# Warmup Iteration 9: 129,920 ms/op
# Warmup Iteration 10: 120,862 ms/op
Iteration 1: 122,446 ms/op
Iteration 2: 124,428 ms/op
Iteration 3: 133,191 ms/op
Iteration 4: 119,475 ms/op
Iteration 5: 126,896 ms/op
Iteration 6: 123,963 ms/op
Iteration 7: 134,483 ms/op
Iteration 8: 133,446 ms/op
Iteration 9: 127,896 ms/op
Iteration 10: 125,156 ms/op

# Run progress: 33,33% complete, ETA 00:01:28
# Fork: 3 of 3
# Warmup Iteration 1: 285,805 ms/op
# Warmup Iteration 2: 130,223 ms/op
# Warmup Iteration 3: 122,691 ms/op
# Warmup Iteration 4: 132,281 ms/op
# Warmup Iteration 5: 130,149 ms/op
# Warmup Iteration 6: 129,617 ms/op
# Warmup Iteration 7: 125,146 ms/op
# Warmup Iteration 8: 125,089 ms/op
# Warmup Iteration 9: 133,226 ms/op
# Warmup Iteration 10: 125,234 ms/op
Iteration 1: 119,962 ms/op
Iteration 2: 126,932 ms/op
Iteration 3: 132,335 ms/op
Iteration 4: 131,525 ms/op
Iteration 5: 127,541 ms/op
Iteration 6: 121,408 ms/op
Iteration 7: 119,892 ms/op
Iteration 8: 139,716 ms/op
Iteration 9: 121,877 ms/op
Iteration 10: 125,758 ms/op


Result "buffer":
127,070 ±(99.9%) 3,904 ms/op [Average]
(min, avg, max) = (119,475, 127,070, 142,503), stdev = 5,844
CI (99.9%): [123,165, 130,974] (assumes normal distribution)


# JMH 1.11.2 (released 92 days ago, please consider updating!)
# VM version: JDK 1.8.0_60, VM 25.60-b23
# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/bin/java
# VM options: -Xms2g -Xmx2g -Didea.launcher.port=7532 -Didea.launcher.bin.path=/Applications/IntelliJ IDEA 15.app/Contents/bin -Dfile.encoding=UTF-8
# Warmup: 10 iterations, 1 s each
# Measurement: 10 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: org.postgresql.util.StringConcat.builder

# Run progress: 50,00% complete, ETA 00:01:06
# Fork: 1 of 3
# Warmup Iteration 1: 177,462 ms/op
# Warmup Iteration 2: 127,427 ms/op
# Warmup Iteration 3: 116,823 ms/op
# Warmup Iteration 4: 128,042 ms/op
# Warmup Iteration 5: 126,923 ms/op
# Warmup Iteration 6: 123,174 ms/op
# Warmup Iteration 7: 125,599 ms/op
# Warmup Iteration 8: 127,271 ms/op
# Warmup Iteration 9: 128,333 ms/op
# Warmup Iteration 10: 114,842 ms/op
Iteration 1: 128,124 ms/op
Iteration 2: 117,573 ms/op
Iteration 3: 126,854 ms/op
Iteration 4: 127,813 ms/op
Iteration 5: 116,706 ms/op
Iteration 6: 120,092 ms/op
Iteration 7: 122,443 ms/op
Iteration 8: 124,191 ms/op
Iteration 9: 125,831 ms/op
Iteration 10: 121,483 ms/op

# Run progress: 66,67% complete, ETA 00:00:44
# Fork: 2 of 3
# Warmup Iteration 1: 175,898 ms/op
# Warmup Iteration 2: 129,208 ms/op
# Warmup Iteration 3: 125,624 ms/op
# Warmup Iteration 4: 117,651 ms/op
# Warmup Iteration 5: 129,693 ms/op
# Warmup Iteration 6: 122,625 ms/op
# Warmup Iteration 7: 117,697 ms/op
# Warmup Iteration 8: 118,748 ms/op
# Warmup Iteration 9: 129,949 ms/op
# Warmup Iteration 10: 129,812 ms/op
Iteration 1: 122,881 ms/op
Iteration 2: 120,961 ms/op
Iteration 3: 116,294 ms/op
Iteration 4: 129,627 ms/op
Iteration 5: 122,964 ms/op
Iteration 6: 117,850 ms/op
Iteration 7: 124,518 ms/op
Iteration 8: 169,902 ms/op
Iteration 9: 124,100 ms/op
Iteration 10: 124,082 ms/op

# Run progress: 83,33% complete, ETA 00:00:22
# Fork: 3 of 3
# Warmup Iteration 1: 178,994 ms/op
# Warmup Iteration 2: 129,012 ms/op
# Warmup Iteration 3: 133,074 ms/op
# Warmup Iteration 4: 123,572 ms/op
# Warmup Iteration 5: 137,259 ms/op
# Warmup Iteration 6: 125,592 ms/op
# Warmup Iteration 7: 125,917 ms/op
# Warmup Iteration 8: 125,565 ms/op
# Warmup Iteration 9: 134,758 ms/op
# Warmup Iteration 10: 123,280 ms/op
Iteration 1: 121,962 ms/op
Iteration 2: 121,457 ms/op
Iteration 3: 129,659 ms/op
Iteration 4: 136,555 ms/op
Iteration 5: 130,896 ms/op
Iteration 6: 136,405 ms/op
Iteration 7: 128,355 ms/op
Iteration 8: 138,604 ms/op
Iteration 9: 130,620 ms/op
Iteration 10: 126,581 ms/op


Result "builder":
126,846 ±(99.9%) 6,624 ms/op [Average]
(min, avg, max) = (116,294, 126,846, 169,902), stdev = 9,915
CI (99.9%): [120,222, 133,470] (assumes normal distribution)




# Run complete. Total time: 00:02:12

Benchmark Mode Cnt Score Error Units
StringConcat.buffer avgt 30 127,070 ± 3,904 ms/op
StringConcat.builder avgt 30 126,846 ± 6,624 ms/op


Т.е. различие в 0.2мс при том, что статистическая ошибка порядка 10мс.

Владимир Ситников
29.01.2016, 15:57
по поводуэто было сказано в контексте генерации кода на SCL|ST а не к Яве да и имело отношение к другому форумчанину, так что анализ моей воспитанности не Ваш конек


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

В части "генерации кода на SCL|ST", конечно, с вами соглашусь. Слова класса "вместо ST'шного FOR будет новомодный облачный ЦИКЛ", конечно, ни разу не объясняют чем "облачный FOR" будет лучше простого. Как его ни называй, он же всё равно циклом останется. Но, может, и удастся что-нибудь придумать. Новомодное мыло может оказаться круче старого шила.

Владимир Ситников
29.01.2016, 17:14
по Вашему настоянию его я убрал из ссылочного примера, в который раз я говрю что пользуюсь этим https://netbeans.org/kb/docs/java/profiler-intro_ru.html а не вычитанием времени в проекте.
Я понимаю, что вы пользуетесь netbeans profiler, но это никак вас не оправдывает.
Моё настояние -- переписать пример на JMH. Можете?
Я, вот, переписал, и получил ожидаемый результат: разницы между buffer и builder в конкретном примере не нашлось.

Netbeans profiler -- это инструмент анализа, когда есть что анализировать. А у вас и анализировать пока нечего.
Вот jmh тест уже можно анализировать. И искать причины "почему работает с одинаковой скоростью".


представте когда формируешь svg-строки суточного графика температур, строки получаются очень длинными, конечно может и не 10М, но я не проверял

Общий объём SVG в 10 мегабайт -- верю. Кстати, я там ошибся, и строки у вас 1e7*5*2==100 мегабайт. Но и в 100 мегабайт html кода даже поверить могу.
Но, ведь, и надёжнее будет не пытаться всю строку в памяти размещать, а использовать потоковые механизмы.
Сгенерировали 1 мегабайт, записали его в файл и т.п.

Но, ведь, у вас не возникнет сомнения, что "строки на 100-1000 байт" встречаются гораздо чаще? Каждое выводимое сообщение, строка в логе, и т.п.

Оптимизировать процесс, который занимает меньше секунды и строит строку на 50 миллионов символов? И много там наоптимизируете?
А сколько при этом занимает выборка данных, на основе которых строится этот многомегабайтный отчёт?
Неужели гораздо быстрее этой самой секунды, что "1 секунда" оказалась узким местом?


признаюсь в английском не так силен, но почему http://cr.openjdk.java.net/~shade/8085796/notes.txt используется билдер, а не буффер. Кстати, нетбинс тоже оракловское детище, и если специалист сравнивает с openjdk то наверное с самым скоростным способом стандартного API, а не аутсайдеров
Да, без английского, немного тяжко.
Во-первых, между Buffer и Builder разницы никакой нет.
Во-вторых, даже если она и есть, то объём статьи (и время, требуемое для получения замеров) разрастётся офигеть как и прочитать станет вообще невозможно.
Да и написать такое будет гораздо сложнее (нужно же правильно вставить кучу цифр).
В третьих, специалист сравнивает не только "с самым скоростным" (хотя, конечно, имеет сравнивать именно с самым скоростным), но и с тем способом, который openjdk использовала _до этого_. Вот взять текущую openjdk 8. Она компилирует сложение строк через StringBuilder. Значит ли это, что Builder "самый скоростной"? Возможно. Значит ли это, что "Buffer капец какой тормозной"? Вовсе не значит.

Как это отменяет слова "чел, который ещё год назад пользовался стрингбуффером, вместо билдера"?
Как это отменяет то, что "замеры нужно делать на jmh"?

В общем:
1) Пользуйтесь jmh. Там реально никаких сложностей нет
2) Не наезжайте на других по вопросам Builder vs Buffer

Владимир Ситников
29.01.2016, 17:52
в общем: я доверяю команде разработчиков нетбинс против одного Алексея,продвигающего опенпродукт
Ась?
Вы понимаете, что java машин всего 3-4 штуки в МИРЕ? Я говорю не про наколеночные поделки, а про пригодные к использованию.
Oracle JDK основывается на OpenJDK.
Это знаете?

Поймите меня: я не заставляю вас бросить веру в NetBeans.
И не заставляю "поверить в Алексея".
Я говорю лишь то, что напряжение нужно измерять вольтметром, а тесты на производительность строить на основе JMH.
Алексей на примерах (которые вы на своём компьютере повторить можете) красочно рассказывает почему без JMH ничего не получится.


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


я доверяю команде разработчиков нетбинс
Нравятся вам рекомендации NetBeans -- не вопрос.
Но это не повод других тыкать носом в "builder buffer".

Scream
29.01.2016, 20:34
забили тему человеку туфтой. Создайте отдельную ветку "споры о Java", вас читать интересно конечно, но я бы забанил, будь у меня права.

Владимир Ситников
29.01.2016, 20:59
забили тему человеку туфтой. Создайте отдельную ветку "споры о Java", вас читать интересно конечно, но я бы забанил, будь у меня права.
За волшебный пендель спасибо, давно пора.
Продолжение тут: http://www.owen.ru/forum/showthread.php?t=23221&p=194732&viewfull=1#post194732

qs212
29.01.2016, 23:11
Кстате возвращаясь к теме поста, если кто порекомендует захватчик видео с экрана, то покажу что умеет мой эксельчик.

Владимир Ситников
29.01.2016, 23:22
Кстате возвращаясь к теме поста, если кто порекомендует захватчик видео с экрана, то покажу что умеет мой эксельчик.

Жги!

Я долго не выбирал, но такое меня порадовало: http://recordit.co/
Получается так: http://recordit.co/xzAv3BGlzS

Минус в том, что без звука.
Плюс -- ссылку на видео получаешь моментально. Т.е не надо ходить и выкладывать отснятое.

Если нужен звук, то http://camstudio.org/

Миних В.А.
12.02.2016, 12:34
Добавил описание прототипа.
http://www.owen.ru/forum/showthread.php?t=23191&p=194225&viewfull=1#post194225
Готовлю более подробное описание функционала идеи с

Миних В.А.
12.02.2016, 12:41
А вот пример что сделано в Excel (делал мой коллега).
Извините что мелко и не читабельно, хотел показать масштаб задачи, сколько всего данных и переменных.

Аналоговые сигналы. Столбцы - это сами сигналы, а строки - это параметры и уставки для каждого канала
22579

Тут тоже самое для исполнительных механизмов
22578

И таблица аварийно-предупредительной сигнализации (делает логику для ПЛК)
22580

А это уже мои эксельчики (частично):

Создание алгоритма работы (технология) с помощью блоков DRUM (можно писать алгоритм прямо в эксель, а в ПЛК зашивать только конфиг Драма).
В итоге можно поменять алгоритм работы за считанные секунды. Это я делал для Компрессорной станции
В табличке задаются:
- текущий шаг и какие выходы надо включить на этом шаге, и по какому условию переходить на следующий.
Можно задавать таймера и ветвление
В ПЛК надо перенести только циферки из 3-х колонок посередине таблицы
22581

А это алгоритм переходов между режимами.
Левая часть - из какого режима переходить, правая часть в какой в середине - по какому условию.
Потом все это выгружается в ПЛК и алгоритм готов
22582

Миних В.А.
12.02.2016, 13:01
И вот все это хочется обобщить в один удобный конфигуратор

Вольд
12.02.2016, 13:59
И вот все это хочется обобщить в один удобный конфигуратор

Отлично. Ждем удобный продукт.

Миних В.А.
12.02.2016, 14:20
Кстати, а кто нибудь в своих проектах реализовывает возможность имитации технологического процесса?

У нас в каждом проекте была заложена такая возможность на уровне блоков.
В программных блоках управления механизмами и блоках обработки аналоговых сигналов присутствует вход, если его перевести в true, то блок переходит в режим имитации сигналов:
- блок изменения аналоговых сигналов начинает обрабатывать сигнал, который приходит в него из логики
- ИМы начинают имитировать свои концевые выключатели.

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

amn
12.02.2016, 14:51
Конечно. Только в рабочие блоки ничего дополнительного не закладываю. В конце программы вставляю блок симуляторов исполнительных механизмов, который подменяет реальные значения датчиков и другие сигналы. По-другому даже не представляю, как можно отладить проект на столе.

Миних В.А.
12.02.2016, 16:00
Конечно. Только в рабочие блоки ничего дополнительного не закладываю. В конце программы вставляю блок симуляторов исполнительных механизмов, который подменяет реальные значения датчиков и другие сигналы. По-другому даже не представляю, как можно отладить проект на столе.

О, Белгород! Земляк! а я со Старого Оскола

Миних В.А.
13.02.2016, 14:43
Кстате возвращаясь к теме поста, если кто порекомендует захватчик видео с экрана, то покажу что умеет мой эксельчик.

Жду ваш эксельчик

Yegor
13.02.2016, 18:52
Кстати, а кто нибудь в своих проектах реализовывает возможность имитации технологического процесса?Бывает. Вот, например, исполнительный механизм, качающий изделие; снимается зависимость усилия от угла наклона:

22606

Механика реальной системы симулируется игровым движком (Box2D, C++). К «игровому» симулятору на скорую руку приделан модбас (libmodbus, COM-порт). Симулятор поддерживает тот же набор сигналов, что и «боевые» механизмы/датчики. Программа ПЛК легко переключается на работу с симулятором по RS-232 (тогда как реальный объект управляется через дискретные и аналоговые входы-выходы).

22607

Миних В.А.
14.02.2016, 15:40
А вот пример что сделано в Excel (делал мой коллега).
Извините что мелко и не читабельно, хотел показать масштаб задачи, сколько всего данных и переменных.

Аналоговые сигналы. Столбцы - это сами сигналы, а строки - это параметры и уставки для каждого канала
22579

Тут тоже самое для исполнительных механизмов
22578

И таблица аварийно-предупредительной сигнализации (делает логику для ПЛК)
22580

А это уже мои эксельчики (частично):

Создание алгоритма работы (технология) с помощью блоков DRUM (можно писать алгоритм прямо в эксель, а в ПЛК зашивать только конфиг Драма).
В итоге можно поменять алгоритм работы за считанные секунды. Это я делал для Компрессорной станции
В табличке задаются:
- текущий шаг и какие выходы надо включить на этом шаге, и по какому условию переходить на следующий.
Можно задавать таймера и ветвление
В ПЛК надо перенести только циферки из 3-х колонок посередине таблицы
22581

А это алгоритм переходов между режимами.
Левая часть - из какого режима переходить, правая часть в какой в середине - по какому условию.
Потом все это выгружается в ПЛК и алгоритм готов
22582

Может еще кто-нибудь расскажет, что умеет делать его эксельчик

amn
14.02.2016, 18:01
Может еще кто-нибудь расскажет, что умеет делать его эксельчик

Может создать тему для этого. Проведете ликбез, научите эксельчики делать:).

Владимир Ситников
14.02.2016, 19:22
Механика реальной системы симулируется игровым движком (Box2D, C++). К «игровому» симулятору на скорую руку приделан модбас (libmodbus, COM-порт).
Это круто. Но хорошо бы придумать как более простыми способами делать тесты. Хотя, может, в интеграционных всегда такая жесть будет.

Scream
15.02.2016, 08:19
Бывает. Вот, например, исполнительный механизм, качающий изделие; снимается зависимость усилия от угла наклона:

22606

Механика реальной системы симулируется игровым движком (Box2D, C++). К «игровому» симулятору на скорую руку приделан модбас (libmodbus, COM-порт). Симулятор поддерживает тот же набор сигналов, что и «боевые» механизмы/датчики. Программа ПЛК легко переключается на работу с симулятором по RS-232 (тогда как реальный объект управляется через дискретные и аналоговые входы-выходы).

22607

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