Codesys: Едномерни масиви


Здравейте колеги.

В тази статия съм решил да обясня какво представляват масивите, за какво се използват и как се декларират и извикват в средата Codesys.
Какво представляват масивите.Масива е структура която съдържа подредена информация. Може да си го представите, като последователност от клетки, като всяка клетка си има свой собствен пореден номер и вътре в нея се съдържа информация. Специфичното  в случая е, че всички клетки трябва да съдържат еднотипна информация, като тя може да бъде числа, символи както дори и структури. За структурите ще говорим по-нататък.
Какво е предназначението на масивите.

  • Събирането и организирането на информация от един и същи тип
  • Използване на едно име при използване на която и да е клетка от масива, като разликата е само индекса
  • Значително се улеснява сортирането на информация

Как се използват масивите.
Най-основната декларация, съдържа само името на масива, големината и типа на данните в него.

Име: ARRAY[From..To] of INT;

Тук е важно да се отбележи, че не е задължително броенето да започва от 1 до N както е при повечето езици за програмиране. В случая нямаме ограничение да броенето да започне от 7 и да свърши на 90.Ето и един пример за реална декларация:
NewArray: ARRAY[5..20] of INT;
Също така можем да дадем стойности на масива при самата инициализация.Ще използваме горния пример:
NewArray: ARRAY[5..20] of INT := [6,49,3,659,5];
Как се извикват елементи от масива.
Достъпването на всеки един елемент от масива става като в повечето езици от високо ниво. Пишем името на масива, и в скобите добавяме индекса който искаме да достъпим. За да покажа нагледно ще декларирам нова променлива от същия тип какъвто е и масива, и ще присвоя някоя от неговите стойности.

testBoolVar: BOOL;

testBoolVar:= NewArray[1];

Индкса на масива може да бъде и променлива.

arrIndex: int:=1;

testBoolVar: BOOL;

testBoolVar:= NewArray[arrIndex];

Ако имате въпроси с гореописаните неща, моля да задайте ги в коментарите.

Основни методи на декларация в Codesys (Structured text)

Здравейте колеги. 
 В тази кратка статия съм решил да ви опиша основните методи за декларации в Codesys. Ще ви покажа как се създават нови променливи, стрингове, масиви. Декларациите са абсолютно валидни за всички софтуери който са базирани на езика за програмиране “Structured text” (ST), дефиниран в стандарта IEC 61131-3. 
Първо ще започна с деклариране на променлива. 

TestVar: INT; 

 Декларираме променлива с име “TestVar” от тип Integer. 
При декларацията можем да използваме бързите клавиши за деклариране,а те работят последния начин: Името на променливата : първата буква от типа -> CTRL+ enter. олзваме буквите както следва:
– I – INT – S – STRING – B – BOOL – R – REAL 
Ако не напишете нищо след името на променливата, а просто натиснете CTRL+ Enter , автоматично ще декларирате променлива от тип BOOL. Деклариране на променлива с инициализираща стойност.                       TestVar: INT := 10; 
Това означава, че при първото извикване на променливата, тя ще има някаква стартова стойност. За пример ще дам, всеки един цикъл. Винаги трябва да имаме начална стойност, от която да започне броенето. Също така инициализиращата стойност може да бъде друга променлива.                       ТestVar1: INT:= 50;                        ТestVar: INT :=ТestVar1 ; Деклариране на стринг с дефинирана дължина.                      ТestString: STRING(80); 
В случая казваме, че дължината на стринга е от 80 символа. Можем да декларираме и инициализираща стойност на стринга. 
ТestString: STRING:= ‘Hello World’; Деклариране на масив с инициализираща стойност.                        TestArray: ARRAY[1..5] OF INT := [1,2,3,4,5]; 
В случая даваме освен големината на масива, също така и всичките инициализиращи стойности. Индексите на масива могат да бъдат както [1..5], също и [50..70], всичко зависи от целите на задачата. Деклариране на многомерен масив. 
                       TestArray: ARRAY[0..10,0..5] OF INT; 
В случая декларираме двумерен масив, в който всички стойности ще бъдат от целочислен тип.Деклариране на пойнтер. 
TestPointerToStrArray : POINTER TO STRING ( 50 ); Деклариране на пойнтер към масив от стрингове. 
TestPointerToStrArray : POINTER TO ARRAY[1..50] OF STRING ( 50 ); 
 Тук декларацията е много подобна на предната, с разликата, че първо казваме каква да е размерността на масива, и след това размерността на стринговеете. Ако имате накакви въпроси или забележки, ще се радвам да ги прочета в коментарите. Също така можете да ми задавате въпроси и на посочения имейл. 
 If you have any questions about the article, or with the Codesys programing at all, please don’t hesitate to write me email.

