Best LabVIEW Addon 2012

Различные конкурсы нашего портала
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1327
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 38 раз
Контактная информация:

Re: Best LabVIEW Addon 2012

Сообщение AndreyDmitriev »

Jakob Brontfeyn писал(а): Я вообще то, считал синтез контактных планов, помимо логических диаграмм, своим большим достижением...
Приведу для лучшего понимания примеров, принципиальные схемы, чисто электротехнические,
управления пускателями обычным и реверсивным (с простой и более сложной блокировкой)
Если они тоже не понятны и приводят в ступор, ну тогда это точно проблемы работы на стыке областей,
я априори считал, что даже не подготовленный LV-программист, это все таки, как то подготовленый:
электрик, электроник, другой специалист, почему должны быть проблемы с восприятием не сложной электрической схемы
Здесь дело не в этом. Я имел ввиду совершенно другое - в LabVIEW принято (ну исторически так сложилось), что у инструментов входы располагаются слева, а выходы - справа, и поток данных идёт слева направо. Так рекомендуется делать. Конечно, никто не запрещает перевернуть всё с ног на голову, что в тулките и было сделано (и по другому там и не получилось бы).
Однако элементы типа Hi|Lo, где выходы сделаны направо и налево - они просто идут в разрез с идеологией LabVIEW. Это как бы "притягивание за уши", что ли. Хотя выглядит, конечно, забавно (мы даже в одном из топиков электрическую схему для снятия ВАХ диода набрасывали).
Вы, кстати, не первый, кто так делает. Лет пять назад из недр NI Labs вышел проект под названием "Ladder Editor". Он был сделан для версии 8.6, после чего тихо скончался. Так вот там можно было создавать диаграммы в соответствии со стандартом EN 61131, но идеология была чуть другая - там не ставилась задача привести блок-диаграмму в визуальное соотвествие с контакным планом. Вместо этого был использован Picture Control, на котором собственно и происходило создание Ladder-диаграммы. В результате этот редактор не вступал в конфликт с идеологией LabVIEW (хотя сложность этого редактора была на порядок выше, чем в ПЛК тулките), просто следовал стандарту, принятому для диаграмм такого рода. Сложно сказать, почему проект закрыли. Один из аргументов, насколько я помню, заключался в том, что в традиционном ПЛК я могу менять код, не останавливая контроллер, чего я сделать не могу в случае лабвьюшной симуляции. Ну и Picture Control - довольно тормознутая штука для такого рода интерфейсов.

Что касается конструктивных усовершенствований, то первое, что там напрашивается - сделать систему тэгов для входов/выходов. В том виде, в каком оно есть сейчас, программист должен помнить, за что отвечает каждый выход и снабжать диаграмму соответствующими комментариями. Вместо этого надо дать возможность обращаться к точкам доступа по именам (собственно так в любом ПЛК сделано - будь то Siemens или GE Fanuc). Если точек доступа будет несколько десятков - то работа с этим инструментом превратится в ад.

Также можно предусмотреть мостики к реальному железу. Конечно, ничего специфического добавлять там не нужно, но хотя бы добавление поддержки OPC через DataSocket и ModBus уже даст возможность использовать тулкит на реальном железе.

Ну и состояние гонки пофиксить, конечно - ибо в таком виде пользоваться тулкитом вообще нельзя. :nono:
Аватара пользователя
Jakob Brontfeyn

Activity Gold Silver Black
expert
expert
Сообщения: 1729
Зарегистрирован: 28 фев 2008, 11:01
Награды: 6
Благодарил (а): 1 раз
Контактная информация:

Re: Best LabVIEW Addon 2012

Сообщение Jakob Brontfeyn »

Ну не надо так уже совсем жестко, Андрей.
Тулкит работает давно, с реальным железом, иначе вообще,
зачем бы я его делал. В частности с I-7065 от "ICP", как
типовой небольшой ПЛК ну, например, "Logo" Сиеменс.
И с другой аппаратурой, были бы только железоориентированные суб-ВИ
для чтения состояния входов и записи выходов.
Также прошел проверку и в компакт РИО, в режиме "Scan Intarface" там были только замечания по механической настройке кнопок входов sub-VI,
он понимает только один основной тип, но это легко подгоняется.
При "более-менее стандартном електротехническом программировании",
давайте, я уже введу такую терминологию,
проблем с гонкой по глобальным переменным у меня не возникало,
ну вообще то, в замене простой глобальной переменной, на Функциональную
глобальную переменную проблем не вижу, но это для каких то особых случаев.
Я всегда рад конструктивным замечаниям и предложениям.
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1327
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 38 раз
Контактная информация:

