Реверс-инжиниринг китайского ПЛК FX3U-14MR. Часть 1. Железо

На рынке уже довольно давно присутствуют китайские клоны промышленных контроллеров Mitsubishi серий FX1, FX2, FX3. Их особенностью является возможность программирования в средах GX Developer, GX Works2 от Mitsubishi. Самые дешевые продаются в виде маленьких плат. Те, что подороже, имеют корпус, сеть RS-485, часы реального времени и т.д.

Это китайский бескорпусный FX1N-10MTЭто китайский бескорпусный FX1N-10MTА это китайский FX3U-14MRА это китайский FX3U-14MR

Большинство этих ПЛК (клонов) сделано на микроконтроллерах линейки STM32, а в последнее время также на клонах STM от китайских Geehy Semiconductor, GigaDevice и др. Далее слово «клон» я буду употреблять уже в связке с микроконтроллером STM32. В статье я не буду рассматривать аспекты программирования «клонов-клонов», т.е. буду считать, что имею дело с самым настоящим STM32, для которого можно применять официальную документацию STMicroelectronics.

Так о чем же эта статья? На электронных форумах некоторые участники прошивают отладочные платы типа Blue pill, которые сделаны на STM32, прошивками от этих самых китайских ПЛК, получая возможность программировать платы из GX Developer, GX Works2. Т.е. уходят от софта для программирования микроконтроллеров в софт для инженеров по автоматизации. Но у Blue pill нет никакой «промышленной» обвязки в виде питания +24В, оптических развязок интерфейсов и необходимых уровней напряжений, стандартных аналоговых сигналов 4–20mA, 0–10В. В итоге одним Blue pill в полевых условиях не обойтись.

Я же решил сделать обратную процедуру, а именно взять промышленный контроллер (не идеальный, но кое-что на нем уже есть) с готовыми полевыми обвязками. Задействовать железо этих ПЛК в средах программирования микроконтроллеров, таким образом получить более широкие возможности по программированию в С/C++, не ограниченные языками FBD, LD. Также этому в некоторой степени способствовала статья Repurposing a PLC clone for use with Arduino. Для этого я приобрел китайский FX3U-14MR, почти такой же как на фотографии выше, у которого кроме дискретных и аналоговых входов-выходов есть еще RTC и RS-485 сеть. Я не являюсь профессиональным электронщиком (простите мою любительскую схему) или программистом микроконтроллеров, а скорее принадлежу к плеяде АСУшников и вообще люблю готовые программные модули и библиотеки, поэтому программировать буду в Arduino IDE, используя Arduino core for STM32 MCUs STM32duino со всеми доступными библиотеками. Но прежде чем писать программы, нужно понять все «железо». Определить Microcontroller Unit (далее MCU), получить схему подключения периферии, чем мы и займемся в первой части.

Часть 1. Железо. Схема узлов и периферии

Плата контроллера выглядит вот так. На моем контроллере есть некоторые изменения, о которых я расскажу ниже. Из основного видны: MCU STM32F103VCT6, оптопары дискретных входов, ключи ULN2003 для реле, трансивер RS-485 SP485E (рядом с разъемом RS-485), операционный усилитель LM158 для аналоговых выходов DA0, DA1, батарея RTC и часовой «кварц» рядом с ней. Слева внизу последовательный порт RS-232 и трансивер TP3232N. Рядом с MCU микросхема I2C EEPROM. Сверху (синие) подстроечные резисторы, еще выше светодиод Run и ручной переключатель режима Start/Stop. Ну и конечно виден некий разъем, на который, как я предполагал изначально, выведен интерфейс отладки STM32 SWD. Такая вот ардуина на стероидах.

Плата контроллераПлата контроллера

После нескольких часов, проведенных с лупой и мультиметром, удалось восстановить часть схемы интересующей меня периферии.

Электрическая схема основных узловЭлектрическая схема основных узлов

MCU

