суббота, 26 мая 2018 г.

Панель оператора Siemens MP377 отвалилась на перезаливке

Имеем панель Siemens MP377 12'' Touch. Эта "замечательная" вещь за какие-то скромные 3396.24 евро, как известно, имеет аж целых 2 слота USB и 1 слот для чтения SD-карт, которые, как оказалось, совершенно НИКАК не помогают для восстановления панели (кроме случаев штатного восстановления через ОС).
 
Суть в чем. Был выбран способ заливки панели через MPI, который на скорости 187.5 кбит/с предложил мне подождать несколько часов, пока обновится операционная система панели. Естественно, изначально никто не сообщил, сколько времени нужно будет ждать. 
Короче, не желая ждать целый день пока пройдёт загрузка по MPI, загрузку отменили... И панель оператора повесилась. Загрузка стала начинаться словами:

Enabling update mode...
Loading image from Flash...
No image found...
Waiting for image update...


Далее шло два часа чтения бестолковых Siemens'овских форумов с советами обновить операционную систему через Simatic ProSave, используя кабели MPI и PPI. Причём, что интересно, нужен PPI PC Multimaster Cable, т.е. кабель PPI, который мультимастер, но при этом подключается через COM-порт - такой кабель нашёлся, но и от него не было НИКАКОЙ пользы. 

Был на русскоязычном форуме найден иной способ: мол, запишите на флешку через специальную прогу ISO to USB или типа того какой-то образ Windows CE, скачанный в формате ISO, подключите USB-клавиатуру  и так устанавливайте. НЕТ! HMI плевать хотела на то, что установлена в USB-порту и порту для SD-flash. Когда HMI пишет Loading image from Flash - это никакая не флешка, это так панелька называют свою внутреннюю флеш-память, где она не находит Image-файла, о чём и сообщает.

В общем, все эти замечательные Siemens'овские кабели не имеют никакого толку просто по одно причине: если вы откроете Simatic ProSave (Пуск->Программы->Siemens Automation->SIMATIC->ProSave->SIMATIC ProSave), то вы обнаружите, что какой бы вы интерфейс не выбирали для панели MP377 (а их там аж целых 4), то лишь для одного из них в разделе OS Update присутствует галочка "Reset to factory settings".

В программе ProSave просят уточнить необходимые данные касательно параметров связи. Если в разделе OS Update Simatic ProSave выбираешь Reset to factory setings, то IP не нужен, просто указываешь MAC-адрес и всё.
 
Не забываем, что в настройках PG/PC interface надо настроить точку доступа S7ONLINE на работу через нашу сетевую карту, только тогда ProSave будет работать, а иначе получим такое сообщение:

Error on interface parameter assignment
 

суббота, 19 мая 2018 г.

Китайские клоны Siemens S7-200

Данная статья написана в 2018 году. В 2022 году в неё внесены изменения в связи с тем, что, во-первых, официальных дилеров Siemens в России больше нет и информация по ним перестала быть актуальной, а во-вторых, появился новый бренд производителя клонов S7-200 - китайская компания Unimat, дилером которой является компания ПромЭнергоАвтоматика, любезно предоставившая нам данный контроллер для проведения тестов, и информация об этих клонах Siemens S7-200 также была добавлена в статью.
 
Исправление 2022 года. Ранее в этой и других статьях фигурировало двойное обозначение контроллера Shenjuye как "Lollette (Shenjuye)". Это было связано с тем, что контроллеры данного производителя продавались на Aliexpress под брендом Lollette, но если содрать приклеенную к корпусу табличку "LOLLETTE", то под ней оказывалась надпись "ShenJuYe". По некоторым пунктам этот контроллер работал лучше, чем другие клоны (а по некоторым - хуже). Однако, по состоянию на 2022 год на Aliexpress продаются контроллеры Lollette, которые теперь не являются переименованными Shenjuye, а просто какие-то noname (под табличкой на корпусе никаких надписей нет). Shenjuye же на Aliexpress больше нет, но сами контроллеры производятся и продаются, например, на Yoycart. Так что из статьи все упоминания старого Lollette убраны, а оставлены только обозначения Shenjuye, а также добавлены упоминания нового Lollete. При всём при этом надо понимать, что если вам в руки попадается контроллер такого бренда, купленный неизвестно когда, то это может быть как Shenjuye, так и нет. Лучший способ узнать - заглянуть под приклеенную табличку "Lollette" на корпусе.
 
Недавно я обнаружил, что китайские ПЛК Siemens S7-200CN, продаваемые на Aliexpress, больше не требуют обязательного переключения пользовательского интерфейса Step-7Micro/Win на китайский язык для программирования, что было главным неудобством их использования. В связи с этим возник вопрос, а нужно ли вообще использовать другие китайские ПЛК, сделанные по подобию S7-200, но не являющиеся оригинальным Siemens?

За несколько лет я приобрёл несколько таких контроллеров (бренды Gipeng, Amsamotion и Lollette, ShenJuYe). Также впоследствии у меня в распоряжении оказался контроллер Unimat UN 200, о чем сказано в преамбуле к статье, он тут тоже будет упоминаться.

По цене сложно называть точные цифры, всё зависит от бренда, модели и продавца - слишком много факторов, в общем и целом цена может быть как примерно равна стоимости Siemens S7-200CN, так и отличаться в несколько раз, например, стоимость CPU224XP DC/DC/DC китайской поделки от"Lollette" LES7 214-2AD23-0XB8 в 4 раза ниже стоимости S7-200CN.

Учитывая, что дилеров Siemens в России больше нет, купить на юрлицо контроллеры (компенсируя НДС) стало проблемматично. Следовательно, прежней выгоды от покупки S7-1200 больше нет. В этом смысле покупка любой модели S7-200 (хоть клон, хоть не клон) теперь выгоднее покупки S7-1200. Т.е. всё теперь упирается лишь в требуемый функционал.