Re: Best LabVIEW Addon 2012

Сообщение AndreyDmitriev »

Jakob Brontfeyn писал(а):Ну не надо так уже совсем жестко, Андрей.
Тулкит работает давно, с реальным железом, иначе вообще,
зачем бы я его делал.
...
проблем с гонкой по глобальным переменным у меня не возникало,
ну вообще то, в замене простой глобальной переменной, на Функциональную
глобальную переменную проблем не вижу, но это для каких то особых случаев.
Я всегда рад конструктивным замечаниям и предложениям.
Вы ж вроде опытный пользователь, Яков Иосифович, но тем не менее давайте разберёмся в чём там дело. Я совсем не жёстко, просто тут вопрос довольно-таки фундаментальный.
Допустим, у нас есть глобальная переменная, хранящая состояние сигналов. В ПЛК тулките использован массив, ну а я сделаю кластер для разнообразия, сути это не меняет, зато никто не обвинит меня в плагиате:

Изображение

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

Изображение

Пусть изначально оба выхода в состоянии FALSE. Код данный не связан потоком данных и может наступить ситуация, когда верхний участок прочитает значение глобальной переменной (оба выхода FALSE), затем нижний участок кода прочитает ту же переменную (тоже оба выхода FALSE), затем верхний участок меняет значение первого выхода на TRUE, и записывает результат в глобальную переменную, а после этого нижний участок кода устанавливает значение второго выхода в TRUE (значение первого при этом остаётся FALSE), и перепысывает глобальную переменную значениями Output 1 False и Output 2 TRUE. Это совсем не то, что мы хотим получить. Вот если первый выход управляет аварийным насосом ядрёной станции, а второй – стержнями, то наступи такая ситуация – ну и нет больше Черонобыльской атомной...
В примере, приведённом выше, мы хорошо видим состояние гонки. Теперь мы завернём эти конструкции в SubVI (я сделаю по два SuibVI – для чтения и для записи):

Изображение

Это именно то, что сделано в ПЛК тулките.
Теперь с виду конструкция вроде безобидна (а мы помним, что весь код тулкита защищён паролями, и что там внутри мы не знаем):

Изображение

Однако этот код вовсе не гарантирует, что после его выполнения оба выхода будут установлены в TRUE. Это и называется состояние гонки или потокоНЕбезопасный код. Это даже не LabVIEW Advanced, это фундаментальные основы. Так делать не то чтобы не рекомендуется - так делать нельзя.
Чтобы понять, почему этот код может работать, надо вспомнить то, как LabVIEW исполняет код на блок-диаграмме. Понятно, что участки кода, связанные потоками данных, выполняются строго последовательно и к состоянию гонки не приводят – по-другому и быть не может:

Изображение

Ситуация усложняется, когда ноды потоком данных не связаны:

Изображение

В данном случае LabVIEW группирует несвязанные участки кода (NI называет такие группы термином «clumps» - как это по-русски? ну вот мне нравится слово «сгустки») при этом в пределах одного сгустка код выполняется последовательно, однако сами сгустки могут исполняться параллельно. Почему LabVIEW так поступает – понять несложно, если представить себе количество действий, которое надо выполнить для параллелизации кода – ведь надо создать и запустить необходимое количество потоков, передать им управление, дождаться их завершения, выполнить синхронизацию... Опять же накладные расходы на переключение контекстов могут занять больше времени, чем последовательное выполнение. Поэтому код, приведённый выше, с большой долей вероятности будет выполнен последовательно и состояние гонки не наступит. Но последовательное выполнение не гарантировано, так как это решение лежит на совести компилятора, а не программиста, поскольку потоком данных этот код не связан. Теоретически даже не исключается ситуация, когда этот код будет выполняться то параллельно, то последовательно от итерации к итерации.
Ситуацию со сгустками проще всего пояснить вот на таком примере:

Изображение

