PDA

Просмотр полной версии : Адресация переменных Codesys



high_roll
29.08.2024, 12:14
Доброго времени суток всем!

хочу узнать про нумерацию регистров по Modbus в Codesys 2.3 для контроллера ПКЛ110-М02
у меня сейчас настроена сквозная нумерация регистров (т.е. при добавлении адресов в конфигурации ПЛК регистры начинаются с 0 адреса и дальше 1, 2, 3, 4, и т.д.)
можно ли для Вашего контроллера создать переменную уже с заданным адресом, например чтобы значение Float передавалось по регистру с адресом 350, а переменная Word - по адресу 400 ИЛИ мне в ручную нужно создать 349 пустых переменных, на 350 будет необходимый мне Float, затем ещё 40+ пустых переменных и по адресу 400 нужный мне Word?

вот конкретный пример того, что мне нужно: сейчас мне пришлось создать пустые переменные с 53 по 56, чтобы по 57 адресу отправить нужный мне бит
можно ли сразу создать переменную с нужным адресом, и не заниматься созданием пустых переменных?

я искал решение на форуме и смотрел библиотеки, но или не понял способ решения моей проблемы или не нашёл то, что мне нужно

kondor3000
29.08.2024, 12:37
Доброго времени суток всем!

хочу узнать про нумерацию регистров по Modbus в Codesys 2.3 для контроллера ПКЛ110-М02
вот конкретный пример того, что мне нужно: сейчас мне пришлось создать пустые переменные с 53 по 56, чтобы по 57 адресу отправить нужный мне бит
можно ли сразу создать переменную с нужным адресом, и не заниматься созданием пустых переменных?

я искал решение на форуме и смотрел библиотеки, но или не понял способ решения моей проблемы или не нашёл то, что мне нужно

В слейве нельзя задать адрес, зато адрес можно задать в мастере. Если вам нужен 57 регистр, кто мешает вам сделать в Мастере его 53 и не добавлять пустые в слейве?

Тем более с 350 и 400 регистром, проще в Мастере его сделать хоть 50, хоть 0.

Если у вас нет вариантов перепрограммировать Мастера, то можно добавить 300 (400) штук 2Byte или 150(200) штук 4Byte.
Читать вы будете не всё, а только 2 нужных регистра.

Тут биб-ки для Слейва и описание https://owen.ru/forum/showthread.php?t=28996

melky
29.08.2024, 12:52
Через библиотеки вроде можно. Через Конфигурацию нет, к тому же там есть выравнивание.

high_roll
29.08.2024, 16:50
проблема в том, что мастер-устройство у заказчика
а они вообще не АЛЁ и не знают как да и что менять

ну вот вариант с библиотеками хороший
дайте совет пожалуйста какие есть, и есть ли к ним руководство?

Валенок
29.08.2024, 18:18
А что вам дадут лежащие где-то здесь либы? Вам нужно 57 и 400. Ну поставите стартовый 57, и все равно будет структура в 343 регистра.
Местная либа (ниже привели) не работает с отдельными регистрами. Вы также определяете непрерывный блок памяти для слейва, только не в конфигурации. Разница - небольшая.

Лучше уточняйте у них (где мастер) макс номер регистра. Если из тыщи не вышли - наколотите "4 byte" сколько указали по максимуму/2 (идент узла в помощь) и пишите только что нужно как и делали.

А чтоб забыть про конфигурацию и не заниматься хренью с вычислениями адресов - можно типа так:


var
регистр_W : word := ..
регистр_X : word := ..

W : word;
X : real;

---------------------------
SysMemCpy(ADR(W), ADR(%QD6.1.0) + 2 * регистр_W, SIZEOF(W)); //взяли из слейва

.. поработали c W
X := .. посчитали чего-то

SysMemCpy(ADR(%QD6.1.0) + 2 * регистр_X, ADR(X), SIZEOF(X)); //и положили в слейв
И пофиг на выравнивание если вдруг невыравненые адреса у того мастера.
А для всяких булей проще через точку или промежуточные функции GET/SET_BIT написать с заданием абсолютного адреса бита. Погромист вы или кто? Пусть машина считает - она для того.

Да и для либы с этим же проще. Все равно блок слейва - единое пространство памяти
Ну или через syslibcom пакеты самому колбасить "на лету" без выделения памяти под слейв - это скучно хотя и возможно.

kondor3000
29.08.2024, 18:44
Тут биб-ки для Слейва и описание https://owen.ru/forum/showthread.php?t=28996

Но лучший вариант, скопировать 2Byte (4Byte) в конфигурации и зажать секунд на 5-7 Ctrl + V

high_roll
02.09.2024, 11:59
Но лучший вариант, скопировать 2Byte (4Byte) в конфигурации и зажать секунд на 5-7 Ctrl + V

понял, спасибо :D

high_roll
02.09.2024, 12:00
и благодарю за другие советы, буду смотреть, что лучше подойдёт