Тут важны такие факторы, которые говорят в пользу S7-200 в сравнении с S7-1200:

1. К S7-200 можно напрямую подключать Smart-панели Siemens (дополнительный коммутатор для S7-1200 стоит почти половину цены ПЛК). См. также статью об этих коммутаторах.

2. S7-200 имеет штатный интерфейс RS-485 (плата или модуль для S7-1200 тоже стоят денег), это на тот случай, если RS485 вообще нужен.

3. S7-200 хоть немецкий, хоть китайский, но это - один и тот же контроллер, там редко менялась прошивка, не сильно меняется ПО (старым Step-7 Microwin можно спокойно запрограммировать и новый ПЛК, контроллеры взаимозаменяемые в 90% случаев, отличий почти нет), всё это характеризует контроллеры S7-200 как стабильные. Это в отличие от S7-1200, которые штампуют всё новых моделей, для которых выпускают несовместимые прошивки (ну, по состоянию на 2022 год, вроде бы, угомонились с несовместимостью..., хотя прошивки продолжают зачем-то обновлять), вносят изменения, меняющие размер памяти программ и алгоритмов работы (например, скоростных счётчиков) и для которых несовместимо ПО TIA Portal разных версий. Выход из строя ПЛК S7-1200 не гарантирует, что производимый Siemens на тот момент времени такой же S7-1200, но новой версии, будет совместим с вышедшим из строя на 100%. Например, смотри статью о совместимости панелей оператора с S7-1200. Старые версии ПЛК S7-1200 некоторое время остаются в продаже на том же Aliexpress, но, как оказалось, ненадолго (речь о новых моделях, не б/у), т.е. в Китае производимую на их заводах линейку Siemens S7-1200 обновляют, прекращая выпуск старых моделей. 
 
Естественно, что существует много причин считать, что S7-1200 лучше S7-200, я не буду их перечислять, это не является предметом статьи. Также не стоит забывать про контроллеры S7-200 Smart, это еще одна линейка, прямо конкурирующая с S7-200. Кстати, Unimat делает и их клоны тоже - называются UN 200 Smart. Это контроллеры с большим количеством дискретных входов и выходов, по экономической целесообразности приобретения для некоторых задач они обходят S7-200 и S7-1200. Но в этой статье речи о них нет.

Теперь касательно китайских клонов S7-200 и их сравнение с оригиналом.
 

Что в китайских клонах лучше, чем в оригинале

 
1. Цена. Цена начинается от примерно $30
 
2. Существуют различные вариации моделей, которых не существовало у оригинального Siemens. Например, продаются контроллеры "DC/DC/RLY", т.е. ПЛК с релейными дискретными выходами и штатным подключением 24V (неисправности встроенных блоков питания - основная причина выхода из строя контроллеров S7-200 AC/DC/RLY). Что делала фирма Gipeng - можете посмотреть в этой статье, там у них S7-200 и с Ethernet, и с RS232, и т.д. Сейчас Gipeng уже не продают, но контроллеры S7-200 с Ethetnet делают и другие производители, например, Amsamotion. Следует обратить внимание на то, что встроенный Ethernet - это не иммитация существующего у Siemens модуля Ethernet, а отдельный (несименовский) функционал, не требующий вызова Мастера сети Ethernet в проекте Step-7 Microwin, а удобно настраиваемый через Web-интерфейс.

3. Встроенная батарейка для часов. Напомню, чтобы на оригинальном S7-200 часы реального времени работали как надо при выключенном ПЛК продолжительное время, необходимо купить специальный встраиваемый модуль "CLOCK" (6ES7297-1AA23-0XA0), который сам по себе стоит дороже, чем китайский S7-200. Во всех китайских клонах всё это уже встроено и ничего дополнительно покупать не надо. Производитель ПЛК на фото внизу, например, обещается, что часы реального времени будут работать на выключенном ПЛК 2 года: Perfect clock: built-in clock battery, dual-loop power supply design, support the perpetual calendar standby use for more than 2 years.
 
Noname-контроллер в прозрачном корпусе из оргстекла. Продаётся на Aliexpress с пометкой "VZN", а также они есть под брендом Lollette (для удобства буду называть их далее в этой статье VZN)
 

4. На некоторых китайских клонах (в том числе на этом VZN, что на картинке сверху) встроен функционал по сохранению данных на flash-памяти. В описании к ПЛК сказано так: Power-down retention: FLASH technology is adopted, no battery support is required, and it is permanently stored. Ну, соответственно, при выключении ПЛК данные будут храниться не неделю (перед тем, как сбросятся на значения по умолчанию), как обычно, а сколько угодно времени.


Теперь главный вопрос - вопрос качества китайских клонов. 

К сожалению, поделки - есть поделки. Вот что я могу сказать по их поводу:


1. На ПЛК Gipeng, Amsamotion, Lollette и VZN был обнаружен глюк с работой оператора JMP. Подробнее смотри в этой статье. На ПЛК Shenjuye и Unimat такого косяка нет. На контроллере в прозрачном корпусе из оргстекла, фотография которого размещена выше, глюк присутствует.

2. На ПЛК Gipeng, Amsamotion, Lollette и VZN был обнаружен глюк с работой оператора FOR. Подробнее смотри в этой статье. На ПЛК Shenjuye и Unimat такого косяка нет.

3. На нескольких Gipeng и Shenjuye моделей 224XP выходил из строя Port 1 интерфейса при использовании в качестве свободно программируемого порта (для Modbus RTU, например). Рекомендую использовать на этих контроллерах только Port 0 для этих целей, а Port 1 оставлять для PPI.
 