Здесть будет создано три сгустка (именно три, а не четыре, так как первый сгусток - там где контрол - также используется и для выполнения участка кода с индикаторами). Сначала стало быть, будет исполняться сгусток 1, а 2-й и 3-й будут спать. Причём заметьте, что в пределах сгустка 1 код будет выполняться последовательно, сначала будет исполнен первый VI, и лишь затем второй. После того, как первый сгусток закончит исполнение, он уснёт, и проснутся сгустки 2 и 3. Они будут выполняться параллельно (вот и наступило состояние гонки). После того, как их исполнение закончится и они уснут, проснётся сгусток 1, который начнёт исполнять оставшийся код (и опять-таки в пределах этого сгустка код будет исполняться последовательно – состояния гонки больше нет).
Повторюсь ещё раз – то, как LabVIEW группирует код, лежит исключительно на совести LabVIEW, а не программиста. Также учитывается то, что находится внутри SubVI. Стоит положить в каждый из этих SubVI , скажем, потокобезопасный вызов DLL или Wait (ms) – и мы снова получим параллельное выполнение.
Таким образом этот тулкит будет работать лишь до тех пор, пока потокоНЕбезопасный код будет исполняться в пределах одного потока. При этом исполнение его в рамках одного потока вообще никак не гарантируется. Стоит лишь использовать его в многопоточном приложении, либо начать использовать циклы, как его работоспособность тут же завершится. Причём отловить такие ошибки будет очень и очень непросто – время от времени значения выходов не будут соотвествовать ожидаемым значаниям, причём это будет проявляться спонтанно и очень редко – такой класс ошибок – один из самых неприятных, с которым только может столкнуться программист.

Уж подробнее не могу разжевать. Если уж мне не верите - то у NI почитайте: Tutorial: Local Variable, Global Variable, and Race Conditions
Вложения
RaceCondition.zip
(1021.02 КБ) 265 скачиваний
Аватара пользователя
Jakob Brontfeyn

Activity Gold Silver Black
expert
expert
Сообщения: 1729
Зарегистрирован: 28 фев 2008, 11:01
Награды: 6
Благодарил (а): 1 раз
Контактная информация:

Re: Best LabVIEW Addon 2012

Сообщение Jakob Brontfeyn »

Уфф... труден путь к истине, Андрей, если уж пошла такая пьянка..., не могли бы вы глянуть на этот пример,
я тут моделировал в свете Вашего ответа разные ситуации, ну и домоделировался, почему он аномально работает, то есть простейший код находясь в отдельном суб-ВИ и точно такой же просто в диаграмме работает по разному. Понять совершенно не могу. Вроде и последовательность соблюдена,
который в секвенсе должен вроде выполняться первым. Короче типичный русский вопрос кто (что) виноват и что делать. Посмотрите опытным глазом, неужели снова они, глобальные, но ведь там только чтение, откуда гонки?
Суб-ВИ открыты.
Вложения
B_Global.llb
(55.67 КБ) 257 скачиваний
Аватара пользователя
Pavel Krivozubov

Activity Bronze
professor
professor
Сообщения: 4421
Зарегистрирован: 07 фев 2008, 16:39
Награды: 3
Версия LabVIEW: 7.0 - 2013
Откуда: г. Электросталь
Благодарил (а): 24 раза
Поблагодарили: 9 раз
Контактная информация:

Re: Best LabVIEW Addon 2012

Сообщение Pavel Krivozubov »

Андрей, ты бы лучше статью написал на главную ей-богу!
Столько энергии тратится абсолютно без пользы, я удивляюсь просто.
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Best LabVIEW Addon 2012

Сообщение IvanLis »

Jakob Brontfeyn писал(а):Уфф... труден путь к истине, Андрей, если уж пошла такая пьянка...
:haha:
Все зависит от того где это применяется.
Андрей наглядно показал и доказал, надеюсь Яков с этим согласится, что возможна ситуация, когда программа выдаст неверный результат!
И если аномальные результаты до сих пор не возникали, это везение, либо просто не заметили /не обратили внимания.

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

А другие пользователи имеют право знать и должны быть извещены о возможных последствиях "слепого" использования чужих потуг.
Один из основных доводов, склоняющих меня к такой точке зрения, это пароль на SubVI, которые автор всесторонне продвигает в массы. Таким образом он как бы берет "на себя" всю ответственность за правильную работу программы. Если бы SubVI были открыты, тут все просто, можно было бы сказать... "ты Уважаемый куда смотрел, когда использовал это в своей программе?".

