Вход

Просмотр полной версии : ПЛК110-60 (30) М2 ограничение количества сетевых переменных в 1000



Васильев
16.03.2026, 19:49
Коллеги, прошу помощи..
Проектировщики спроектировали ОГРОМНЫЙ шкаф управления на базе ПЛК110-60 + 6 МВ100-8А + 2 МВ110-6у+ 2 32ДН+1 16ДВ.
в итоге понимаю, что количество сетевых переменных 1000шт не хватает для реализации проекта..
Возможно ли увеличение количества сетевых переменных более 1000 (к примеру 1500).
Ранее обращался в поддержку - сказали нет возможности.

Спасибо большое.

МихаилГл
16.03.2026, 20:53
Что за сетевые переменные вы имеете ввиду? Если для скады и дальше передавать, то дискреты ужимайте в dint, и будет их в 32 раза меньше. Я вон для мастер скады 4000 переменных до лицензии в 200 тэгов ужал, а тут модулей кот наплакал...

In_Da_Cher_A
16.03.2026, 20:59
ПЛК110-60 + 6 МВ100-8А + 2 МВ110-6у+ 2 32ДН+1 16ДВ.у меня плк 110-60+2 8А + 20 16Д + 8Р
не помню проблем вообще никаких
ещё раза три можно было туда же засунуть

что можно было насовать в 1000 переменных на таком малом количестве входов - непонятно

In_Da_Cher_A
16.03.2026, 21:06
6 8А х 8 = 48х2 = 96
ну хорошо напихали всякой второстепенной ерунды на каждый канал - ещё 2х2 = 48*4=192
192+96=примерно 300
ок, напихали ещё по два регистра на каждый канал не знаю чего - итого 600
битовых тупо по каждому биту - ок, лень считать - 200 бит, это 12 регистров

грубо 800 переменных.
что там ещё надо придумать, чтобы ещё 200 нарыть?

kondor3000
16.03.2026, 21:17
Возможно ли увеличение количества сетевых переменных более 1000 (к примеру 1500).
Ранее обращался в поддержку - сказали нет возможности.

Вообще то, на ПЛК110 делали и по 4000 и больше сетевых переменных, кто вам про 1000 сказал?
Только опрос через String (групповой) лучше делать.

МихаилГл
16.03.2026, 21:47
Не знаю как у вас, а у меня на каждый механизм сама диагностика около 3х полноценных регистра в 32 бита занимает. А если и настройки алгоритма с hmi туда запихнуть, то ещё столько же. Зато я за 5 сек могу определить куда кого послать, если механизм встал колом, электрика на движок, киповца на концевики или датчики, асушника в рп на модуль. Операторы так привыкли, что сами знают кого и куда посылать в хорошем смысле этого слова)

Cs-Cs
16.03.2026, 22:26
Васильев У тебя какая лицензия (буква в обозначении): L или M? M - это неограничено, L - 360 байт на все Slave.
ОВЕНская библиотека Modbus поможет это обойти.

Васильев
17.03.2026, 07:01
Не знаю как у вас, а у меня на каждый механизм сама диагностика около 3х полноценных регистра в 32 бита занимает. А если и настройки алгоритма с hmi туда запихнуть, то ещё столько же. Зато я за 5 сек могу определить куда кого послать, если механизм встал колом, электрика на движок, киповца на концевики или датчики, асушника в рп на модуль. Операторы так привыкли, что сами знают кого и куда посылать в хорошем смысле этого слова)

у меня такой же принцип, в любой момент можно узнать полное состояние системы и узлов

Васильев
17.03.2026, 07:04
Коллеги я не спрашивал как мне разместить мои переменные в 1000 регистров...
Количество регистров в 1000 можно заметить при добавлении устройства Modbus TCP - последний регистр 999.
Ранее обращался в поддержку, где также подтвердили максим 1000 регистров

Васильев
17.03.2026, 07:23
Коллеги представляю решение, как обойти ограничение в 1000 сетевых переменных..
Насколько правильно время покажет, а пока сетевые переменные доступны в программе и управляются с панели.
Для доступа через панель создаем два устройства Modbus TCP для первого указываем порт 502, а для второго порт 510 (как для ПЛК)

Не могу найти описание настроек в меню смена целевой платформы (5 вложение),
03E8h есть 1000 и по идеи должен отвечать за количество сетевых переменных, но этот параметр ни на что не влияет...

Спасибо большое.

kondor3000
17.03.2026, 07:57
Добавляя по 4Byte, можно сделать 2000 регистров, ничего не делая больше 88512
Не считая нескольких TCP, которые можно добавить

Васильев
17.03.2026, 08:10
Добавляя по 4Byte, можно сделать 2000 регистров, ничего не делая больше 88512
Не считая нескольких TCP, которые можно добавить

возможно и это решение...
тогда как в программе обращаться к переменным? как получить доступ через панель?

kondor3000
17.03.2026, 08:17
возможно и это решение...
тогда как в программе обращаться к переменным? как получить доступ через панель?

Обращаться через структуру (или через массив), можно сделать несколько структур (массивов) и все положить в слейв,
из панели обращаетесь, как и раньше, по адресам.
Пример через структуру тут https://owen.ru/forum/showthread.php?t=10555&page=987

1exan
17.03.2026, 08:18
Коллеги представляю решение, как обойти ограничение в 1000 сетевых переменных..
Насколько правильно время покажет, а пока сетевые переменные доступны в программе и управляются с панели.
Для доступа через панель создаем два устройства Modbus TCP для первого указываем порт 502, а для второго порт 510 (как для ПЛК)

Не могу найти описание настроек в меню смена целевой платформы (5 вложение),
03E8h есть 1000 и по идеи должен отвечать за количество сетевых переменных, но этот параметр ни на что не влияет...

Спасибо большое.

Попробуйте внутрь первого слейва с 998 элементами добавить ВЛОЖЕННЫЙ слейв со следующими далее переменными. Для вложенного слейва в MODBUS(Fix) можете ничего не указывать

Cs-Cs
17.03.2026, 11:15
возможно и это решение...
тогда как в программе обращаться к переменным? как получить доступ через панель?У меня ж прям статья есть. Через структуру удобно всё делать.
В конце статьи пример есть: https://cs-cs.net/codesys-modbus-karta-registrov-struktury

Васильев
17.03.2026, 11:45
У меня ж прям статья есть. Через структуру удобно всё делать.
В конце статьи пример есть: https://cs-cs.net/codesys-modbus-karta-registrov-struktury

у меня почти все переменные (нет все) однорегистровые и для меня структура в этом случае не удобно

Cs-Cs
17.03.2026, 12:03
у меня почти все переменные (нет все) однорегистровые и для меня структура в этом случае не удобноНе понял. Так это ж ещё лучше: в ней все поля будут как WORD или INT. Прям лучшая удача из возможных.
Зато не надо будет в конфигурацию ПЛК вписывать имена или адреса их. Всё в структуре создашь красиво.
...а потом, если захочешь - с ней легко на ОВЕНскую библиотеку Modbus перейдёшь, где памяти для Slave точно больше.

