PDA

Просмотр полной версии : CoDeSys работа с массивами.



Роман26
20.04.2012, 14:45
Здравия всем! Решил отсортировать/найти максимальный/минимальный элемент массива и застрял! Для этого нету никаких функций?

Валенок
20.04.2012, 15:11
Набираем в поисковике "пузырьковая сортировка" ....

VitVir
20.04.2012, 15:12
Юзаем oscat.lib, если хочется именно функции
http://www.oscat.de/
минимальный/максимальный можно одним перебором найти.

Роман26
20.04.2012, 15:23
Да знаю я и пузырьковую сортировку.. Я вот, в пхп, например, люблю с массивами работать (http://www.php.ru/manual/ref.array.html) а в CDS вообще все так плохо. oscat.lib - смотрю! Благодарю!

ASo
20.04.2012, 15:26
Набираем в поисковике "пузырьковая сортировка" ....ЧИВО????
quicksort, не хуже. Я имею ввиду не хуже log2(N)

Роман26
20.04.2012, 16:08
Юзаем oscat.lib, если хочется именно функции
http://www.oscat.de/
минимальный/максимальный можно одним перебором найти.
А что за указатель (pointer) во входящих значениях в oscat?? Как его вычислить? Или откуда взять?

Валенок
20.04.2012, 16:28
ЧИВО????
Уж такие здоровенные массивы в CDS что нужны сложные сортировки


А что за указатель (pointer) во входящих значениях в oscat?? Как его вычислить? Или откуда взять?
??????

Роман26
23.04.2012, 10:52
фб _ARRAY_SORT (из библиотеки oscat.lib) требует два входных значения:
PT: POINTER TO ARRAY[1..32000]
SIZE: UINT
Я не знаю что туда передавать! Полагаю pointer, в данном случае, это не то, что возвращает функция ADR (возвращает 32 бита - DWORD), а _ARRAY_SORT требует на входе INT (и то кастрированный на 768).

Роман26
23.04.2012, 13:25
В общем-то мне следует уточнить... В погоне за методами реализации я немного отошел от сути. Мне всего-то надо найти индексы минимального/максимального значения одномерного массива, состоящего из трех элементов - MhArr: ARRAY[1..3] OF REAL;

Валенок
01.05.2012, 10:18
Ну так нашли ?

Роман26
02.05.2012, 13:13
Валенок, всё гениальное просто)


MinI := 1;

FOR incr := 1 TO 3 DO
IF MhArr[incr] < MhArr[MinI] THEN
MinI := incr;
END_IF
END_FOR

И что мне было так заморачиваться...:D

CLPE
03.05.2012, 06:43
Валенок, всё гениальное просто)


MinI := 1;

FOR incr := 1 TO 3 DO
IF MhArr[incr] < MhArr[MinI] THEN
MinI := incr;
END_IF
END_FOR

И что мне было так заморачиваться...:D

MinI := 1;

FOR incr := 2 TO 3 DO
IF MhArr[incr] < MhArr[MinI] THEN
MinI := incr;
END_IF
END_FOR

Роман26
04.05.2012, 13:01
MinI := 1;

FOR incr := 2 TO 3 DO
IF MhArr[incr] < MhArr[MinI] THEN
MinI := incr;
END_IF
END_FOR

О, да! Ещё лучше!

fpy
10.08.2019, 07:52
Всем спасибо за советы. 7 лет спустя нашел вашу ветку.
пользовался http://www.drivesandsystems.com/codesys-array-sorting-for-plc-programs/
и https://forum.codesys.com/viewtopic.php?t=8099

моя задача: передать процедуре (функции) массив, получить отсортированный массив
мое решение для Codesys2.3:
текст PLC_PRG
PROGRAM PLC_PRG
VAR CONSTANT
N:INT:=9;
END_VAR
VAR
arr1: ARRAY [0..N] OF INT := 399,288,1,4,5,6,7,8,9;
xRunSort:BOOL;
END_VAR
VAR CONSTANT
END_VAR

IF xRunSort THEN
sort2(ADR(arr1));
xRunSort := FALSE;
END_IF


текст функции Сортировки
FUNCTION sort2 : BOOL
VAR_INPUT
ptr:POINTER TO ARRAY [0..N] OF INT;
END_VAR
VAR
i,j:INT;
iTemp:INT;
iOne: INT;
iTwo: INT;
END_VAR
FOR j := 0 TO N-1 DO
FOR i:=0 TO N-j-1 DO
iOne:=ptr^[i];
iTwo:=ptr^[i+1];
IF iOne>iTwo THEN iTemp:= iOne; iOne:=iTwo; iTwo:=iTemp; END_IF
ptr^[i]:=iOne;
ptr^[i+1]:=iTwo;
END_FOR
END_FOR