TestVar: INT; 

 Декларираме променлива с име “TestVar” от тип Integer. 
При декларацията можем да използваме бързите клавиши за деклариране,а те работят последния начин: Името на променливата : първата буква от типа -> CTRL+ enter. олзваме буквите както следва:
– I – INT – S – STRING – B – BOOL – R – REAL 
Ако не напишете нищо след името на променливата, а просто натиснете CTRL+ Enter , автоматично ще декларирате променлива от тип BOOL. Деклариране на променлива с инициализираща стойност.                       TestVar: INT := 10; 
Това означава, че при първото извикване на променливата, тя ще има някаква стартова стойност. За пример ще дам, всеки един цикъл. Винаги трябва да имаме начална стойност, от която да започне броенето. Също така инициализиращата стойност може да бъде друга променлива.                       ТestVar1: INT:= 50;                        ТestVar: INT :=ТestVar1 ; Деклариране на стринг с дефинирана дължина.                      ТestString: STRING(80); 
В случая казваме, че дължината на стринга е от 80 символа. Можем да декларираме и инициализираща стойност на стринга. 
ТestString: STRING:= ‘Hello World’; Деклариране на масив с инициализираща стойност.                        TestArray: ARRAY[1..5] OF INT := [1,2,3,4,5]; 
В случая даваме освен големината на масива, също така и всичките инициализиращи стойности. Индексите на масива могат да бъдат както [1..5], също и [50..70], всичко зависи от целите на задачата. Деклариране на многомерен масив. 
                       TestArray: ARRAY[0..10,0..5] OF INT; 
В случая декларираме двумерен масив, в който всички стойности ще бъдат от целочислен тип.Деклариране на пойнтер. 
TestPointerToStrArray : POINTER TO STRING ( 50 ); Деклариране на пойнтер към масив от стрингове. 
TestPointerToStrArray : POINTER TO ARRAY[1..50] OF STRING ( 50 ); 
 Тук декларацията е много подобна на предната, с разликата, че първо казваме каква да е размерността на масива, и след това размерността на стринговеете. Ако имате накакви въпроси или забележки, ще се радвам да ги прочета в коментарите. Също така можете да ми задавате въпроси и на посочения имейл. 
 If you have any questions about the article, or with the Codesys programing at all, please don’t hesitate to write me email.

Mitsubishi robots: Параметри част 1

Здравейте колеги.
Започвам да правя една серия от статии в които ще разписвам един от най-важните сегменти при програмирането и настройка на индустриални манипулатори на фирма Mitsubishi, а именно параметрите.Започваме със категория “Movment parameter” , тъй като там се намират параметрите които се използват най-често.

Motion Limit (Ограничаване на движенията) Ограничение на движението може да бъде направено в двете основни координатни системи а именно : Joint movement range и XYZ movement range .

–     За да зададем ограничение в Joint координатната система можем да използваме интерфейса в менюто Movement parameter -> Motion limit , или да променяме стойностите на параметъра „MEJAR“. Което и от двете да изберем трябва да запомним няколко важни неща:

*   Лоша практика е да се увеличават ограниченията в движенията, защото това може да доведе до достигане на механичните стопери на робота.

*   Ограниченията се задават, като се съобразява в двете граници долна и горна, да е поставен съответния положителен или отрицателен знак.

–     За да зададем ограничение в XYZ координатната система можем да използваме интерфейса в същото меню, или да променяме параметъра “MEPAR”. Общо взето рестрикциите при него са подобни, както при първият.

Motion Limits


Фиг.1 Меню Motion LimitParameter

JOGОт менюто JOG можем да прави настройка на оперативните скорости, когато управляваме робота в режим „Joint jog” или в „XYZ Jog”. Съответно имаме да настроим следните параметри:               За Joint JOG:-        H-Inching – стъпката в градуси(deg) когато сме избрали High Unit за скорост.-        L-Inching – стъпката в градуси(deg) когато сме избрали Low Unit за скорост.
За XYZ JOG:-        H-Inching – стъпката милиметри(mm) когато сме избрали High Unit за скорост.-        L-Inching – стъпката в милиметри(mm)  когато сме избрали Low Unit за скорост.