kondor3000
17.03.2026, 14:35
у меня почти все переменные (нет все) однорегистровые и для меня структура в этом случае не удобно

Как не удобно?
В структуре вы можете сделать массив регистров WORD, и работать с ними. А положить его можно в выделенное место в конфигурации хоть DWORD-ов.

Васильев
17.03.2026, 15:58
Как не удобно?
В структуре вы можете сделать массив регистров WORD, и работать с ними. А положить его можно в выделенное место в конфигурации хоть DWORD-ов.

а как положить (отобразить) структуру к примеру с адреса AT%QW6.800.0 ???

kondor3000
17.03.2026, 16:12
а как положить (отобразить) структуру к примеру с адреса AT%QW6.800.0 ???

compressors AT%QW6.800.0 : COMPRESSOR; -объявление

Структура COMPRESSOR, в ней массив w: ARRAY[0..1999] OF WORD;, положена по адресу AT%QW6.800.0,
обращаться к ней как compressors.w[0] - ваш массив

Только места должно хватать на всю структуру, поэтому адрес скорее должен быть AT%QW6.0.0

Васильев
17.03.2026, 16:20
compressors AT%QW6.800.0 : COMPRESSOR;

Структура COMPRESSOR, в ней массив w: ARRAY[0..1999] OF WORD;, положена по адресу AT%QW6.800.0,
обращаться к ней как compressors.w[0] - ваш массив

в этом случае элементы структуры располагаются в памяти в порядке их объявления в структуре (с учетом смещений)?
А это в codesys 2.3 возможно?

Васильев
17.03.2026, 16:57
А что в вашем понимании структура?

TYPE vfdCMD :
STRUCT


setCMD:WORD; (* последняя успешная команда*)
setFreq:WORD; (* установленная частота*)
setFreqMax:WORD; (* установленная максимальная частота*)
setFreqMin:WORD; (* установленная максимальная чатота*)

newCMD:WORD; (* произвольная команда*)
newWrAddr: WORD; (* адрес для записи*)
newWrData:WORD; (* данные для записи*)
newFirstAddr:WORD; (* первый для чтения*)
newQuantity:WORD; (* количество для чтения*)
newFreq:WORD; (*частота*)
newRegAddr:WORD; (* адрес записываемого регистра*)
newRegValue:WORD; (* сам регистр для записи*)


...

kondor3000
17.03.2026, 17:20
в этом случае элементы структуры располагаются в памяти в порядке их объявления в структуре (с учетом смещений)?
А это в codesys 2.3 возможно?

По порядку, а смещений у вас нет, так как все регистры WORD.

Васильев
17.03.2026, 17:31
По порядку, а смещений у вас нет, так как все регистры WORD.

я не всю структуру привёл, у меня там есть и byte и bool - занимают по одному байту в структуре, а в памяти будут адресоваться по четным адресам - так?

Васильев
17.03.2026, 17:35
vop01_addr AT%QW6.800.0: WORD;
vop01_power AT%QW6.800.0: WORD;
vop01_00000 AT%QW6.801.0: WORD;
vop01_mode1_T1 AT%QW6.802.0: INT;
vop01_mode1_T1_hist AT%QW6.803.0: INT;
vop01_mode1_T2 AT%QW6.804.0: INT;
vop01_room_state AT%QW6.805.0: INT;
vop01_mode2_T1 AT%QW6.806.0: INT;
vop01_11111 AT%QW6.807.0: INT;
vop01_mode1_minColdvalue AT%QW6.808.0: WORD;
vop01_mode2_minColdvalue AT%QW6.809.0: WORD;
vop01_Tinput AT%QW6.810.0: INT;
vop01_Toutput AT%QW6.811.0: INT;
vop01_t1 AT%QW6.812.0: INT;
vop01_t2 AT%QW6.813.0: INT;
vop01_t3 AT%QW6.814.0: INT;
vop01_temperatura AT%QW6.815.0: INT;
vop01_tenable AT%QW6.816.0: WORD;
vop01_klapan_value AT%QW6.817.0: WORD;
vop01_leds AT%QW6.818.0: WORD;
vop01_Talarm AT%QW6.819.0: WORD;


если объявить структуру, можно разместить её в памяти по адресу, для codesys2.3 ?

kondor3000
17.03.2026, 17:42
я не всю структуру привёл, у меня там есть и byte и bool - занимают по одному байту в структуре, а в памяти будут адресоваться по четным адресам - так?

Лучший вариант это проверить x:=SIZEOF(vfdCMD_set);
где x: DWORD; - размер структуры в байтах.

Зачем вы напихали адресов в самой структуре?
Написал же нужен только начальный адрес структуры при объявлении. Даже ссылку с примером вам давал.
https://owen.ru/forum/showthread.php?t=10555&page=987

Васильев
17.03.2026, 17:52
Лучший вариант это проверить x:=SIZEOF(vfdCMD_set);
где x: DWORD; - размер структуры в байтах.

Зачем вы напихали адресов в самой структуре?
Написал же нужен только начальный адрес структуры при объявлении. Даже ссылку с примером вам давал.
https://owen.ru/forum/showthread.php?t=10555&page=987

у меня сейчас так реализовано.
Возможно перейду на структуру.

kondor3000
17.03.2026, 17:54
у меня сейчас так реализовано.
Возможно перейду на структуру.
Откройте пример по ссылке и разберитесь один раз, как надо делать. Как читать 8 модулей и сложить всё в слейв.
Можно в эмуляции запустить и ещё пример на следующей странице, специально для эмуляции с начальными данными.

Васильев
17.03.2026, 17:56
Может это так и задумано,

но в общем случае именно 1 (один) раз где-то объявить структуру по AT% и такой случайной фигни не пролетит.


давайте всю


две переменные обращаются к одному и тому же адресу - сделано для совместимости с предыдущим проектом.

Cs-Cs
17.03.2026, 18:50
а как положить (отобразить) структуру к примеру с адреса AT%QW6.800.0 ???Ты можешь прочитать мою статью?!
И взять оттуда пример?!
Я же там специально сделал так, чтобы не использовать прямые адреса!!!
Ну НЕ реклама это - а нормальная статья.

Васильев
21.03.2026, 10:25
коллеги подскажите пожалуйста...

1. создал структуру vops 20 полей word

2. в программе определяю переменные
vop01 AT%QW6.700.0: vops;
vop02 AT%QW6.720.0: vops;
для контроллера ПЛК-110-30М-v2 конструкция работает,
а вот для ПЛК-110-60М-v2 выдает
ошибка 3729 неверный тип vops по адресу AT%QW6.700.0

3. но если указать адрес переменной нечетный
vop01 AT%QW6.701.0: vops;
vop02 AT%QW6.721.0: vops;

компиляция проходит,
для ПЛК110-30 без разницы какой адрес

что это может быть?

Васильев
21.03.2026, 10:27
TYPE vops :
STRUCT

