Как запихать bool массив в память ПЛК чтобы по модбасу видеть? В том смысле как правильно объявить его.
values AT%MX100.0 : ARRAY[1..28] OF BOOL;
Компилятору не нравится Походу один bool хочет занимать один байт а не бит или шо
Указатели читай. И массив там будет с числом ячеек = размеру переменной. Или union пользуй и промеж.переменную, которую потом отдай в модбас в формате word допустим.
Это структура/объединение. В ней две переменные разного типа, но по факту это одна область. Допустим массив из двух вордов и реал. Пишешь в реал тег, а считываешь массив вордов и отдаешь в модбас. Так как модбас с вордами стандартно. Если хочешь с байтами, то массив байтов и тусуй их перед отправкой. По сути те же указатели но упакованы для пользователя.
TYPE REAL_2WORD_4BYTE :
UNION
re : REAL;
w2 : ARRAY [0..1 OF WORD;
b4 : ARRAY [0..3] OF BYTE;
END_UNION
END_TYPE re, w2, и b4 смотрят на одно и то же место в памяти
FUNCTION SWAP_REAL : REAL
VAR_INPUT
IN : REAL;
END_VAR
VAR
P : POINTER TO DWORD;
P1 : POINTER TO DWORD;
END_VAR
// цель - поменять местами слова в real
// поскольку к REAL нельзя применить битовый сдвиг, то
// получаем указатель на входное значение
P := ADR(IN);
// получаем указатель на результат
P1 := ADR(SWAP_REAL);
// дальше работаем с памятью как с DWORD
P1^ := ROL(P^, 16); в кодесисе точно работает) union в 61131-3 же определён
Комментарии: 19
Rustem
Указатели читай. И массив там будет с числом ячеек = размеру переменной. Или union пользуй и промеж.переменную, которую потом отдай в модбас в формате word допустим.
Berkeman
Что за команда такая, union? На практике никогда ранее не сталкивался Своими словами
Andrew
Объединение. Ты смотришь на одну и ту же область памяти, но представляешь ее разными типами Это не команда, а dut
Berkeman
Типа M0 UNION M1 ... UNION M7 := D0? Что?
Andrew
Data user type
Kirill
Кстати очень прикольная тема. В дельте есть, но, сука ее нельзя сунуть в системные функции, где на выход идет массив.
Rustem
Это структура/объединение. В ней две переменные разного типа, но по факту это одна область. Допустим массив из двух вордов и реал. Пишешь в реал тег, а считываешь массив вордов и отдаешь в модбас. Так как модбас с вордами стандартно. Если хочешь с байтами, то массив байтов и тусуй их перед отправкой. По сути те же указатели но упакованы для пользователя.
Andrew
Можно больше двух переменных) Сейчас компуктер запущу
Rustem
Ну практически только с 2мя пользовал.
Andrew
TYPE REAL_2WORD_4BYTE : UNION re : REAL; w2 : ARRAY [0..1 OF WORD; b4 : ARRAY [0..3] OF BYTE; END_UNION END_TYPE re, w2, и b4 смотрят на одно и то же место в памяти
Berkeman
О, офигенно удобная штука. Это как модбас в овене же
Andrew
я максимум с mb вот такое делал
Rustem
Удобно. Но если сделать указателем, то меньше гемора при переносе проекта на другой ПЛК где не поддержано Юнион. Но такого я ещё не встречал.
Berkeman
Указатель на что?
Andrew
FUNCTION SWAP_REAL : REAL VAR_INPUT IN : REAL; END_VAR VAR P : POINTER TO DWORD; P1 : POINTER TO DWORD; END_VAR // цель - поменять местами слова в real // поскольку к REAL нельзя применить битовый сдвиг, то // получаем указатель на входное значение P := ADR(IN); // получаем указатель на результат P1 := ADR(SWAP_REAL); // дальше работаем с памятью как с DWORD P1^ := ROL(P^, 16); в кодесисе точно работает) union в 61131-3 же определён
Rustem
То есть это не просто расширение?
Andrew
Блин. Уже комп погасил)) Вроде оно в стандарте определено