Я лично, ответ "такой ситуации еще не возникало" не приемлю!
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Best LabVIEW Addon 2012

Сообщение dadreamer »

Pavel Krivozubov писал(а):Столько энергии тратится абсолютно без пользы.
Как это "без пользы", я например с интересом читаю, так сказать просвящаюсь. По-моему, Андрей вполне мог бы уже написать книгу про :labview: . Раз уж блог закинул =)
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1327
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 38 раз
Контактная информация:

Re: Best LabVIEW Addon 2012

Сообщение AndreyDmitriev »

Jakob Brontfeyn писал(а):Уфф... труден путь к истине, Андрей, если уж пошла такая пьянка..., не могли бы вы глянуть на этот пример,
я тут моделировал в свете Вашего ответа разные ситуации, ну и домоделировался, почему он аномально работает, то есть простейший код находясь в отдельном суб-ВИ и точно такой же просто в диаграмме работает по разному. Понять совершенно не могу. Вроде и последовательность соблюдена,
который в секвенсе должен вроде выполняться первым. Короче типичный русский вопрос кто (что) виноват и что делать. Посмотрите опытным глазом, неужели снова они, глобальные, но ведь там только чтение, откуда гонки?
Суб-ВИ открыты.
Ага, тут тоже состояние «гонки», но несколько иного рода. Операции чтения и записи в одну и ту же переменную осуществляются последовательно. Однако что будет выполнено вперёд – чтение или запись, в общем-то неопределено. Я сначала усомнился можно ли назвать это гонкой, однако в терминах википедии это именно так - Состоя́ние го́нки (англ. race condition) — ошибка проектирования многопоточной системы или приложения, при которой работа системы или приложения зависит от того, в каком порядке выполняются части кода.

В терминах примера с кластером это выглядит вот так:

Изображение

Этот код будет выполнен последовательно, но чему будет равно значение индикатора мы сказать не можем, поскольку явно не задано, что будет происходить раньше – чтение или запись. LabVIEW, конечно, имеет свои внутренние правила, и мой опыт показвает, что сначала будет осуществлена запись, и лишь потом чтение, но единственный способ, задать это явно, это сделать как-то вот так:

Изображение

Что касается собственно вопроса и примера выше:

Изображение

то достаточно расположить элементы чуть иначе (технически с точки зрения потока данных я ничего не изменил), и всё станет ясно:

Изображение

Тут у нас три участка, которые скорее всего попадут в один сгусток, однако в каком порядке они будут исполнены: 1-2-3 или 2-3-1, или как-нибудь ещё – мы утверждать не можем. Причём на разных итерациях основного цикла их порядок может отличаться.
В какой-то мере мы можем повлиять на порядок исполнения кода, вводя задержки (так делать не надо, я привожу эти примеры исключительно для иллюстрации):
Вот так запись будет осуществляться после чтения – наши индикаторы «neravenstvo» будут скорее всего активны:

Изображение

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

Изображение

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

Единственно верный способ задать желаемый порядок выполнения, это сделать вот так:

Изображение

И этот код с точки зрения порядка выполнения - непробиваем

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

Если же предполагать правильный порядок записи и чтения в пределах одной итерации цикла, и от этого порядка зависит функциональность приложения, то его, конечно, надо задавать явно. Тут проще всего добавить входы выходы ошибок Error In Error Out, тогда можно будет обойтись вообще без структур последовательностей. Где-то так.
Аватара пользователя
Pavel Krivozubov

Activity Bronze
professor
professor
Сообщения: 4421
Зарегистрирован: 07 фев 2008, 16:39
Награды: 3
Версия LabVIEW: 7.0 - 2013
Откуда: г. Электросталь
Благодарил (а): 24 раза
Поблагодарили: 9 раз
Контактная информация:

Re: Best LabVIEW Addon 2012

Сообщение Pavel Krivozubov »

dadreamer писал(а): Как это "без пользы", я например с интересом читаю, так сказать просвящаюсь. По-моему, Андрей вполне мог бы уже написать книгу про :labview: . Раз уж блог закинул =)
вот именно, читаешь только ты и ещё несколько энтузиастов.
И очень скоро эта тема затеряется на форуме и очень грамотная аналитическая работа, проведенная Андреем - с примерами и рисунками - окажется проделанной впустую.
А для того, чтобы она не пропала зря лучше ее вынести на сайт в раздел "уроки" например.
Аватара пользователя
Jakob Brontfeyn