power: WORD; (* 1bit0=1 включение*)
free: WORD; (* 2режим работы bit0 - 0 режим1, 1 режим2*)
mode1_T1: INT; (* 3уставка температуры для режима 1*)
mode1_T1_hist: INT; (* 4гистерезис темп уставки*)
mode1_T2: INT; (* 5уставка температуры для подачи охладителя *)
mode1_T2_delta_stab: INT; (* 6погрешность стабилизации*)
mode2_T1: INT; (* 7уставка температуры для режима 2*)
mode2_T1_delta_stab: INT; (* 8погрешность стабилизации*)
mode1_minColdvalue: WORD; (* 9минимальное значение клапаан в режиме 1*)
mode2_minColdvalue: WORD; (* 10минимальное значение клапана в режиме 2*)
Tinput: INT; (* 11темп подачи*)
Toutput: INT; (* 12темп обратки*)
t1: INT; (* 13темп 1*)
t2: INT; (* 14темп 2*)
t3: INT; (* 15темп 3*)
Troom: INT; (* 16средняя температура*)
tenable: WORD; (* 17разрешение работы датчиков температуры bits0..2, авария датчиков bit8..10*)
klapan_value: WORD; (* 18текущее значение клапаан*)
leds: WORD; (* 19информационные светодиоды камеры ..*)
Talarm: WORD; (* 20температура аварийная*)



END_STRUCT
END_TYPE

kondor3000
21.03.2026, 11:05
коллеги подскажите пожалуйста...
1. создал структуру vops 20 полей word
для контроллера ПЛК-110-30М-v2 конструкция работает,
а вот для ПЛК-110-60М-v2 выдает
ошибка 3729 неверный тип vops по адресу AT%QW6.700.0
компиляция проходит,
для ПЛК110-30 без разницы какой адрес
что это может быть?

Вы ошиблись, в обоих ПЛК не хочет начинать с 700, 720, а хочет с 701, 721. Скрин ПЛК110-30M_V2 88546Ошибка 3729 та же
Скорее всего потому, что адреса слейва начинаются с 1, а не с 0 и адреса должны быть кратны структуре из 20 переменных.

И можно создать массив структур и указать только начальный адрес, уже писал,
vop_w AT%QW6.701.0 : ARRAY[1..3] OF vops ;
Тогда все 3 структуры лягут подряд одна за другой.

Васильев
21.03.2026, 11:21
не понимаю..почему у меня так

Адресация начинается с 1.
Если предположить, что не попадает в границы
тогда почему при объявлении переменной

var1 AT%QW6.1.0: word;

не возникает ошибки?

Васильев
21.03.2026, 11:32
Вы ошиблись, в обоих ПЛК не хочет начинать с 700, 720, а хочет с 701, 721. Скрин ПЛК110-30M_V2 88546
Скорее всего потому, что адреса слейва начинаются с 1, а не с 0 и адреса должны быть кратны структуре из 20 переменных.

И можно создать массив структур и указать только начальный адрес, уже писал,
vop_w AT%QW6.701.0 : ARRAY[1..3] OF vops ;
Тогда все 3 структуры лягут подряд одна за другой.


вот это мне нравится!
значит смогу обрабатывать события по vop в цикле.

в принципе я так и делал (когда не было структуры), только в функцию каждый раз передавал адрес начала памяти для vops.
И сейчас уже хотел переделывать программу..

kondor3000
21.03.2026, 11:32
не понимаю..почему у меня так

Адресация начинается с 1.
Если предположить, что не попадает в границы
тогда почему при объявлении переменной

var1 AT%QW6.1.0: word;

не возникает ошибки?

адреса должны быть кратны структуре

И можно создать массив структур и указать только начальный адрес, уже писал,
vop_w AT%QW6.701.0 : ARRAY[1..3] OF vops ;
Тогда все 3 структуры лягут подряд одна за другой.

Васильев
21.03.2026, 11:37
спасибо, я это понял

вот сейчас сделал структуру из 19 переменных,
и все равно не ложится с четного адреса...

даже структура из одной переменной не хочет ложится с четного адреса

kondor3000
21.03.2026, 11:45
спасибо, я это понял

вот сейчас сделал структуру из 19 переменных,
и все равно не ложится с четного адреса...

даже структура из одной переменной не хочет ложится с четного адреса

Ещё раз сначала, адреса слейва считаются с 0, значит чётное, а прямая адресация с 1 (и это тоже чётное).
AT%QW6.701 это чётный адрес слейва 700.

Васильев
21.03.2026, 11:50
тогда не понимаю, почему на плк110-30М-v2 без разницы четная или не четная...
Может дело в конфигурации ПЛК

kondor3000
21.03.2026, 11:52
тогда не понимаю, почему на плк110-30М-v2 без разницы четная или не четная...
Может дело в конфигурации ПЛК
Я вам скрин выложил, с ПЛК110-30М-v2, там таже ошибка 3729

А вот в эмуляции ошибок нет

Валенок
21.03.2026, 12:43
тогда не понимаю, почему на плк110-30М-v2 без разницы четная или не четная...
На любом ПЛК от Овена есть разница. И это связано не с Овеном а с процем.

Вы проект выложите? Если нет (он секретно/гениальный за которым охотятся все агенты Моссада и т.п.) - так и скажите, чтоб время не тратить.

Васильев
21.03.2026, 12:59
я сам не могу в нем разобраться..

Cs-Cs
21.03.2026, 13:01
Васильев Снова за долгое время мне хочется НАОРАТЬ! И я это СДЕЛАЮ!
Вот я тебе ТРИ РАЗА кидал свой пост (одобренный и проверенный Евгением Кисловым, между прочим) про этот приём!
Но нет же ты страдаешь ХРЕНЬЮ и УПЁРСЯ В ТУПОЙ ПУТЬ!

НЕ НАДО! НЕ НАДО! НЕ НАДО ТЕБЕ ИСПОЛЬЗОВАТЬ ЭТИ ДУРАЦКИЕ ПРЯМЫЕ АДРЕСА!
Это пусть к ошибкам и вникуда!!

Даю тебе СКРИНШОТЫ из того поста и ещё раз на него ссылку: https://cs-cs.net/codesys-modbus-karta-registrov-struktury

1. С того места, откуда у тебя в конфигурации ПЛК будет привязана эта структура, прям в конфигурации ПЛК объявляешь переменную.
Это будет адресом начала твоей структуры.
В моём случае это MBSlaveData:
88553

У тебя это может быть типа
vop01_Start
vop02_Start

2. В глобальных переменных объявляешь указатели на свои структуры.
У меня это так:
SysSlave : POINTER TO MBSlaveStruct;

У тебя будет так:
vop01 : POINTER TO vops;
vop02 : POINTER TO vops;

3. Потом в самой главной программе в самом начале пишешь код, который САМ вычислит адреса и привяжет указатели:
88554

У тебя это будет так:
vop01 := ADR(vop01_Start);
vop02 := ADR(vop02_Start);
Адреса вычислятся САМИ по положению тех переменных, которые мы в кофигурации ПЛК указали.

4. Обращаешься чуть сложнее. Через символ крышечки так:

vop01^.power;
vop02^.klapan_value;

Всё. При этом после точки CodeSys так же будет давать тебе список полей, как и с обычной структурой.

PS. У меня [M02] - и на нём всё работает.
Сейчас, например, одна из структур занимает 264 байта аж (132 регистра).

Cs-Cs
21.03.2026, 13:03
адреса должны быть кратны структуре

И можно создать массив структур и указать только начальный адрес, уже писал,
vop_w AT%QW6.701.0 : ARRAY[1..3] OF vops ;
Тогда все 3 структуры лягут подряд одна за другой.
Да да да да да!! :)

Я знаю по себе - у Васильев сейчас ступор.
Такое бывает. Когда вот упёрся и ДИКО тупишь.
Тогда надо сделать передышку и потом ещё раз всё попробовать.

Васильев
21.03.2026, 13:40
согласен..балбес
Читал вашу статью 3раза (с пивом тоже).
Для чего я делаю сетевые переменные привязанные к адресам? - чтобы точно знать адрес по которому панель может прочитать данные.
Для чего разбиваю область переменных ВОП? - чтобы в панели заводить в график только нужные параметры
(к примеру в графике не нужно параметры ПИД)

Cs-Cs
21.03.2026, 13:50
Васильев Оо! Спасибо за то, что ты расписал "ЗАЧЕМ" и "ПОЧЕМУ". Это очень важно и нужно!

Вот я тоже туплю тогда :)
Почему ты НЕ можешь просто ВСЮ панель засунуть в структуру?
Прям начиная с адреса 0 - и далее?
Тогда ты и адреса вычислишь все (и прям в проекте напишешь, к примеру), и можешь вложенные структуры вставлять друг в друга.
Я ща покажу, как у меня это расписано для одного из проектов.
Там я прям расписал ВСЕ адреса и номера битов.


(* Структура данных для связи с панелью оператора по Modbus Slave
!!!ПОСЛЕДОВАТЕЛЬНОСТЬ ЭЛЕМЕНТОВ КРАЙНЕ ВАЖНА (она описана в XLS-файле IO)!!! *)
TYPE SysOPData :
STRUCT
BitsAlarms1 : DWORD; (* Регистры 0, 1 = Биты тревог 0-32 *)
BitsAlarms2 : DWORD; (* Регистры 2, 3 = Биты тревог 33-63 *)

BitsStatus1 : DWORD; (* Регистры 4, 5 = Биты статуса 64-95 *)
BitsStatus2 : DWORD; (* Регистры 6, 7 = Биты статуса 96-127 *)

BitsButtons1 : DWORD; (* Регистры 8, 9 = Биты кнопок 128-159 *)
BitsButtons2 : DWORD; (* Регистры 10, 11 = Биты кнопок 160-191 *)

(* СИСТЕМНЫЕ ДАТА И ВРЕМЯ - Чтение (из ПЛК в панель) *)
TimeCurrYear : WORD; (* Регистр 12, Текущий Год *)
TimeCurrMonth : WORD; (* Регистр 13, Текущий Месяц *)
TimeCurrDay : WORD; (* Регистр 14, Текущий День *)
TimeCurrHour : WORD; (* Регистр 15, Текущие Часы *)
TimeCurrMin : WORD; (* Регистр 16, Текущие Минуты *)
TimeCurrSec : WORD; (* Регистр 17, Текущие Секунды *)

(* СИСТЕМНЫЕ СОСТОЯНИЯ - Работа подсистем *)
SysStateDay : WORD; (* Регистр 18, Режим времени: 0 = ?, 1 = Ночь, 2 = День *)
SysStatePLC : WORD; (* Регистр 19, Статус ПЛК на главном экране: 0 = ?, 1 = Work, 2 = Debug, 3 = Alarms, 4 = Пробел *)
SysStatePwMains : WORD; (* Регистр 20, Статус Ввода Сети (0 = Откл, 1 = Нет Фазы, 2 = Вкл) *)
SysStatePwGener : WORD; (* Регистр 21, Статус Ввода Генератора (0 = Откл, 1 = Вкл, 2 = в АВР) *)
SysStatePwUPS : WORD; (* Регистр 22, Статус Инвертора (0 = Откл, 1 = Вкл, 2 = Разряд АКБ) *)
SysStatePwFull : WORD; (* Регистр 23, Статус Питания Отпуск (0 = Откл, 1 = Вкл) *)
SysStateWater : WORD; (* Регистр 24, Статус Воды (0 = Закрыта, 1 = Открыта, 2 = Протечка, 3 = Ожидание выдержки) *)

(* СИСТЕМНЫЕ ДАТА И ВРЕМЯ - Настройка (из панели в ПЛК) *)
TimeSetYear : WORD; (* Регистр 25, Установить Год *)
TimeSetMonth : WORD; (* Регистр 26, Установить Месяц *)
TimeSetDay : WORD; (* Регистр 27, Установить День *)
TimeSetHour : WORD; (* Регистр 28, Установить Часы *)
TimeSetMin : WORD; (* Регистр 29, Установить Минуты *)

(* ИНТЕРВАЛЫ ДЛЯ НОЧНОГО РЕЖИМА по Кварталам - Зима, Весна, Лето, Осень *)
NightModeTimeKv1 : CSSetTimes; (* Регистры 30, 31, Время ЧЧ:ММ Начала Ночного режима, Зима *)
NightModeTimeKv2 : CSSetTimes; (* Регистры 32, 33, Время ЧЧ:ММ Начала Ночного режима, Весна *)
NightModeTimeKv3 : CSSetTimes; (* Регистры 34, 35, Время ЧЧ:ММ Начала Ночного режима, Лето *)
NightModeTimeKv4 : CSSetTimes; (* Регистры 36, 37, Время ЧЧ:ММ Начала Ночного режима, Осень *)
NightModeTimeEnd : CSSetTimes; (* Регистры 38, 39, Время ЧЧ:ММ КОНЦА Ночного режима (Утро) *)

(* Регистры для групп света в сценарии "КИНО" (6 штук): 0 = Не участвует, 1 = Участвует *)
ScenKinoLGroups : ARRAY [1..6] OF WORD; (* Регистры 40, 41, 42, 43, 44, 45 *)

(* НАСТРОЙКИ ПРИВОДОВ ШТОР *)
ShtorGostKuh : SysOPSetShtors; (* Регистры 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, Шторы Гостиная-Кухня *)
ShtorSpaln : SysOPSetShtors; (* Регистры 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, Шторы Спальня *)
ShtorStSyn : SysOPSetShtors; (* Регистры 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, Шторы Комната Старшего Сына *)
ShtorMlSyn : SysOPSetShtors; (* Регистры 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, Шторы Комната Младшего Сына *)

(* НАСТРОЙКИ ВЕНТИЛЯТОРОВ *)
VentV1 : SysOPSetVent; (* Регистры 86, 87, 88, 89, 90, 91, 92, 93, Настройки вентилятора В1 *)
VentV2 : SysOPSetVent; (* Регистры 94, 95, 96, 97, 98, 99, 100, 101, Настройки вентилятора В2 *)

