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.

Problem with starting of SIMATIC S7-PLCSIM v13 and solution

Hello, guys.

In this article I want to tell you about a problem I encountered , and my solution.Probably there are a few different solutions, but I will tell you about mine.

It’s about SIMATIC S7-PLCSIM v.13 software, with SIMATIC S7-1200 1212CAC/DC/RLY hardware.

When I try to start PLCSIM v.13 SP1,with TIA PORTAL on Windows 7 64 bits, I get the following error message:

Fig 1. Error message 

Also when I try to go in Simulation Mode on Tia portal, there was also an error message: Тhe totally integrated automation portal has encountered a problem and needs to close
First, I try to follow the instructions, shown in the error message. I put the disc in the PC and start the repair. Unfortunately, it was useless ,and I tried another  method.. the working method.

SOLUTION:1.    Go to Updates for PLCSIM V13 SP1  and download the update.2.    Download both files:a.     SIMATIC_S7_PLCSIM_V13_SP1_Upd1.exe (2.5 MB)b.     SIMATIC_S7_PLCSIM_V13_SP1_Upd1.001 (370.6 MB)3.    IMPORTANT: Download the both files in one directory.4.    Execute SIMATIC_S7_PLCSIM_V13_SP1_Upd1.exe   5.    Follow the instructions

If you have any questions about the article, or with the Mitsubishi robots at all, please don’t hesitate to write me an 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 алгоритъм

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

Проблем при стартиране на SIMATIC S7-PLCSIM v13

Здравейте, колеги. В текущата статия искам да споделя един проблем, и съответно решението му, на който аз се натъкнах. Той е свързан със SIMATIC S7-PLCSIM v.13. Преди да опиша какъв точно е проблемът искам да кажа, че ползвам SIMATIC S7-1200 с процесор 1212CAC/DC/RLY.

Когато се опитах да стартирам PLCSIM v.13 SP1 с TIA PORTAL v.13 SP1 на Windows 7, който е 64-битов, получих следното обезпокояващо съобщение показано на Фиг.1. Също така, при опит за стартиране на симулация през TIA PORTAL v13 поlучавах следното съобщение за грешка
“Тhe totally integrated automation portal has encountered a problem and needs to close”

Фиг.1 Грешка при стартиране на SIMATIC S7-PLCSIM v.13
Направих това, което пише, а именно да поправя инсталацията. За съжаление това не свърши никаква работа. След това направих малко проучване и установих, че трябва да имам направен ъпдейт.
Ъптдейта може да намерите на следния линк ->Updates for PLCSIM V13 SP1
ВАЖНО! – Задължително двата файла SIMATIC_S7_PLCSIM_V13_SP1_Upd1.exe и
SIMATIC_S7_PLCSIM_V13_SP1_Upd1.001  трябва да ги свалите в една и съща папка(директория). След това стартирате .ехе файла и следвате инструкциите. След като приключи с ъпдейтването PLC SIM V13 тръгна без проблем, както е показано на фиг.2

Фиг.2 Начален енгран PLC SIM V13

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