Activity Gold Silver Black
expert
expert
Сообщения: 1729
Зарегистрирован: 28 фев 2008, 11:01
Награды: 6
Благодарил (а): 1 раз
Контактная информация:

Re: Best LabVIEW Addon 2012

Сообщение Jakob Brontfeyn »

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

Если же предполагать правильный порядок записи и чтения в пределах одной итерации цикла, и от этого порядка зависит функциональность приложения, то его, конечно, надо задавать явно. Тут проще всего добавить входы выходы ошибок Error In Error Out, тогда можно будет обойтись вообще без структур последовательностей. Где-то так.
Андрей, большое спасибо, конечно же такая глубина знаний и понимания сути предмета вызывает глубочайшее уважение. Здесь я cогласен с Павлом.
Но самое главное, что в конце написано обьективно резюме,
подводящее итоги дискуссии, и не противоречащее моей концепции, если делается типовой ПЛК, где собственно и применяится в основном суб-ВИ с глобальной переменной. В приложениях программируемых по другому принципу,
надо допускать вероятность несовпадения фронтов выходов с точностью по времени до одного такта.
Кстати в тулките очень многие суб-ВИ не содержат глобальной переменной. Иерархию можно посмотреть даже в запаролленом VI.
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1327
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 38 раз
Контактная информация:

Re: Best LabVIEW Addon 2012

Сообщение AndreyDmitriev »

Jakob Brontfeyn писал(а):
AndreyDmitriev писал(а):
В заключение – как раз таки гонка между чтением и записью не так страшна в ПЛК, поскольку контроллер (хоть аппаратный, хоть программный) – работает циклически, то есть если мы осуществим запись в выход или маркер на одной итерации, и построим дизайн так, что гарантированно на следующей итерации прочитаем это значение - тут вполне нормальная ситуация, в которой в общем-то без разницы, что происходит раньше - чтение или запись (так, к примеру, ПЛК Сименс работает).
Андрей, большое спасибо, конечно же такая глубина знаний и понимания сути предмета вызывает глубочайшее уважение. Здесь я cогласен с Павлом.
Но самое главное, что в конце написано обьективно резюме,
подводящее итоги дискуссии, и не противоречащее моей концепции, если делается типовой ПЛК, где собственно и применяится в основном суб-ВИ с глобальной переменной.
На здоровье, рад был помочь. Резюме выше касается только гонки между чтением и записью. Что касается гонки между записью и записью - то это всё равно надо будет починить, так как там запись в один выход может повлиять на состояние других выходов, что ни в каком ПЛК недопустимо. Самы простой способ - просто завернуть доступ к глобальной переменной в SubVI (не реентрантную ни в коем случае, разумеется):
mod1.png
mod1.png (32.53 КБ) 13405 просмотров
и вызывать эту SubVI в Dig_Out_x.vi вместо прямого доступа к глобальной переменной:
mod2.png
Там работы на полчаса-час, а надёжность тулкита возрастёт. Кстати с точкм зрения архитектуры и дальнейшие модификации будет делать куда как легче - если, скажем, захотеть добавить временной маркер, показывающий время последней записи в выход, либо перейти от глобальных массивов к циклу, хранящему состояние в сдвиговых пегистрах, то придётся менять всего один VI, а не двадцать штук.
Pavel

Activity
developer
developer
Сообщения: 271
Зарегистрирован: 31 июл 2009, 08:07
Награды: 1
Версия LabVIEW: 8.5

Re: Best LabVIEW Addon 2012

Сообщение Pavel »

Андрей, на мой взгляд, главное в твоем труде это то, что ты "кракозябру" Якова представил в удобоваримый вид, т.е. в наглядный (я если честно даже немного заностальгировал). Яков, без обид, но меня в свое время за кракозябры наставники били по рукам и, как сейчас понимаю, в общем, то правильно делали.
ЗЫ: И Андрей, я вот, пожалуй, не соглашусь с твоим заключением про ПЛК. Возможно, в Сименсе таких заморочек нет как в LV, но все-таки есть свои нюансы.
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1327
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 38 раз
Контактная информация:

Re: Best LabVIEW Addon 2012

Сообщение AndreyDmitriev »