Фиг.2 Меню JOGParameter

HANDЗа параметъра HAND както и неговите подменюта, ще има цяла отделна статия.Weight and SizeТова е менюто в което можем да подадем информация на робота за физическите характеристики на инструмента. Това в общия случай е необходимо ако целта ни е да направим оптимизация на съотношението Скорост/Време за изпълнение на движение, или да използваме функцията “Оadl”.
Work–        Weight [Kg] – задаваме теглото на детайла който ще вдига робота-        Size[mm]  по X,Y,Z – задаваме физическите размери на детайла-        Center of gravity position[mm]  по X,Y,Z – трябва да пресметнете центъра на тежестта по всяка една от осите и да ги въведете във съответните полета.

Hand–        Weight [Kg] – задаваме теглото на инструмента-        Size[mm]  по X,Y,Z – задаваме физическите размери на инструмента, измерени от началото на координатната система на инструмента, или по-точно казано, премерени от края на фланеца на последната става.-        Center of gravity position[mm]  по X,Y,Z – трябва да пресметнете центъра на тежестта по всяка една от осите и да ги въведете във съответните полета.


Фиг.3 Меню Weight and sizeParameter

Така завършва първата част от поредица статии описващи параметричните възможности на роботите на фирма Mitsubishi.
Ако имате каквито и да е въпроси свързани със статията, или със роботите като цяло, можете да ги зададете в коментарите или на имейл.

If you have any questions about the article, or with the Mitsubishi robots at all, please don’t hesitate to write me email.

Управление на асинхронен двигател посредством G120 и S7-1200 на фирма Siemens

Статията е свързана със един проблем който разреших по време на дипломното ми проектиране. Той се появи когато проектирах частта свързана със вентилация, и по-конкретно управление на вентилатора. Под управление се разбира старт-стоп и продължителност на вентилиране. След като успях да “разреша проблема” реших, че може би разяснение в една кратка статия би спестила главоболия и време на колеги които също като мен са в началото на своята работа със продуктите на Siemens, и програмирането на PLC като цяло.
Като за начало да уточня със какво точно работя. Това е софтуера на фирма Siemens – TIA Portal 13(Totally Integrated Automation). Той е удобен за работа, и съчетава в себе си функционалности свързани не само със програмирането на PLC-то, но и със интеграцията между устройствата, определяне методите на комуникация, йерархичната структура на системата както и много други неща. Инвертор G120c PN 4.7, както и контролер S7-1200.  

Като за начало ще присъединим инвертора към системата,а това става по следния начин:1.От менюто “Hardware catalog” избираме модела инвертор с който разполагаме(за целите на проекта: SINAMICS G120c PN 4.7). Чрез drag and drop го добавяме в “Devices and networks”.2.Свързваме контролера и инвертора. Избираме Profinet комуникация за текущия проект.3.Кликва се с десен бутон на създадената връзка и от контекстното меню се избира „Assign device“.Когато връзката между устройствата е установена, трябва да ъплоуднем конфигурацията на PLC-то.

Фиг.1 Конфигурирана връзка между S7-1200 и G120c
За да се уверим, че комуникацията работи коректно, от главното меню на TIA портал избираме “Device and Networks”, където ни е предоставена опция за “Flash” на което и да е от периферните устройства. След това трябва да добавим така наречената стандартна телеграма. Тя се използва за циклична комуникация между контролера и инвертора. В случая зa най-подходяща е избрана “Standard Telegram 1, PZD-2/2”. Тя е подходяща по редица причини. 

                Фиг 2. Структура на Standard Telegram 1, PZD-2/2               

ПараметърОписание
STWControl Word
ZSWStatus Word
NSOLL_ASpeed setpoint 16 bit
NIST_ASpeed actual value 16 bit

Таблица 1. Описание на Standard Telegram 1, PZD-2/2
Както се вижда на фиг.2 тази телеграмa има сравнително проста структура. Имаме по една 16 битова дума, съответно контролна и статусна с които можем да манипулираме, и съответно следим състоянието на инвертора. Също така имаме по една 16 битова дума за заданието по скорост, и сътоветно такава с която да четем реалната скорост.