(* НАСТРОЙКИ ТРЕВОГ ПО ВОДЕ *)
WaterDrainDelay : WORD; (* Регистр 102, Выдержка перед сигналом аварии, секунд *)
WaterDrainLock : WORD; (* Регистр 103, Удерживать режим аварии до сброса (Нет/Да) *)

WaterNasosOffByDrain : WORD; (* Регистр 104, Выключать насос скважины при авариях (Нет/Да) *)
WaterNasosOffDKoteln : WORD; (* Регистр 105, Выключать насос скважины при авариях Котельной (Нет/Да) *)
WaterNasosOffD1Etaj : WORD; (* Регистр 106, Разрешить работу датчиков 1 Этажа (Нет/Да) *)
WaterNasosOffD2Etaj : WORD; (* Регистр 107, Разрешить работу датчиков 2 Этажа (Нет/Да) *)

WaterNasosOffByTime : WORD; (* Регистр 108, Разрешить тревоги по времени работы насоса скважины (Нет/Да) *)
WaterNasosOffAmps : WORD; (* Регистр 109, Пороговый ток для работы насоса, Ампер x 100 *)
WaterNasosOffTimeOtp : WORD; (* Регистр 110, Пороговое время работы насоса, минут (когда не живут) *)

WaterSensorOnKoteln : WORD; (* Регистр 111, Разрешить работу датчиков Котельной (Нет/Да) *)
WaterSensorOn1Etaj : WORD; (* Регистр 112, Разрешить работу датчиков 1 Этажа (Нет/Да) *)
WaterSensorOn2Etaj : WORD; (* Регистр 113, Разрешить работу датчиков 2 Этажа (Нет/Да) *)

(* ДАННЫЕ ДЛЯ ЭКРАНОВ СТАТУСА СИСТЕМЫ *)
SysStatePLCTemper : REAL; (* Регистры 114, 115, Статус системы: Температура ПЛК (FLOAT) *)
SysStateNasosAmps : REAL; (* Регистры 116, 117, Статус системы: Ток насоса скважины (FLOAT) *)
SysStateNasosWTime : DWORD; (* Регистры 118, 119, Статус системы: Время непрервыного работы насоса скважины, секунды *)

(* НАСТРОЙКИ РЕЖИМА ОТПУСК (FullPower) *)
OtpuskCtlWater : WORD; (* Регистр 120, Режим Отпуск: Управлять Водой (Нет/Да) *)
OtpuskCtlLight : WORD; (* Регистр 121, Режим Отпуск: Гасить освещение с сохранением (Нет/Да) *)
OtpuskCtlOPS : WORD; (* Регистр 122, Режим Отпуск: Ставить на охрану (Нет/Да) *)

(* НАСТРОЙКИ СВЕТА *)
LtFasadAutoOff : WORD; (* Регистр 123, Свет Фасада: Гасить автоматически по времени (Нет/Да), иначе - утром *)
LtFasadAutoOffTime : CSSetTimes; (* Регистры 124, 125, Свет Фасада: Время Вечернего гашения, Часы/Минуты *)
LtFasadAutoOn : WORD; (* Регистр 126, Свет Фасада: Свет Фасада: Включать автоматически в ночное время (Нет/Да) *)

LtStPandusWorkTime : WORD; (* Регистр 127, Свет Стоянки, Пандуса: Время работы после конца движения ворот, минут *)
LtStPandusWorkNight : WORD; (* Регистр 128, Свет Стоянки, Пандуса: Включать от Ворот только в ночное время (Нет/Да) *)

LtVhGrpOnByMove : WORD; (* Регистр 129, Свет Входной Группы: Управлять по Датчику Движения (Нет/Да) *)
LtVhGrpOnByMoveAtNight : WORD; (* Регистр 130, Свет Входной Группы: Управлять по Датчику Движения только Ночью (Нет/Да) *)
LtVhGrpOnByMovePriority : WORD; (* Регистр 131, Свет Входной Группы: Включать ДДвижения параллельно (приоритет) (Нет/Да) *)

ScenNightOffDelay : WORD; (* Регистр 132, Сценарий "Ночь": Выдержка до отключения света, секунд *)
ScenNightDejDelay : WORD; (* Регистр 133, Сценарий "Ночь": Выдержка работы дежурного света, минут *)

(* НАСТРОЙКИ ПРОВОРОТА КРАНОВ (дополнение) *)
WaterAutoWashOn : WORD; (* Регистр 134, Водоснабжение: Включить автопрокрутку кранов воды (Нет/Да) *)
WaterAutoWashDay : WORD; (* Регистр 135, Водоснабжение: День месяца для запуска прокрутки кранов *)
WaterAutoWashHour : WORD; (* Регистр 136, Водоснабжение: Час для запуска прокрутки кранов *)

(* НАСТРОЙКИ ОБНОВЛЕНИЯ ВРЕМЕНИ ПО NTP (дополнение) *)
TimeGetNTPOn : WORD; (* Регистр 137, Время по NTP: Включен режим обновления (Нет/Да) *)
TimeGetNTPDelay : WORD; (* Регистр 138, Время по NTP: Период обновления, минут *)
TimeGetNTPState : WORD; (* Регистр 139, Время по NTP: Статус обновления (0 = Выкл, 1 = Ждёт, 2 = Обновлено, 3 = Ошибка) *)

(* ДОПОЛНЕНИЯ КАРТЫ РЕГИСТРОВ БЕЗ ГРУПП *)
WaterNasosOffTimeNorm : WORD; (* Регистр 140, Пороговое время работы насоса, минут (когда живут) *)

END_STRUCT
END_TYPE