Pavel писал(а): ЗЫ: И Андрей, я вот, пожалуй, не соглашусь с твоим заключением про ПЛК. Возможно, в Сименсе таких заморочек нет как в LV, но все-таки есть свои нюансы.
Ну тут да, это я с некоторой "натяжкой" провёл аналогию, но формально если помнить о всём, написанном выше, то ПЛК логику реализовать программно вполне себе можно. Что касается Сименса, то там, конечно, всё не так просто, так как контроллер сам себя защищает от состояния гонок. Для погружения в тему могу вот порекомендовать патент почитать Programmable controller with sub-phase clocking scheme.
Там как раз про это: " The processor consequently avoids race conditions in the system and allows the parallel execution speedup of programs written for a sequential machine such as a PLC."
Аватара пользователя
Jakob Brontfeyn

Activity Gold Silver Black
expert
expert
Сообщения: 1729
Зарегистрирован: 28 фев 2008, 11:01
Награды: 6
Благодарил (а): 1 раз
Контактная информация:

Re: Best LabVIEW Addon 2012

Сообщение Jakob Brontfeyn »

Pavel писал(а):Андрей, на мой взгляд, главное в твоем труде это то, что ты "кракозябру" Якова представил в удобоваримый вид, т.е. в наглядный (я если честно даже немного заностальгировал). Яков, без обид, но меня в свое время за кракозябры наставники били по рукам и, как сейчас понимаю, в общем, то правильно делали.
ЗЫ: И Андрей, я вот, пожалуй, не соглашусь с твоим заключением про ПЛК. Возможно, в Сименсе таких заморочек нет как в LV, но все-таки есть свои нюансы.
Я такой терминологии не понимаю, таких слов нет ни в русском, ни в других языках, наверное это язык наставников, которые имеют привычку кого-то бить, возможно даже ногами. :crazy: :D
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1327
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 38 раз
Контактная информация:

Re: Best LabVIEW Addon 2012

Сообщение AndreyDmitriev »

Jakob Brontfeyn писал(а): Я такой терминологии не понимаю, таких слов нет ни в русском, ни в других языках, наверное это язык наставников, которые имеют привычку кого-то бить, возможно даже ногами. :crazy: :D
Мы в своё время называли "кракозябрами", текст, выведенный в неверной кодировке.

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

Кракозябры.

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

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

Принесли они книжку, свёрстанную в Пейджмекере, причём надо как водится "вчера". Начали выгонять её на плёнки — верстка разъезжалась, пришлось остаться в ночь. Потихоньку процесс продвигался, плёнки складывались в аккуратную пачку, и уже под утро я выплюнул на принтер обложку. Там напечалось примерно такое "ÏÎÁÅÄÀ". Я привычным движением отправил брак в мусорную корзину, мы подобрали подходящий шрифт, я вывел новую плёнку, и расслабленно откинулся на стуле — заказ был закончен.
— Ой, какие красивые кракозябры - раздалось у меня за спиной. - А можно я возьму это с собой? - Блондинка крутила в руках бракованную плёнку.
— Да не вопрос, — ответил я, что мне, жалко что ли?
Блондинка положила эту плёнку сверху пачки и упорхнула. Я получил причитающуюся премию за ночную работу и думать про это забыл.

Это была преамбула.

Через месяц вызывает меня к себе начальник типографии "Наука". В кабинете сидело человек десять — корректоры, начальники отделов, все с каменными лицами.
Директор молча пододвинул ко мне стопку книг, потом тихо спросил — Это что?
Я взял книгу в руки — на бархатной обложке, красовались тиснёные золотом буквы "ÏÎÁÅÄÀ".
Меня начал разбирать смех. Я вспомнил, как блондинка кладёт плёнку сверху пачки, представил себе, как эти буквы рассматривает травильщик формы, и как потом оператор машины горячего тиснения, пожимая плечами, смотрит на выходящие из пресса чудные буквы...
— Шрифт слетел, — только я и сумел выдавить из себя.
— Что значит "Шрифт слетел"? — спросил начальник наборного цеха. Конечно, он ведь и представить себе не мог, что наборщик с самого жуткого похмелья возьмёт шесть первых попавшися литер из ящика акцидентного набора 72-го кегля и отправит их на обложку.
— А может это по-гречески? — робко спросила начальник отдела корректоров. Меня снова начал разбирать смех...
— Мы ведь уже первую тысячу вот ТАК отпечатали, робко заметил начальник печатного...

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

Вернуться в «Конкурсы»