Телегратама се избира по следния начин:1.В “Device view” , избираме от „Hardware catalog“ -> „Submodules“ сътоветно Standard Telegram 1, PZD-2/2.2. Чрез drag and drop я поставяме в “Device overview”.

Фиг.3 Добавяне на станратната телеграма към проекта.
След като всичко по настроиките е готово, следва да се напише програмата която ще управлява двигателя. Ще използваме езика за програмиране Ladder. Освен стандартните ключове, ще използваме и няколко функционални блока. Те са ни нужни за да можем да пишем или съответно четем информацията за инвертора. За писане се използват DPWR_DAT и съответно Move. За четене DPRD_DAT. 

Фиг. 4 Старт на трансфера посредством избраната телеграма
Използваме блока DPWR_DAT за да определим първо коя ще ни е контроната дума(STW). Също така със тази функция задаваме канала по който ще бъдат прехвърляни думите, а именно телеграмата „Standard Telegram 1, PZD-2/2“. 
Точно в обратната посока работи DPWR_DAT. Тя служи за четене на дума от инверотора към PLC-то.Трансфера на думата трябва да следва логиката заложена в Таблица 2.За пишем и презаписваме нужните ни стойности във думата с която ще работим, ползваме библиотечната функция “Move”. Първо се подава дума в която 0 бит да бъде със стойност 0. След това се подава същата дума със стойност на нулевия бит 1. Това поставя инвертора в режим “Ready”, тоест имаме направена идентификация и при стойност 1, на бит ноомер 3, двигателя ще се развърти. 

Таблица 2. Структора на контролната дума по битове
В конкретния случай първата контролна дума която ще бъде записана е „047E“. След това следвайки логиката, пишем новата дума която е „047F”. В Таблица 3, са показани думите във бинарен формат, където ясно се виждат кои са активираните битове при двете думи. В случая става дума само за пускане и спиране на двигателя, но това е една много малка част от възможностите на инвертора.

HexadecimalBinary
047E0000 0100 0111 1110
047F0000 0100 0111 1111

Таблица 3. Контролните думи в HEX и BIN формат
Освен да пуснем двигателя, трябва и да зададем скорост на въртене. Нея ще я зададем, като подадем на следващата поредна дума скороста която искаме.

Фиг5. Програмна реализация за Start-Stop алгоритъм

Това е решението което аз успях да реализирам. Готов съм да отговря на всякакви въпроси, както и да прочета критика. Всяка градивна дискусия би била полезна за всички четящи темата.

Актуализация на система с девиаторни ключове. Схема с Smart Relay

Разработката която искам да ви покажа, я направих преди няколко месеца. Тя ми беше дадена като задание за курсов проект, но смятам, че има своята експлоатационна тежест, и може да търпи развитие и модификации.

Поради факта, че имах конкретни задания, схемата е реализирана с програмируемо реле на фирмата Schneider Electric, но концепцията може да бъде реализирана спокойно с който и да е подобен продукт.

I.                  Съдаржание на проекта
1.     Задание. Същност и пояснения.2.     Блок схема на поставаената задача.3.     Актуализация на заданието, чрез промяна на технологията и ТСА.4.     Описание на входните и изходните сигнали на системата.5.     Програмна реализация на задачата.

II.            Реализация на поставените задачи
1. Задание. Същност и пояснения.

Целта на поставената задача е да се реализира система за включването и изключването на лампа от няколко различни ключа.

Фиг.1 Схема на свързване на лампа, с два отделни ключа
На Фиг.1 виждаме реализирана схема на свързвана, която използва два ключа за промяна на състоянието на една лампа. Независимо от това който от ключовете бива натиснат, винаги лампата ще променя състоянието си от включено в изключено.

Фиг.2 Схема на свързване на лампа, с три отделни ключаАналогично на първия случай, на фигура 2 имаме същата система, но реализирана с 3 ключа. Класическото изпълнение на тази задача става, чрез използването на девиаторни ключове (Multiway Switches). То е доказано във времето, като ефективно но само по себе си има няколко съществени недостатъка. Най-съществения от тях е, че при нужда за добавяне на допълнителни ключове, трябва да се правят сложни хардуерни и монтажни процедури, които при реализацията посредством PLC са премахнати.
2. Блок схеми на поставените задачи.
Принципа на работа на двете схеми на свързване може да бъде описано, чрез съответните блок схеми.