(************************************************* *************************************************)
(* Номера битов для панели оператора - ТРЕВОГИ *)
VAR_GLOBAL CONSTANT
(* BitsAlarms1 = Регистры 0, 1 = Биты тревог 0-32 *)
SysOPAlmPLCTemperMid : BYTE := 0; (* Авария: Перегрев ПЛК (средний) *)
SysOPAlmPLCTemperHigh : BYTE := 1; (* Авария: Перегрев ПЛК (критичный) *)
SysOPAlmPLCBatteryLow : BYTE := 2; (* Авария: Разряд батареи часов ПЛК *)
SysOPAlmPLCDebug : BYTE := 3; (* Авария: Режим отладки ПЛК (IO) *)
SysOPAlmDevIntW2Err : BYTE := 4; (* Авария: Сбой связи с модулем W2 *)
SysOPAlmDevIntW3Err : BYTE := 5; (* Авария: Сбой связи с модулем W3 *)
SysOPAlmDevIntW4Err : BYTE := 6; (* Авария: Сбой связи с модулем W4 *)
SysOPAlmDevIntW5Err : BYTE := 7; (* Авария: Сбой связи с модулем W5 *)
SysOPAlmDevIntW6Err : BYTE := 8; (* Авария: Сбой связи с модулем W6 *)
SysOPAlmDevExtD1Err : BYTE := 9; (* Авария: Сбой связи Modbus Ext. 1 *)
SysOPAlmDevExtD2Err : BYTE := 10; (* Авария: Сбой связи Modbus Ext. 2 *)
SysOPAlmDevExtD3Err : BYTE := 11; (* Авария: Сбой связи Modbus Ext. 3 *)
SysOPAlmDevExtD4Err : BYTE := 12; (* Авария: Сбой связи Modbus Ext. 4 *)
SysOPAlmDevExtD5Err : BYTE := 13; (* Авария: Сбой связи Modbus Ext. 5 *)
SysOPAlmDevExtD6Err : BYTE := 14; (* Авария: Сбой связи Modbus Ext. 6 *)
SysOPAlmDevExtD7Err : BYTE := 15; (* Авария: Сбой связи Modbus Ext. 7 *)
SysOPAlmDevExtD8Err : BYTE := 16; (* Авария: Сбой связи Modbus Ext. 8 *)
SysOPAlmDevExtD9Err : BYTE := 17; (* Авария: Сбой связи Modbus Ext. 9 *)
SysOPAlmDevExtD10Err : BYTE := 18; (* Авария: Сбой связи Modbus Ext.10 *)
SysOPAlmOVRProtect : BYTE := 19; (* Авария: Сбой УЗИП (Автомат) *)
SysOPAlmOVRCartridge : BYTE := 20; (* Авария: Сбой УЗИП (Картриджи) *)
SysOPAlmPwrMainsL1 : BYTE := 21; (* Авария: Сбой ввод Сети (фаза L1) *)
SysOPAlmPwrMainsL2 : BYTE := 22; (* Авария: Сбой ввод Сети (фаза L2) *)
SysOPAlmPwrMainsL3 : BYTE := 23; (* Авария: Сбой ввод Сети (фаза L3) *)
SysOPAlmPwrGeneratorOn : BYTE := 24; (* Авария: Работа от Генератора *)
SysOPAlmPwrUPSFail : BYTE := 25; (* Авария: Сбой ввода Инвертора *)
SysOPAlmPwrUPSLow : BYTE := 26; (* Авария: Разряд АКБ Инвертора *)
SysOPAlmILCCommon : BYTE := 27; (* Авария: Авария важных нагрузок! - Общий синал аварии *)
SysOPAlmILCShKotelnL1 : BYTE := 28; (* Авария: Сбой ILC Котельная (L1) *)
SysOPAlmILCShKotelnL2 : BYTE := 29; (* Авария: Сбой ILC Котельная (L2) *)
SysOPAlmILCShKotelnL3 : BYTE := 30; (* Авария: Сбой ILC Котельная (L3) *)
SysOPAlmILCShSKS : BYTE := 31; (* Авария: Сбой ILC Щит СКС *)

(* BitsAlarms2 = Регистры 2, 3 = Биты тревог 33-63 *)
SysOPAlmILCWaterValves : BYTE := 0; (* Сбой ILC Краны Воды *)
SysOPAlmILCNasosSkvaj : BYTE := 1; (* Сбой ILC Насос Скважины *)
SysOPAlmILCNasosDrenaj : BYTE := 2; (* Сбой ILC Насос Дренажа *)
SysOPAlmILCHolodilnik : BYTE := 3; (* Сбой ILC Холодильник *)
SysOPAlmILCVorotaGaraj : BYTE := 4; (* Сбой ILC Ворота Гараж *)
SysOPAlmILCVorotaMain : BYTE := 5; (* Сбой ILC Ворота Въездные *)
SysOPAlmILCRegDEVI : BYTE := 6; (* Сбой ILC Авария DEVIreg *)
SysOPAlmDrainKoteln : BYTE := 7; (* Протечка Котельная! *)
SysOPAlmDrain1Etaj : BYTE := 8; (* Протечка 1 Этаж! *)
SysOPAlmDrain2Etaj : BYTE := 9; (* Протечка 2 Этаж! *)
SysOPAlmWaterWash : BYTE := 10; (* Прокрутка кранов воды *)
SysOPAlmOPSSetArm : BYTE := 11; (* ОПС: Постановка на охр. *)
SysOPAlmOPSAlarm : BYTE := 12; (* ОПС: Сработка (Тревога)! *)
SysOPAlmRolletsPort : BYTE := 13; (* Шторы: Сбой открытия порта *)

(* SysOPAlmXXX : BYTE := 1; (* Авария: XXX *) *)
END_VAR

(************************************************* *************************************************)
(* Номера битов для панели оператора - ФЛАГИ СТАТУСОВ *)
VAR_GLOBAL CONSTANT
(* BitsStatus1 = Регистры 4, 5 = Биты статуса 64-95 *)
SysOPStateUZIPAutomat : BYTE := 0; (* Статус работы: УЗИП, Автомат защиты *)
SysOPStateUZIPCatridge : BYTE := 1; (* Статус работы: УЗИП, Картриджи *)
SysOPStateWaterPower : BYTE := 2; (* Статус работы: Краны Воды (Питание) *)
SysOPStateWaterOpen : BYTE := 3; (* Статус работы: Краны Воды (Вода открыта) *)
SysOPStateNasosPower : BYTE := 4; (* Статус работы: Насос Скважины (Питание) *)
SysOPStateNasosWork : BYTE := 5; (* Статус работы: Насос Скважины (Порог тока работы включен) *)
SysOPStateVorotaMain : BYTE := 6; (* Статус работы: Движение Ворот, Основные *)
SysOPStateVorotaGaraj : BYTE := 7; (* Статус работы: Движение Ворот, Гаража *)
SysOPStateStreetDark : BYTE := 8; (* Статус работы: Фотореле (Темно) *)
SysOPStateMoveVhodG : BYTE := 9; (* Статус работы: Датчик Движения Входная Группа *)
SysOPStateMoveHall : BYTE := 10; (* Статус работы: Датчик Движения Холлы *)
SysOPStateDrainKoteln : BYTE := 11; (* Статус работы: Датчики Протечки Котельная *)
SysOPStateDrain1Etaj : BYTE := 12; (* Статус работы: Датчики Протечки 1 Этаж *)
SysOPStateDrain2Etaj : BYTE := 13; (* Статус работы: Датчики Протечки 2 Этаж *)

SysOPStatexxx : BYTE := 0; (* *** *)

(* BitsStatus2 = Регистры 6, 7 = Биты статуса 96-127 *)
SysOPStateDefaultsLoad : BYTE := 31; (* Настройки из DEFAULT загружены успешно = TRUE *)




END_VAR