4. На контроллера Shenjuye странно работает порт RS485 для Modbus RTU (Master) - время от времени передача данных прекращается с ошибкой 6 (порт занят другим процессом), притом, что никакого другого процесса в этот момент нет и быть не может (на всех других подобных ПЛК тот же алгоритм работает прекрасно). После этого ПЛК будто бы подвисает: алгоритмы вроде бы выполняются, но значения некоторых битов через Status Chart отображаются некорректно, а попытка их изменения там ни к чему не приводит. Stop-Run ПЛК (как и Power-Up Reset) эффекта не имеет, только выключение питания и повторное включение возвращает его к нормальной работе.

5. Ни на одном из клонов нет возможности штатного заводского сброса ПЛК. Единственные производители, которые честно в этом сознались - это Shenjuye и VZN, где на тумблере RUN/STOP положения TERM нет в принципе, т.е. даже надписи такой нет. У контроллеров Gipeng и Unimat положение TERM имеется, но не работает. У контроллеров Amsamotion и Lollette надпись TERM на корпусе имеется, а тумблер RUN/STOP третьего положения не имеет при этом (обман, кругом обман...). Сименовская программа wipeout.exe, сбрасывающая ПЛК S7-200 к заводским настройкам, не будет работать на всех этих контроллерах. 
По большому счету это означает, что если вы, например, забыли пароль к собственному ПЛК, то сбросить этот пароль вы уже не сможете и никакую новую программу залить в него тоже (хотя паяльник никто не отменял... Программатор спасет ситуацию). Тоже самое касается варианта, если вы установили максимальную защиту (4 уровня) на свой ПЛК, а потом решили перезалить System Block - сделать это можно только лишь заводским сбросом, который на этих ПЛК не работает (тут и паяльник не поможет...).

6. На Gipeng Modbus slave работает косячно. Пришлось раз в минуту поставить реинициализацию (вызов MBUS_INIT, который по идее надо делать только в первом цикле), потому что через определенное время работы (всегда по-разному: иногда 10 минут, иногда сутки) происходит какой-то сбой и данные перестают передаваться.

7. На контроллерах Gipeng был замечен глюк с установкой даты и времени ПЛК, т.е. при попытке это сделать программными методами происходил сбой, приводящий к полному обнулению Data Block. Глюк непосредственно связан с текущим временем, примерно так, что до 12 часов включительно дата и время вроде бы устанавливается нормально, начиная с 13 часов начинаются косяки. 

8. Контроллеры Gipeng не работают с модулями Profibus-DP (6ES7 277-0AA22-0XA0). Т.е. модуль показывает, что работает, а по факту ничего контроллер через него не передаёт. Другие китайские контроллеры с модулем Prifibus-DP я подключать не пробовал.

9. Не работает функция PTO на примерно 99% китайских контроллеров, в том числе на Gipeng, Amsamotion, Lollette (2022 года) и VZN. Работала ли эта функция на контроллерах Shenjuye, продававшихся ранее также под брендом Lollette, я теперь уже сказать не могу, но учитывая его значительные отличия от перечисленных клонов, вполне возможно, что и работала. На клонах S7-200, продающихся под брендом OneWin функция PTO не работает.
Отсутствие возможности использования функции PTO означает отсутствие поддержки Мастера последовательного вывода импульсов (PTO Wizard). 
При этом функция PTO работает корректно на контроллерах Unimat (на aliexpress их нет, но есть дилеры в России), поддерживается на модификации контроллеров Amsamotion (более дорогая версия с портом Ethernet на борту) и контроллерах Gongbei. 
Мастер PTO Wizard, кстати, не поддерживался в старых версиях прошивки Siemens (V1.x), но там он выдавал ошибку еще на этапе добавления функции в проект. А китайские контроллеры никаких ошибок не выдают, поскольку формально они имеют версию v2.x: просто при попытке перейти в RUN загорается индикаторный светодиод SF/DIAG. 
В общем, несмотря на то, что формально китайцы дешевых клонов используют прошивки V2.х, PTO Wizard в них недоступен. Это, конечно, серьезно уменьшает функционал этих контроллеров. Чтобы функция заработала, Amsamotion предлагает купить их контроллер CPU224XP с портом Ethernet, на котором и функция PTO уже поддерживается, как они утверждают, однако, стоимость такого контроллера сопоставима с ценой оригинального CPU224 (не XP). Следовательно, если задача требует PTO (управление шаговиками и сервоприводами), но не требует AI и AQ на борту контроллера, то целесообразнее будет купить оригинальный Siemens. Контроллер же Unimat модели CPU224 в принципе стоит как оригинальный Siemens CPU224, хотя... если речь идет об оптовой закупке, то его можно купить официально у дилера, возможно, это даст экономический эффект.

10. На контроллерах Shenjuye замечен такой глюк: при осуществлении Download только одного Program Block сбиваются в нули все данные в Data Block. Т.е. приходилось при каждом изменении алгоритма перезаливать и Data Block тоже (предварительно внося в него изменения касающиеся текущих значений настраиваемых величин, что было неудобно). Ни на каких других клонах такой проблемы не выявлено.

11. На абсолютно всех китайских поделках не функционирует отсек для батарейки для долговременного хранения данных в памяти процессоров (6ES7 291-8xxxx-0XA0), т.е. в корпусе просто установлена заглушка, под которой нет никакого разъёма. На контроллерах Lollette заглушка вообще не вытаскивается. Некоторые производители запихивают под эту заглушку какой-то свой функционал, всякие тумблеры, например. На контроллере Unimat установлен 6-пиновый разъем с контактами в два ряда по 3 штуки, для чего он - неизвестно (если появится информация, добавлю в статью). На контроллерах VZN (с прозрачным корпусом из оргстекла) отсека для батарейки вообще нет, а сохранение данных ПЛК реализовано на flash-памяти.