Когда я заказывал ПЛК, то надеялся (на самом деле 50/50), что он будет оснащен чипом STM32F103VCT6, как было видно на фотографиях лота. Но когда получил контроллер, то вместо STM32 увидел это. Хуже всего, что на нем не оказалось никакой вменяемой маркировки, только что-то типа 14CPU (или GPU), нацарапанной поверх затертого корпуса (что же там было до этого?). Впрочем я также ожидал клоны STM32 от Geehy Semiconductor или GigaDevice, но не совсем «noname». Я предположил, что это может быть отбраковка STM32, которую предприимчивые китайцы решили пустить в дело. Либо в лучшем случае это просто такая защита от копирования изделия (другими китайцами :)). В общем после всех дальнейших манипуляций с ПЛК я воспринимаю этот процессор как STM32F103VCT6, так как он видится и программируется в STM32CubeProgrammer, и STM32 ST-LINK Utility через интерфейс SWD. А также загружается с USART1 при выборе соответствующего boot mode.

Вероятно это STM32F103VCT6. Все залито лаком, который впрочем легко смываетсяВероятно это STM32F103VCT6. Все залито лаком, который впрочем легко смывается

I2C EEPROM

8-ножечная микросхема, расположенная рядом с MCU, оказалась чипом EEPROM с интерфейсом I2C. И скорее всего это что-то типа 64Кбит FT24C64 или похожая. На моей плате чип оказался тоже затертым. Пересмотрев множество фотографий аналогичных ПЛК, я так и не смог на 100% уверенно определить маркировку. Поэтому дальше с EEPROM разбирался уже на программном уровне. А вот зачем тут нужен EEPROM — вопрос. Я не разбирался подробно в штатных средствах программирования клонов Mitsubishi, но предполагаю, что в EEPROM могут храниться энергонезависимые переменные программы, либо может быть даже сама программа ПЛК. EEPROM не задействует аппаратный I2C STM32, хуже того он задействует линию SWDIO (PA13) интерфейса отладки SWD. В общем придется делить SWD с GPIO и использовать программный I2C.

Дискретный входы/выходы Xn/Yn, светодиод Run

Дискретные входы с обозначениями X0-X7 заведены на оптопары. Выходы оптопар притянуты к +3.3В, при срабатывании оптопары вход MCU замыкается на 0. Т.е. логика в программе для дискретных входов будет инвертированная.

Дискретные выходы Y0-Y4 подключены через ключи Дарлингтона ULN2003 к выходам MCU. Логика управления прямая. Управление светодиодом Run инвертированное.

Аналоговые входы/выходы ADn/DAn, два потенциометра настроек

Схема аналоговых каналов без подробностей. Необходимый минимум есть на электрической схеме. У части аналоговых входов (0–20 мА) впаян параллельный резистор на 500Ом, преобразующий внутри токовый сигнал 0–20 мА в 0–10В. Кроме того на плате присутствует пара подстроечных резисторов (делителей напряжения) синего цвета. Из оригинального описания ПЛК они предназначены для ручного задания значений некоторых регистров, которые можно использовать в программе ПЛК. В MCU они также заведены на АЦП входы. Напряжение с двух аналоговых выходов ЦАП MCU через операционные усилители преобразуется в сигнал 0–10В.

Ручной переключатель режима Start/Stop

На электрической схеме тоже обозначен. Либо притягивает вход MCU к +3.3В либо к 0. Но вот сам вход MCU уже представляет больший интерес. Переключатель подключен к порту PB2/BOOT1. Таким образом этим переключателем можно задавать состояние входа BOOT1 для управления режимом внутреннего загрузчика STM32. Запомним это.

Цепь мониторинга питания

Производитель, не сильно мудрствуя, сделал мониторинг питания контроллера на стабилитроне и делителе напряжения, подключенных прямо к входному напряжению +24В. На одной из фотографий выше показано, где расположены элементы этой цепи. Тут нет оптической развязки, и я не рекомендую питать контроллер напряжением выше +24В, чтобы не спалить вход MCU, напряжение на котором уже близко к 5В. Благо данный вход GPIO толерантный к 5В. Но такая цепь (раз она уже есть) позволяет отлавливать обесточивание ПЛК, а буферные конденсаторы обеспечивают несколько секунд работы без питания. Таким образом можно успеть сделать запись сохраняемых параметров в EEPROM, что я и сделал в своей программе-примере.