Фиг.3 Блок схема на вариант с два ключа
На схемата като Input 1 и Input 2 са отбелязани съответно промяната на състоянието на ключове 1 и 2. Тя е изградена, съборазно таблицата за истинност на „сума по модул 2“ или „изключващо ИЛИ“.

Фиг. 5 Таблица на истинност на „изключващо ИЛИ“.Ако приемем, че лампата е логически елемент който може да приема две състояния, 1 –„Включено“ и 0-„Изключено“, и ключовете могат да заемат същите състояния, тогава можем да разсъждаваме по блок схемата по следния начин. Ако двата ключа имат еднакви състояния, то това означава, че лампата е включена, и към нея се подава „0“ за да бъде спряна. Ако са с различни стойности, означава, че лампата е спряна и към нея се подава „1“ за да бъде пусната.3.     Актуализация на заданието, чрез промяна на технологията и ТСА.
В класическия си вид, този тип системи за запалване на лампа, използват така наречените девиаторни ключове (Multiway Switches).

Фиг.6 Принципна схема на свързване с девиаторни ключовеАко добавим един кръстат ключ можем да направим схемата да пали лампата от 3 различни места.

Фиг.7 Принципна схема на свързване с три ключа
Чрез добавянето на още допълнителни кръстати ключове, свързани последователно между двата девиаторни, можем да направим колкото са необходими места за включване. Това само по себе си работи добре, но при нужда от добавяне на нови ключове, се налагат няколко по-сложни от монтажна гледна точка операции. Първо трябва да се прекъсне захранването. След това трябва да се прекъсне връзката между два кръстати ключа, или между девиаторен и кръстат, да се разпънат нови проводници, който да са свързват новия елемнт към старите два, да се свърже новия елемент, и след това да се пусне отново захранването. В цялата процедура могат да възникнат няколко основни проблема. Един от тях е физическото разположение на ключовете и проводниците. Ако са на неудобно място, където трябва да се правят разрези, пробиви в стени, с цел да се достигнат самите проводници. След това трябва да се изтеглят проводници до мястото на поставянето на новия ключ, което само по себе си означава 4 проводника.Цялата тази процедура може да се съкрати ако се използват така наречените Smart Relay. Те представляват програмируеми релета, имащи различни на брой входове и изходи. Предимството на тези релета е, че в тях може да се залагат потребителски програми. В случая можем да използваме такова реле, като междинен модул, който да обработва подадените от физическите ключове сигнали, и да управляваме лампата. С използването на такъв междинен модул, много лесно можем да добавям допълнителни ключове, и интегрирането им в работната програма става много лесно.

За целите на курсовата работа е избрано програмируемо реле на фирма “Schneider electric” модел SR2B121JD.

Фиг.8 Програмируемо реле модел SR2B121JD
Релето е подходящо защото има 8 входни канала, поддържащи дискретни входове, каквито ще поучаваме от ключовете. Също така има релейни изходи, поддъращи над 220VAC, което ни позволява да свържем лампата дикретно, и така да я управялваме без допълнителна силова електроника.

Фиг.9 Принципна схема за управление реализирана с SR2B121JDИдейната постройка тук се базира на това, че ключовете и релето са закачени на една обща захранваща шина. Това означава, че когато искаме да добавим нов ключ това може да стане лесно, като го прикачим на захранващата шина, и съответно към релето. След това просто се добавя новия канал в кода на релето, както ще бъде пояснено.
4.     Описание на входните и изходните сигнали на системата. Избор на подходящ контролер.

ПроменливаO/IТип на сигналаОписание
I1IДискретенВходен сигнал от първи ключ
I2IДискретенВходен сигнал от втори ключ
I3IДискретенВходен сигнал от трети ключ
Q1OРелеенИзходен сигнал за включване на лампа

Таблица 1. Описание на входно-изходните сигнали
5.     Програмна реализация на задачата.Поставената задача е релаизирана, чрез програмируемо реле модел SR2B121JD на фирма Schneider electric. Изпозлван е FB пакета на софтуера ZelioSoft 2.

Фиг 10. Реализация на схема с два ключа в средата ZelioSoft 2Схемата реализирана със три ключа е подобна, единственото което трябва е да добави още един сравняващ елемент.

Фиг 11. Реализация на схема с три ключа в средата ZelioSoft 2Логиката на работа покирва описаното в точка три.
ЛИТЕРАТУРА
[1]   SR2B121JD Datasheet – Mouser Electronics[2] http://www.eltro-bg.com/articles_8.htm