12. Gipeng не хранит значения Retentive Ranges. Не буду утверждать за все модели, но на некоторых косяк этот проявился. Т.е., благодаря внутреннему конденсатору, значения должны сохраняться примерно в течение недели, а по факту не хранятся нисколько и сбрасываются в значения по умолчанию, указанные в Data Block. Думаю, это не касается всей линейки Gipeng, а только отдельных бракованных изделий.

13. Gipeng'овские модули для подключения термопар оказались бракованными - диапазон измерения напряжения (в милливольтах) оказался гораздо ниже требуемого, из-за чего термопарой типа J удалось померять температуру только до 100 с копейками градусов Цельсия. Проверено на двух таких модулях. На алиэкспресс модули Gipeng часто продают как безымянные, лишь указывая, что они совместимы с Siemens S7-200, следует быть внимательным и уточнять у продавца, кто является производителем такого модуля.

14. У Gipeng памяти меньше заявленной. Т. е. попытка использовать в программе адреса VB10000 и больше привела к тому, что контроллер просто перестал переводится в RUN. На оригинальном Siemens и на Amsamotion такой проблемы не возникло.

15. Китайские поделки не совместимы по запчастям ни с Siemens, ни друг с другом, т.е. платы внутри корпуса хоть и схожи, но у каждого производителя свои. Контроллеры элементарно весят по-разному. Даже блоки питания для контроллеров с питанием 230 В несовместимы, не говоря уже обо всём остальном. На Gipeng, Amsamotion и Shenjuye проверено, на контроллерах Unimat не проверял (не разбирал их).

16. У Gipeng низкое качество сборки. Паяют похабно и флюс не вытирают с плат. Разница чувствуется даже в сравнении с тоже паянными вручную платами от Shenjuye и Amsamotion.

17. У контроллеров Gipeng при достаточно громоздкой программе заметно, что таймеры, которые должны отсчитывать с дискретизацией 100 мс, на самом деле считает медленнее. Причем, если хорошо постараться, то можно сделать так, что вместо 100 мс он будет считать примерно 500 - 600 мс. Та же программа на Amsamotion выполнилась без такого глюка. На других ПЛК не проверял.
 
18. У контроллеров OneWin выставленное в System Block сохранение Retain Memory с адресом выше примерно VB3000 по факту не работает. Т.е. хранить можно только данные до VB3000, остальное слетает в значения по умолчанию при выключении

19. Модификации контроллеров S7-200 со встроенным портом Ethernet имеют укороченный верхний клеммник (на три контакта меньше: 15 вместо 18), из-за чего разделение релейных выходов по группам происходит не так, как у оригинального S7-200. У контроллеров Gipeng GF-CPU224T-IE и GF-CPU224TXP-IE так и вовсе из-за порта Ethernet урезано количество дискретных выходов с 10 до 8 штук. Интерено также то, что у разных производителей клонов группировка DQ еще и по разному организована (см. картинку). Соответственно, оперативно замена контроллера CPU224XP на клон с Ethernet'ом простым переключением клеммной колодки не представляется возможным, а невнимательность персонала при таком переключении может привести к выходу контроллера из строя.


Для моделей клонов CPU226 с Ethernet (например, GF-226T-IE) такой проблемы нет, потому что
у них порт Ethernet расположен в левой части корпуса (над портами PPI, где у 224XP клеммник для аналоговых сигналов), благодаря чему подключение контактов на клеммнике DQ полностью соответствует оригинальному CPU226.

В свете всего вышесказанного, я бы хорошо подумал на ваше месте, что лучше купить - клон, или же китайский, но оригинальный Siemens S7-200CN.

суббота, 7 апреля 2018 г.

FATEK и импульсное управление

Буквально намедни я писал о тайваньских контроллерах FATEK и их взломе и тут внезапно вспомнил, что у меня есть одна интересная информация. В своей статье я вскользь упомянул, что у меня есть в распоряжении контроллер FBs-20MN. Спрашивается, откуда он у меня, если я работаю только с Siemens? На самом деле, мы весьма успешно заменяем всякую узкоплёночную автоматику (да, да вот её самую) на нашу, российскую (с нашими правильными алгоритмами, написанными для контроллером Siemens) и вот остался после такой модернизации контроллер FATEK. Я не буду ничего плохого про него говорить, потому что этот ПЛК плохо работал не из-за производителя, а из-за тупых тайваньских программистов, но есть кое-что и в самом ПЛК, что отличает его от Siemens, далее предлагаю вам две фотографии моего осциллографа, который показывает сигнал высокочастотного управления сервоприводом: первая - импульсные сигналы от FATEK, вторая - тоже самое от Siemens S7-1200. Без комментариев.




Особенности измерения сопротивления на S7-1200

Как известно, к контроллерам S7-1200 можно подключать модули расширения для измерения сигналов сопротивления, но предназначены эти модули, в первую очередь, для сигналов с датчиков температур (термосопротивлений), потому модули так и называются RTD - Resistance Temperature Detectors. Но ведь может быть задача, когда мерить надо вовсе не сигнал от термосопротивлений, может стоять задача измерить сопротивление от 0 до нескольких килоом, например. В настройках данного модуля в TIA Portal можно выставить диапазон измерений для каждого канала:



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

- мерить сопротивление от 0 до 600 Ом - значения в этом случае будут в тех же единицах, что и для аналоговых модулей 0..10 В и 0..20 мА, т.е. значение 27500 будет соответствовать 600 Ом. Экспериментально выяснилось, что померить удаётся чуть больше, чем 700 Ом (у меня получилось максимум 714 Ом, после этого показывает 32767 - ошибка датчика).