(************************************************* *************************************************)
(* Номера битов для панели оператора - ФЛАГИ КНОПОК НА ПАНЕЛИ *)
VAR_GLOBAL CONSTANT
(* BitsButtons1 = Регистры 8, 9 = Биты кнопок 128-159 *)
SysOPBtnDimGostTrackPreset1OFF : BYTE := 0; (* Диммер LT-19 Гостиная Трек, Preset 1 (OFF) *)
SysOPBtnDimGostTrackPreset2 : BYTE := 1; (* Диммер LT-19 Гостиная Трек, Preset 2 *)
SysOPBtnDimGostTrackPreset3 : BYTE := 2; (* Диммер LT-19 Гостиная Трек, Preset 3 *)
SysOPBtnDimGostBraPreset1OFF : BYTE := 3; (* Диммер LT-20 Гостиная Бра, Preset 1 (OFF) *)
SysOPBtnDimGostBraPreset2 : BYTE := 4; (* Диммер LT-20 Гостиная Бра, Preset 2 *)
SysOPBtnDimGostBraPreset3 : BYTE := 5; (* Диммер LT-20 Гостиная Бра, Preset 3 *)
SysOPBtnDimKuhnaTrackPreset1OFF : BYTE := 6; (* Диммер LT-22 Кухня Трек, Preset 1 (OFF) *)
SysOPBtnDimKuhnaTrackPreset2 : BYTE := 7; (* Диммер LT-22 Кухня Трек, Preset 2 *)
SysOPBtnDimKuhnaTrackPreset3 : BYTE := 8; (* Диммер LT-22 Кухня Трек, Preset 3 *)
SysOPBtnDimSpalnaVerhPreset1OFF : BYTE := 9; (* Диммер LT-25 Спальня Верх, Preset 1 (OFF) *)
SysOPBtnDimSpalnaVerhPreset2 : BYTE := 10; (* Диммер LT-25 Спальня Верх, Preset 2 *)
SysOPBtnDimSpalnaVerhPreset3 : BYTE := 11; (* Диммер LT-25 Спальня Верх, Preset 3 *)
SysOPBtnDimKabinetPreset1OFF : BYTE := 12; (* Диммер LT-33 Кабинет Верх, Preset 1 (OFF) *)
SysOPBtnDimKabinetPreset2 : BYTE := 13; (* Диммер LT-33 Кабинет Верх, Preset 2 *)
SysOPBtnDimKabinetPreset3 : BYTE := 14; (* Диммер LT-33 Кабинет Верх, Preset 3 *)

SysOPBtnShtorGostKuhOpen : BYTE := 15; (* Шторы Гостиная-Кухня: Команда "Открыть" *)
SysOPBtnShtorGostKuhClose : BYTE := 16; (* Шторы Гостиная-Кухня: Команда "Закрыть" *)
SysOPBtnShtorGostKuhStop : BYTE := 17; (* Шторы Гостиная-Кухня: Команда "Стоп" *)
SysOPBtnSpalnOpen : BYTE := 18; (* Шторы Спальня: Команда "Открыть" *)
SysOPBtnSpalnClose : BYTE := 19; (* Шторы Спальня: Команда "Закрыть" *)
SysOPBtnSpalnStop : BYTE := 20; (* Шторы Спальня: Команда "Стоп" *)
SysOPBtnStSynOpen : BYTE := 21; (* Шторы Комната Старшего Сына: Команда "Открыть" *)
SysOPBtnStSynClose : BYTE := 22; (* Шторы Комната Старшего Сына: Команда "Закрыть" *)
SysOPBtnStSynStop : BYTE := 23; (* Шторы Комната Старшего Сына: Команда "Стоп" *)
SysOPBtnMlSynOpen : BYTE := 24; (* Шторы Комната Младшего Сына: Команда "Открыть" *)
SysOPBtnMlSynClose : BYTE := 25; (* Шторы Комната Младшего Сына: Команда "Закрыть" *)
SysOPBtnMlSynStop : BYTE := 26; (* Шторы Комната Младшего Сына: Команда "Стоп" *)

(* BitsButtons2 = Регистры 10, 11 = Биты кнопок 160-191 *)
SysOPBtnxxx : BYTE := 0; (* *** *)

END_VAR

(************************************************* *************************************************)
(* Номера индексов массива - ГРУППЫ СВЕТА В СЦЕНАРИИ КИНО *)
VAR_GLOBAL CONSTANT
SceneKinoGroupGostVerh : WORD := 1; (* Сценарий "Кино", группа LT-18 Гостиная Верх (Откл/Вкл) *)
SceneKinoGroupGostTrack : WORD := 2; (* Сценарий "Кино", группа LT-19 Гостиная Трек (Откл/Вкл) *)
SceneKinoGroupGostBra : WORD := 3; (* Сценарий "Кино", группа LT-20 Гостиная Бра (Откл/Вкл) *)
SceneKinoGroupKuhnaVerh : WORD := 4; (* Сценарий "Кино", группа LT-21 Кухня Верх (Откл/Вкл) *)
SceneKinoGroupKuhnaTrack : WORD := 5; (* Сценарий "Кино", группа LT-22 Кухня Трек (Откл/Вкл) *)
SceneKinoGroupKuhnaFartuk : WORD := 6; (* Сценарий "Кино", группа LT-23 Кухня Фартук (Откл/Вкл) *)
END_VAR

Васильев
21.03.2026, 14:16
я сейчас обязательно посмотрю...
вот только у меня переменных очень многооо и их почти все надо отображать в панели.

1exan
21.03.2026, 14:19
Васильев Снова за долгое время ...

Не понял, в чём преимущество объявления сначала указателей на структуры, а потом их привязки на адреса переменных, объявленных в конфигурации?
Понятно, что эту пару прямых адресов придётся посмотреть в конфигурации и что они могут измениться, но и разыменовывать каждый раз указатель при обращении к сетевой переменной - по мне так не сильно удобно.

Чем хуже сразу написать
vop01 AT %QDX.X.X : vops;
vop02 AT %QDX.X.X : vops;
?

1exan
21.03.2026, 14:31
я сейчас обязательно посмотрю...
вот только у меня переменных очень многооо и их почти все надо отображать в панели.

А какая панель?

Васильев
21.03.2026, 14:44
панель weintek.

У меня так и было.
Только по адресам были расписаны переменные для каждого воп, обрабатывал в цикле передавая указатель на воп, выполнял требуемые действия.
Потом создал структуры и тоже передавал как адрес - как вы и написали. (но появилась ошибка выше написано).
Теперь создал массив структур и обработка стала удобнее. Но нужно чтобы память была не фрагментирована.

Валенок
21.03.2026, 14:47
я сам не могу в нем разобраться..
Так если сами не можете разобраться, то где гарантиии что суть проблемы доводите правильно?
Но так как непрокатило поднятся в мире айти с вашим кодом за ваш счет, то продолжайте дальше.

kondor3000
21.03.2026, 14:48
панель weintek.

У меня так и было.
Только по адресам были расписаны переменные для каждого воп, обрабатывал в цикле передавая указатель на воп, выполнял требуемые действия.
Потом создал структуры и тоже передавал как адрес - как вы и написали. (но появилась ошибка выше написано).
Теперь создал массив структур и обработка стала удобнее. Но нужно чтобы память была не фрагментирована.

А с чего она у вас фрагментирована?
Массив структур ( с одним начальным адресом) будет всё подряд, даже если 19 переменных в структуре.
Правда вы сами запутаетесь быстрее.
Чтобы не путаться с адресами, в эмуляции задаю начальные значения в структуре и всё видно.

