Twincat 2 [Problem]: *** is greater than maximum number of POUs(2048). Increase the maximum number of POUs and reload! Do you want to cancel the loading now?

Have you ever got in such situation? After opening some project for the first time you get this error: 

* is greater than the maximum number of POUs(2048). Increase the maximum number of POUs and reload!Do you want to cancel the loading now?

* is greater than the maximum number of POUs(2048). Increase the maximum number of POUs and reload!Do you want to cancel the loading now?

Here Is the solution: 

1 . Open your Twincat folder. Navigate to “Plc” folder.

2. Find TwinCAT PLC Control.ini and open it with some text editor.

3. Search for “MaxNumOfPOUs

4. Change the value from 2048 to 4096

5. Save changes.

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

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.