RTC

Часы реального времени являются частью MCU STM32F103VCT6. Плата имеет всю необходимую обвязку (кварцевый резонатор, батарею) для их функционирования. На схеме эти цепи не отражены.

Интерфейс RS-485

Заведен на UART4 MCU. Линия контроля передачи DE делит линию PA14 с SWCLK интерфейса отладки SWD аналогично EEPROM.

Интерфейс RS-232

Под RS-232 задействован USART1 MCU. Его можно будет использовать как угодно. В том числе для подключения к MCU через UART в STM32CubeProgrammer и загрузки прошивки как альтернатива SWD, в том числе в Arduino IDE. Для подключения вам понадобится USB-Serial адаптер либо аппаратный COM в ПК.

BOOT0 / BOOT1

У STM32 есть встроенный загрузчик прошивки, который позволяет удалять и заливать прошивку через USART1. Это очень удобно, т.к. USART1 на ПЛК как раз выведен на RS-232. Это касается и самых простых ПЛК, типа FX1N-10MT, которые не имеют SWD. К слову FX1N я тоже прошивал и программировал в STM32CubeProgrammer и Arduino IDE как раз через USART1.

Для загрузки через USART1 до включения питания контроллера необходимо замкнуть вход BOOT0 на +3.3V, удерживать при подключении и работе в STM32CubeProgrammer. По умолчанию он подтянут к земле через 10кОм.

А вот BOOT1 необходимо притянуть к 0, если это не так. Иначе не будет работать загрузка через UART. У FX1N-10MT это уже сделано в схеме, У FX3U это делается переключателем Start/Stop.

Нам нужны режимы либо User Flash memory, либо System memory.

923d4857c102f03da4bd93a3d929487d.jpg

Опять немного про FX1N-10MT. У меня есть еще такой контроллер, как на самой первой фотографии. Если присмотреться, можно увидеть там ниже центра 2 контактные площадки. С этим контроллером повезло, эти площадки как раз под джампер, подключающий +3.3В к BOOT0. Не у всех ПЛК она есть, на FX3U ее нет. Я впаял туда штырьевые контакты и поставил джампер. Теперь достаточно установить перемычку, включить питание ПЛК и можно заливать в него прошивку через UART. Вообще возможно про FX1N-10MT напишу отдельную заметку.

Так вот у рассматриваемого в статье ПЛК FX3U BOOT0 не выведен на какую либо контактную площадку, поэтому придется допаиваться к резистору, если BOOT0 вам нужен. В случае использования SWD трогать BOOT0 не обязательно, но есть нюансы, о которых позже.

Перемычка +3.3В<->BOOT0 (только на время прошивки)» />Перемычка +3.3В<->BOOT0 (только на время прошивки)</p>

<h3>Интерфейс SWD или ради чего все затевалось</h3>

<p>Когда я выбирал ПЛК, специально искал плату с контактными площадками с подписями типа PA13, PA14, RST. Ведь это порты отладочного интерфейса STM32 SWD, который позволяет делать что угодно с MCU. На многих ПЛК эти контакты есть. Мои ожидания оправдались. Эти контакты действительно были линиями SWD, но не без сюрприза. На плате оказались подписи P13, P14, и они были перепутаны местами по отношению к PA13, PA14. Кроме того у меня оказалось 6 контактных площадок вместо 5 как на всех виденных фотографиях других ПЛК, на некоторых было всего 4. Последний контакт оказался заведен на EEPROM. Таким образом можно в принципе копировать EEPROM внешним программатором, т.к. все его линии в итоге выведены на площадки. На своей плате я напаял 5-штырьковый разъем, на фото можно увидеть пустующий 6 контакт. Распиновка есть на электрической схеме.</p>

<p>Мы определились с периферией и интерфейсами программирования. А как заставить все это «петь и танцевать», во второй части. Продолжение следует.</p>
    
            <p class=© Habrahabr.ru