Валенок
21.03.2026, 14:53
Не понял, в чём преимущество объявления сначала указателей на структуры, а потом их привязки на адреса переменных, объявленных в конфигурации?..
Что AT% зло - да и с этим никто не спорит, но они же есть зачем-то же? Про онлайн подгрузку не буду, редкая и специфическая вещь, но то что тщ CS-CS просто никак не перейдет от указателей к 1 (всего одному) адресу, про это уже было.


и разыменовывать каждый раз указатель при обращении к сетевой переменной - по мне так не сильно удобно.
И по мне. И все это можно минимизировать. И при этом убрать дурацкие комментарии в стиле

i := i + 1; (*увеличиваем i на один*)

Валенок
21.03.2026, 15:00
...
План регистров так себе. Чувствуется веяние блуждающей где-то здесь картинки "переменныенадоразмещатьтак"
Но вас устраивает - и слава богу.

Васильев
21.03.2026, 15:04
А с чего она у вас фрагментирована?
Массив структур ( с одним начальным адресом) будет всё подряд, даже если 19 переменных в структуре.
Правда вы сами запутаетесь быстрее.
Чтобы не путаться с адресами, в эмуляции задаю начальные значения в структуре и всё видно.

изначально фрагментация произошла, что не было памяти достаточной.
Теперь надеюсь всё заработает (ПЛК110-60 на объекте с ним связи нет, только ПЛК110-30 доступен).
Почему переменные таймеров, статуса вентиляторов и т.д не включал в структуру? - вот к примеру создали в панели экран для одного вопа,
копируем это на экран другого Воп и к примеру меняем отображение статуса - нажимаем стрелку вниз и статус следующего уже здесь, не надо листать список параметров в поиске нужного регистра.
А для панели регистры проще виде таблицы, растянул и получил на несколько вопов, а не набивать в ручную каждый адрес.

Сейчас пока в основной памяти (гарантировано рабочей, возможно мое решение неправильное и проект будет неработоспособным) не могу разместить коэффициенты ПИД для всех в одном месте.

kondor3000
21.03.2026, 15:11
изначально фрагментация произошла, что не было памяти достаточной.
Теперь надеюсь всё заработает (ПЛК110-60 на объекте с ним связи нет, только ПЛК110-30 доступен).
Почему переменные таймеров, статуса вентиляторов и т.д не включал в структуру? - вот к примеру создали в панели экран для одного вопа,
копируем это на экран другого Воп и к примеру меняем отображение статуса - нажимаем стрелку вниз и статус следующего уже здесь, не надо листать список параметров в поиске нужного регистра.
А для панели регистры проще виде таблицы, растянул и получил на несколько вопов, а не набивать в ручную каждый адрес.

Если всё включить в структуру, например получилось 24 параметра. Адреса первого экрана с 0 по 23.
Значит с шагом 24 вы все экраны заполните адресами без проблем. Был адрес 1, на след странице 1+24=25

Cs-Cs
21.03.2026, 18:19
1exan Я наелся в 2016 прямых адресов и больше никогда не хочу с ними связываться. И ещё эта структура у меня гуляет по разным проектам. С указателями очень удобо её переносить.
Мне разыменовывать указатель нравится, потому что это напоминает списки переменных в CDS 3.5, где можно обращаться к перемнным по спискам типа VarsIO.hwSensorDoor - сразу ясно, куда и зачем ты обращаешься.
И ещё мне нравится то, что адрес подставляется автоматически. Вот какие достоинства я вижу:
1. Я именую только одну переменную в конфигурации ПЛК. Она может находиться в дереве где угодно. Мне не надо думать о порядке добавления Master/Slave в дерево.
2. (Самое удобное для самопроверки) Если я забуду создать эту переменную в Конфигурации, то у меня код точно не скомпилируется.
А с прямой адресацией можно случайно попасть пальцем в небо и привязать структуру куда-то не туда. При копипастах проекта.


Валенок Мне есть что сказать тебе.
1. По плану регистров: Ты пишешь как старпёр типа "Воот, попришли со своими новшествами, а мы раньше вот".
Это НЕ конструктивно, потому что ты НЕ умеешь понятно объяснить.
Я люблю учиться новому - но у тех, кто умеет объяснять. Я написал статьи, какие смог и сумел. Ни одной твоей статьи мне с 2016 года (когда я на форуме зарегался), читать не пришлось. Так что ты для меня - никто, не авторитет.
2. Про комментарии.
Я знаю, что я могу умереть в любой момент. Ну например, опять бахнет скоротечный рак, как в 2010, или взорвётся газ в моём жилом доме.
Поэтому я привык снижать стоимость владения своих проектов и расписывать всё очень подробно. Чтобы, когда я умру, в этом можно было легко разобраться.
Я считаю и, как диктатор, буду всем это назвязывать (даже если они не хотят).

Валенок
22.03.2026, 01:14
..новшествами..
))

.. объяснять..
тебе объяснено давно.
Да и даже с указателем можно 1 раз проюзать ^ и дальше использовать более чистый код без ^ (VAR_IN_OUT в помощь)
А у ТС спрошено про то как юзает. Тишина. Бегать за его проблемами?


я привык снижать стоимость владения своих проектов
тут же все усложнить мечтают


когда я умру, в этом можно было легко разобраться.
Это пройдет. Тоже уже говорил

Но вас устраивает - и слава богу (2)

Cs-Cs
22.03.2026, 09:22
Валенок Ты никогда ничего не объяснял. Ты больше выпендриваешься, но конкретики нет.
Все твои ответы в стиле "Во, а в STRING можно больше 80 байт пихнуть в Modbus-запросах, но как - я не скажу, думай сам".
Твоё мнение в таком ключе не нужно даже за деньги. А тем более задаром.
Я НЕ хочу с тобой контактировать, пока ты не научишься излагать свои мысли более развёрнуто и с примерами.

Васильев
22.03.2026, 09:25
kondor3000, Cs-Cs спасибо большое за помощь!

Васильев
27.03.2026, 20:47
Сегодня проверил работоспособность на железе.
максимальное количество сетевых переменных
стандартный 1-999, и расширенных 899. При дальнейшем увеличении прекращается обмен.

для ПЛК110-60 заметил еще одну особенность - переменные Dword можно объявлять только по нечетным адресам..

kondor3000
27.03.2026, 21:13
Сегодня проверил работоспособность на железе.
максимальное количество сетевых переменных
стандартный 1-999, и расширенных 899. При дальнейшем увеличении прекращается обмен.

для ПЛК110-60 заметил еще одну особенность - переменные Dword можно объявлять только по нечетным адресам..

В конфигурации можно сделать около 3000 регистров, если 1 закончить на 997 и ещё 2 по 990 вложить.

10 строк на ST библиотечный обмен, на любом ПЛК1хх, 17-20 тысяч регистров свободно, правда на RS485 (не TCP)
Я делал эмуляцию слейва ПР103 на ПЛК, где адреса начинаются с 16384 по 17004 и массив на 620 регистров и всё работает.