- мерить сопротивление для датчика Pt1000. Конечно, у самих таких датчиков диапазон изменения сопротивления гораздо уже, чем может понадобится (от 800 до 1800 Ом), но это вовсе не значит, что модуль RTD не способен охватить бОльший диапазон. Экспериментально выяснилось, что можно померить таким образом сопротивление от 60 Ом до примерно 4900 Ом. Значение получается градусах (точнее, в целых числах, где последняя цифра - это знак после запятой, т.е. как бы градусы помноженные на 10), его надо масштабировать в Омы самостоятельно. Если брать по таблице, то значение -500 (т.е. -50 град) должно соответствовать 803.15 Ом, а 1000 (т.е. 100 град) - 1385 Ом. У меня так оно и получилось. Но есть один нюанс: нельзя померить слишком маленькое сопротивление (ниже 60 Ом). Верхняя граница в 4.9 кОм определяется исходя из того, что максимальное значение может быть 10000 (т.е. 1000.0 град).

У меня была задача померить сопротивление от 0 Ом. Как видим, вариант 60..4900 Ом для этого не подходит. Поэтому я вышел из положения следующим образом: я подсоединил датчик одновременно к двум каналам модуля RTD, настроил их: первый на 0..600 Ом, второй - на Pt1000 и написал алгоритм переключения:

R_.isR1_actual := (AI_RTD_R1 <> 32767 AND AI_RTD_R1 <> -32768);

R_.isR2_actual := (AI_RTD_R2 <> 32767 AND AI_RTD_R2 <> -32768);
 

OBRYV_R := R_.isR1_actual = false AND R_.isR2_actual = false;
 

R_average := (Read_AI_R1.OUT_value + Read_AI_R2.OUT_value) / 2.0;
 

useAverageValue := false;

IF(R_.isR1_actual AND R_.isR2_actual) THEN 
   R_.PV := R_average;
   IF(R_average > R_.R_switch - R_.R_delta AND
      R_average < R_.R_switch + R_.R_delta)
   THEN
      useAverageValue := true;
      IF(Read_AI_R1.OUT_value < R_average) THEN R_.mode := 0;
      ELSE R_.mode := 1; END_IF;
   END_IF;

   IF(R_.isUseR2 = false AND
      ((R_.mode = 0 AND Read_AI_R1.OUT_value > R_.R_switch) OR     
       (R_.mode = 1 AND Read_AI_R2.OUT_value > R_.R_switch)))
   THEN
      R_.isUseR2 := true;  
   ELSIF(R_.isUseR2 AND
      ((R_.mode = 0 AND Read_AI_R2.OUT_value < R_.R_switch) OR     
       (R_.mode = 1 AND Read_AI_R1.OUT_value < R_.R_switch)))
   THEN
      R_.isUseR2 := false;
   END_IF;
ELSE
   IF(R_.isR1_actual) THEN R_.isUseR2 := false;
   ELSIF(R_.isR2_actual) THEN R_.isUseR2 := true; 
   END_IF;
END_IF;

IF(OBRYV_R = false) THEN
   IF(useAverageValue = false) THEN
      IF(R_.isUseR2 = false) THEN R_.PV := Read_AI_R1.OUT_value;
      ELSE R_.PV := Read_AI_R2.OUT_value;
      END_IF;
   END_IF;
ELSE
   R_.PV := 99999.0;
END_IF;


В этом фрагменте кода:
OBRYV_R - это такой бит, который предназначен для проверки аварии обрыва датчика
Read_AI_R1.OUT_value - это такое значение Real в Омах, которое получилось в результате масштабирования сигнала AI_RTD_R1 c первого канала модуля RTD (0 - 0 Ом, 27500 - 600 Ом)
Read_AI_R2.OUT_value - это такое значение Real в Омах, которое получилось в результате масштабирования сигнала AI_RTD_R2 cо второго канала модуля RTD (-500 - 803.15 Ом, 1000 - 1385 Ом)
R_.R_switch -  значение сопротивления, при котором будет происходить переключение между каналами (у меня выставлено значение 693 Ом)
R_.R_delta - дельта (плюс/минус) к R_.R_Switch (у меня выставлено значение 1 Ом)

Таким образом, задействовав два канала, можно померить весь диапазон от 0 до 4.9 кОм.

Нюансы


В настройках TIA Portal можно выбрать двух, трёх и четырёхпроводную схему подключения датчика. Я не знаю, зачем эта настройка, но факт в том, что если не подключить все 4 клеммы, то работать нормально ничего не будет. Т. е. даже если выбрана двухпроводная схема и датчик подключен на клеммы I+ и I-, то остальные две клеммы (M+ и M-) всё равно нельзя оставлять неподключенными, т.е. надо ставить перемычки с M+ на I+ и с M- на I-. В общем-то в сименовской инструкции об этом тоже написано.

По ходу проведения экспериментов я заметил, что модуль RTD ведёт себя как-то странно: то показывает ошибку при нормально подключенном датчике, то показывает одно и тоже значение, какое бы сопротивление я не подключал (т.е. как будто бы "зависает", при этом при отключении датчика исправно показывает 32767). Выяснилось, что модуль немного "сходит с ума", если к нему "на горячую" то подключать что-то, то отключать, то провода местами менять и т.д. Делать надо так: обесточили контроллер, подсоединили всё, что нужно, после этого включили, тогда никаких глюков нет.

Какие ещё варианты



1. Использовать модуль обычных аналоговых входов и преобразователь сигнала сопротивления в унифицированный сигнал в mA. Следует отметить, что у многих производителей (например, Schneider или Овен) такие устройства изначально заточены на термосопротивления, т.е. для нестандартных диапазонов у них преобразователей нет. Но, всё таки можно что-то найти. Например:

- у ABB есть такой преобразователь TTR200 с входным сигналом до 5 кОм. Сколько стóит не знаю.

- есть российская такая штука: НПСИ-ПМ, которая позволяет измерять до 10 кОм (диапазон выхода в mA настраиваемый). Цена его около 6000 р., делают в Ростове-на-Дону.

- у Овен есть контроллер ПР200 примерно за те же 6000 р., у которого 4 аналоговых входа на борту, которыми можно померить в т.ч. и сопротивление до нескольких кОм и есть аналоговый выход 0..20 мА, т.е. остаётся дело за малым - написать примитивную программку для этого дела.

2. Изменить входное сопротивление через дополнительный резистор, т.е. сместить диапазон, чтобы не от 60 Ом по факту мерить, а от 0. Верхняя граница также, естественно, сместится.

3.Использовать распределённую станцию ET200SP, к которой цеплять модули от контроллера S7-300 ($$$ money, money, must be funny...).

Распароливание контроллеров FATEK

Недавно появилась задача слить программу с запороленного тайваньского контроллера FATEK FBs-40MA. В общем и целом задача оказалось весьма простой. Для того, чтобы слить программу, необходимо скачать взломанную версию среды разработки WinProladder.
В интернете архив со взломанной версией называется WPlad300-12308-ENU_CR2.rar, он содержит исполняемый файл установки, скачать его вы можете здесь:

WinProladder 3.00 Build 12308 CRACKED

Для тех, кто не знаком с ПЛК FATEK, может показаться странным отсутствие кнопок Download и Upload. Действительно, интерфейс немного нетипичный. Т.е. там есть кнопка Online, которая означает не только переход в соответствующий режим, но и запрос на загрузку и выгрузку проекта в/из ПЛК. Причём, в этом режиме все изменения тоже автоматически отправляются на контроллер. Ну, вот такая странная у них среда разработки.

Взломанная версия - это не последняя версия WinProladder, сейчас уже есть версия 3.24, но я никакой разницы не заметил.

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


Значит, во-первых, не факт, что вот это взломанное ПО 100% поможет слить вам программу из ПЛК. Дело в том, что пароль может запрашиваться как в момент установки соединения при переходе в режим Online, так и уже после того, как программа слита. Если вы подключаетесь к ПЛК и программа сразу просит пароль - взломанная среда вам не поможет.



Но может быть и так, что программа сливается, а потом просит пароль, и если он введён не верно, то программу нельзя ни посмотреть (она снова просит пароль), ни сохранить. В этом случае считайте, что вам повезло. Во взломанной версии WinProladder на запрос пароля в таком случае просто ничего не надо вводить, а сразу нажимать OK. После того как программа успешно выгрузилась нужно убрать пароль и Project ID. Для этого заходим в меню Project -> Project Setup -> Password, там сначала просят ввести старый пароль (ничего не вводим), потом просят новый пароль (опять ничего не вводим). Повторяем процедуру для Program ID в том же меню. Сохраняем файл проекта. После этого проект, при желании, можно открывать уже в более новой версии WinProladder.

Повторюсь, такой способ работает не всегда. Я не знаю тонкостей работы с этими ПЛК, но суть в том, что я один и тот же проект сначала успешно слил из контроллера FBs-40MA, а потом ради интереса залил в свой контроллер FBs-20MN, и когда я попытался уже со своего контроллера программу слить, то у меня сначала запросили пароль, т.е. не зная его слить программу уже было нельзя ни в какой версии WinProladder.

Внимание, FAKE!



Помимо всего этого дела, есть ещё какая-то странная программа под названием что-то типа All PLC and HMI Crack или как-то так. Программа платная. Вы её легко найдёте в интернете по дебильному салатовому внешнему виду. Разработал её какой-то вьетнамец. Вообще, внешне есть определённый намек на истину, т.е., например, в меню его программе есть пункты для снятия пароля с Siemens S7-200, так вот только для прошивки 2.0 предлагается снимать пароль с ПЛК, а для прошивки 2.1 - только пароль с файла проекта. Это действительно так и есть у Siemens S7-200 (только для это давно есть бесплатные программы). Так вот, я не берусь утверждать, что вьетнамская программа - это прям 100% фейк, но тот факт, что программа стоит не особо и дорого (что-то вроде $200), и то, что она рекламируется как ПО с функциями по взлому сразу многих моделей ПЛК разных фирм, но при этом никто ещё не выложил такой программы в общий доступ в интернет, намекает на то, что это всё-таки фейк. Тем временем, вьетнамец усердно постит ролики на youtube о том, как его программа замечательно работает, при этом подделать всё, что в этих роликах показано не составляет труда, поскольку его чудо-программа расшифровывает пароли с ПЛК, которые сам вьетнамец и запоролил, т.е. не факт, что прога просто не показывает заранее известный пароль всегда чисто для того, чтобы снять доказательное видео для youtube.
 
UPD 2026. Почитать про то, как вьетнамец зарабатывает, продавая несуществующую программу для взлома контроллеров, можете здесь. 

понедельник, 12 февраля 2018 г.

Проблемы совместимости S7-200 и китайских PLC: глюк с оператором JMP

Читай также:
Проблемы совместимости S7-200 и китайских PLC: глюк с оператором FOR
Китайские поделки на тему Siemens S7-200

Итак, я хочу рассказать об интересном дефекте китайских контроллеров, который я на днях случайно обнаружил. Как уже известно, если вам нужен ПЛК Siemens S7-200 (снятый с производства в Германии в 2012 году), то есть два способа его купить: это выкупить остатки со склада каких-нибудь торгашей, которые берегут это добро уже больше пяти лет, чтобы продать по цене в 2 - 4 раза превышающей его былую стоимость, либо (самый простой способ) - купить S7-200CN на Aliexpress.

Контроллеры с маркировкой CN производятся в КНР официально, т.е. это оригинальный Siemens, но сделанный в Китае. Его отличие от немецкого Siemens's только в том, что Step-7 Micro/Win отказывается с ним работать при активированном английском интерфейсе, по крайней мере так было раньше (после переключения интерфейса на иероглифы проблема решается).
 Update. Аллелуя! Похоже, Siemens таки убрал необходимость переключения на китайский язык при заливки контроллеров S7-200CN (покупал тут, залился в английском MicroWIN без проблем, на вид, вроде, настоящий Siemens, label присутствует, цвет корпуса с зеленоватым оттенком как у немецких S7-200)

Однако, на Aliexpress есть и другие ПЛК, которые повторяют функционал S7-200. О них я уже как-то рассказывал в этой статье. Все они деляться на три группы:
1. Имеют полную совместимость с S7-200. Т.е. программируются в среде Step-7 Micro/Win и совместимы с модулями Siemens (GIPENG, AMSAMOTION, SHENJUYE (продаются под лэйблом LOLLETTE)).
2. Имеют совместимость с модулями S7-200, но имеют свою среду разработки (CO-TRUST, среда - MagicWorks PLC)
3. Не имеют совместимости с модулями S7-200, но программируются в среде Step-7 Micro/Win (FONIN)

Итак, я никогда не приобретал не полностью совместимые с Siemens контроллеры, такие как Co-Trust или Fonin, ничего не могу о них пока сказать.
Но у меня в распоряжении имеются контроллеры Gipeng, Amsamotion и Shenjuye (Lollette). И вот, добавив в программу для Amsamotion ранее написанную функцию ПИД-регулирования (я использую только свои собственные функции регуляторов), я внезапно обнаруживаю, что она не работает. Удивительное дело, ведь функция уже проверена на контроллерах Siemens S7-200, как же так? Оказывается, в контроллере Amsamotion наблюдается непонятный глюк: неправильно работает оператор JMP. Я проверил выполнение этого оператора на том же примере на контроллерах Siemens, Gipeng и Shenjuye (Lollette) и вот оказалось, что глюк не проявляется на оригинальном Siemens S7-200 и на Shenjuye (Lollette) LE-200, а на Gipeng GF-200 проявляется в том же виде, что и на Amsamotion AMX-200CN.

Описание проблемы оператора JMP

В общем, напомню, что оператор JMP (jump) из набора команд S7-200 является оператором условного перехода, что является косвенным аналогом оператора JE в классическом ассемблере и оператора JC в языке STL для S7-300. В языках программирования высокого уровня для ЭВМ обычно называется GOTO (go to).

Суть работы оператора JMP # в том, что при логической 1 в вершине стека он осуществляет переход на указанную метку, которая задаётся командой LBL #, где # - это номер метки.
При компиляции этот номер заменяется адресом строки кода, куда осуществляется переход. Т.е. весь код программы, который находится между операторами JMP и LBL чисто физически не должен выполняться.
Соответственно, после выполнения перехода стек сохраняется в том виде, в котором был на момент перехода. А поскольку переход условный, то если он выполнен, то после перехода в вершине стека может быть только логическая 1, т.к. это и есть условие для перехода. Инструкция от Siemens для особо одарённых даже содержит специальное уточнение:

The Jump To Label (JMP) instruction performs a branch to the specified label (n) withon program. When a jump is taken, the top of stake value is always is logical 1.

И вот представьте моё удивление, когда на моём ПЛК Amsamotion AMX-200CN переход выполняется, а в вершине стека при этом логический ноль. Взаимоисключающие параграфы сие называется. Я начал разбираться и выяснил, что, оказывается, не всем операторам одинаково везёт, как говориться. Т.е. большинство операторов спокойно игнорируются, когда оказываются между JMP и LBL при переходе, но есть операторы, которые таки выполняются! Невероятно, но факт. Смотрим.
 

Для удобства восприятия я выбрал адреса переменных похожими на адреса системных битов, т.е. в моих примерах бит M10.0 должен всегда быть равен 1 (т.е. равен SM0.0), а бит M10.1 всегда быть равен 0 (т.е. равен SM0.1, который равен нулю во всех циклах программы, кроме первого).
Я немного добавил линий, чтобы было понятно, какие команды выполняются правильно, а какие - нет (зелёные - это правильно, красные - нет).
В синей рамке находится то, что по правильному алгоритму работы программы должны быть пропущено.


Как видим на представленном выше скриншоте перед командой JMP находится команда LD SM0.0, результат которой всегда = 1, что подтверждается тут же в самой правой колонке. На скриншоте видно, что команда NOT расположена между JMP и LBL, т.е. выполняться не должна, но она таки выполняется и первое же присваивание M10.0 заканчивается записью туда не 1, а 0, поскольку произошло инвертирование, которого быть не должно.

Таким же точно глючным образом выполняются и некоторые другие команды, работающие только со стеком, а именно команды: OLD, LDS, LPS, LRD, LPP. Глючно выполняются команды LB=, LB<>, LB<, LB>, LB<= и LB>=, а также аналогичные команды для WORD (LW= и т.д.) и DWORD (LD= и т.д.). Вот пара примеров:





Команды LD, A и O, а также команды фронта EU и ED не выполняются между JMP и LBL, т.е. работают корректно:





Ну, и напоследок, есть команда, которая работает вообще непонятным образом в такой ситуации - это команда ALD. Она не просто выполнилась между JMP и LBL, хотя не должна была, но и дала результат равный логическому нулю, несмотря на то, что в обоих первых уровнях стека были единицы. Вот гляньте, картина маслом:


Контроллер команду ALD выполняет нормально в обычной ситуации, чему также даю подтверждение:



 В общем и целом, хочу заметить, что для написания новых программ тут нет проблемы: обойти эти препятствия нет никакой сложности. Совсем другое дело, если требуется использовать контроллер вместо уже существующего оригинального Siemens как резерв. Да, можно сказать, что вероятность, что результат работы будет иным, не так и велика. Но у меня, лично, в программе нашлось аж две функции, а всего три конкретных места кода, которые пришлось исправить. Т.е. если кто-то на предприятиях, где находятся мои программы с этими функциями в ПЛК Siemens S7-200 решит заменить эти контроллеры на Amsamotion или Gipeng, то, в лучшем случае, алгоритм не будет работать, а в худшем даже и не знаю.

Более-менее застрахованы от проявления глюка те, кто использует более примитивные языки LAD и FBD, поскольку интерпретатор, автоматически переводящий в STL, не осуществляет особо сильной оптимизации, т.е. не заботиться о более рациональном использовании стека, поэтому вероятность проблем меньше, хотя они и не исключены.
Кроме того, не застрахованы также и те, кто использует функции от Siemens, поскольку гипотетически и они могут содержать небезопасный код. Я бы рекомендовал, на всякий случай, распароливать функции от Siemens (смотри здесь) и проверять код.


Какой код можно считать небезопасным и как это проверить.

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

Условно говоря, если до оператора JMP в стеке были какие-то значения, которые будут использоваться после команды LBL путём вызова команд A, O, LPP, LRD, LDS, NOT, EU, ED и др., то надо до оператора JMP выполнить присвоение значений стека определённым битам (желательно тем, которые больше в программе нигде не участвуют), а после команды LBL изменить код так, чтобы использовать эти самые биты, а не стек. Да, это будет дольше выполняться (хоть этого никто и не заметит), будет менее рационально, но зато обезопасит всех от потенциальных проблем с китайскими ПЛК. Операторы, использующие стек и меняющие его значение, расположенные между JMP и LBL, имеют право на существование, поскольку, если JMP не выполнится, то их выполнение не будет иметь проблем, однако, важно понимать, что использования этих значений после LBL не должно быть, или же эти значения еще до оператора LBL нужно присвоить каким-то битам памяти.
Вот примитивный пример:

 
Как видим, выполнялась команда LPP, которая не должна была выполняться, и результат, записанный в M10.2, оказался рассчитан неправильным образом. Исправить это можно так:


Ну, я думаю, что все понимают, что речь идёт об абстрактном примере, поэтому в нём значение M10.0 присваивается биту M20.0, естественно, что можно это упростить, просто это не делается именно потому что предполагаются гораздо более сложные алгоритмы, где подобное упрощение не будет возможно.

пятница, 1 декабря 2017 г.

Проблема с прямой адресацией на S7-1200

Как известно, TIA Portal использует косвенную адресацию, но, одновременно с этим, не запрещена и прямая адресация. Для этого в Data Block надо просто снять галочку в разделе Attributes под названием Optimized block access (это для версии TIA Portal V13 SP1).

В общем и целом адресация пародирует S7-200, только нет привычных нормальных команд (типа ANDB и т.д.), приходится обходиться тем, что есть в языке SCL.
Однако, и с этим оказались проблемы.

Описание проблемы я разместил на сайте Siemens.

Вот вам русское описание этого примера.

Я создал data block DB1 с именем "HMI_DB". Добавил в него 4 переменных:

var1  Real  DB1.DBD0 
var2  Real  DB1.DBD4
var3  Word  DB1.DBW8
var4  Word  DB1.DBW10
 
Я хочу использовать HMI_DB.var3 и HMI_DB.var4 как буфер для моих операций пересылки байтов.
В частности, данная операция востребована при приёме и дальнейшем использовании данных по интерфейсу RS485, где данные принимаются по количеству слов данных.

Итак, я хочу передать два слова данных из HMI_DB.var1 в два отдельных слова HMI_DB.var3 и  HMI_DB.var4, затем я хочу передать результат из var3 и var4 в переменную var2:




"HMI_DB".var1 := 24.7; // (для примера), это 16#41C5_999A
-------------
%DB1.DBW8 := %DB1.DBW0; // 16#41C5
%DB1.DBW10 := %DB1.DBW2; // 16#999A
%DB1.DBD4 := %DB1.DBD8; // (oops!) 16#4E83_8B33



Нежданчик! Программа автоматически конвертировала (DINT_TO_REAL), хотя никто этого не просил, значение 16#41C5_999A (что является 1,103,468,954 в DEC-формате) в 16#4E83_8B33 (что является 1.103469e+009 в Real-формате).
 

Если я напишу таким образом, то всё работает нормально:

%DB1.DBW4 := %DB1.DBW8;
%DB1.DBW6 := %DB1.DBW10;

Вот такая интересная система конвертации в TIA Portal, т.е. среда разработки как бы "знает", что %DB1.DBD4 имеет тип Real. Какая умная среда разработки, правда? Да, не совсем. Попробуем написать вот такое присвоение:

%DB1.DBD0 := 24.7;

И что мы видим? На такую запись компилятор отругался следующим сообщением:

Datatype "LReal" cannot be converted implicitly to datatype "DWord".

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

В обсуждении на форуме Siemens разъясняют, что компилятор просто не умеет автоматически преобразовывать LReal в DWord, т.е. число с плавающей точкой компилятор всегда понимает как LReal, а если его присваивают переменной типа Real, то автоматом происходит преобразование LREAL_TO_REAL. Таким образом, для присвоения DWord дробного числа требуется два поочерёдного преобразования: LREAL_TO_REAL, а затем - REAL_TO_DINT, чего компилятор делать автоматически не умеет.