PDA

Просмотр полной версии : Пр200 и Vacon NXL



dan75
12.05.2026, 10:37
Добрый день!
Есть насос на ГВС, управляемый частотником Vacon NXL. Хотелось бы подружить его с ПР200 для дистанционного пуска/стопа, задания частоты, считывания неисправностей и т.д. Карта регистров и поддерживаемые команды таковы:
89168
89167
ПР не позволяет задавать адреса в формате 42101, 42102 и т.д. Поэтому попробовал задавать 2101, 2102 и т.д., с расчётом, что частотник по команде поймёт, к какой области регистров обращаются.
В частотнике задал адрес, скорость, чётность и стоп-биты.
Частотник на запросы не реагирует, статусная переменная =0.

ASo
12.05.2026, 10:55
Вы отдельным ПО пробовали прочитать?

dan75
12.05.2026, 10:58
Нет, не пробовал. А чем из бесплатного можно прочитать?

kondor3000
12.05.2026, 11:01
Добрый день!
Есть насос на ГВС, управляемый частотником Vacon NXL. Хотелось бы подружить его с ПР200 для дистанционного пуска/стопа, задания частоты, считывания неисправностей и т.д. Карта регистров и поддерживаемые команды таковы:
ПР не позволяет задавать адреса в формате 42101, 42102 и т.д. Поэтому попробовал задавать 2101, 2102 и т.д., с расчётом, что частотник по команде поймёт, к какой области регистров обращаются.
В частотнике задал адрес, скорость, чётность и стоп-биты.
Частотник на запросы не реагирует, статусная переменная =0.

Слово состояния надо читать, а не задавать!
Адреса могут быть смещены на 1.

ASo
12.05.2026, 11:15
Нет, не пробовал. А чем из бесплатного можно прочитать?

Например, этим (https://masteropc.ru/modbusuniversal).

dan75
12.05.2026, 11:18
Со словом понятно.
Было бы смещение, прочиталось бы хоть что-то. Или нет?

МихаилГл
12.05.2026, 11:26
Если модбас рту, то ещё понадобится свисток... Без него никак.

dan75
12.05.2026, 11:39
Если модбас рту, то ещё понадобится свисток... Без него никак.

Он есть. На старом ноуте даже ПО какое-то было, которым крутил danfoss vlt. Но давно этим не занимался. И с ваконами по modbus сталкиваюсь впервые.

dan75
12.05.2026, 11:40
Например, этим (https://masteropc.ru/modbusuniversal).

Благодарю!

kondor3000
12.05.2026, 13:33
ПР не позволяет задавать адреса в формате 42101, 42102 и т.д. Поэтому попробовал задавать 2101, 2102 и т.д., с расчётом, что частотник по команде поймёт, к какой области регистров .
ПР200 позволяет задать адреса 42101, 42102, 89169
другое дело что задавать надо 2101 и 2102, а область задаётся функцией чтения.

Для проверки смещения +1 адреса, надо прочитать мощность и напряжение 2108, 2109, 2110 и посмотреть.

FPavel
12.05.2026, 19:27
Вчера работал с VECON 100 - только вся документация по Modbus на английском.
Возможно, что-то совпадёт из адресов и способов обработки.

Как понимаю, 42101 и 32101 это такая форма записи функций и адресов - т.е. 3x и 2100, 4x и 2100 - все адреса из документа нужно уменьшить на 1.

Обработчик обмена с ПЧВ

///<Description>ФБ выполняет преобразование принятых и отправляемых команд при сетевом обмене с ПЧВ VACON.</Description>
///<Author>!!FPA!!</Author>
///<GroupName>ПЧВ</GroupName>

function_block VFD_VACON_

var_input
bSetStart : bool;
rSetSpeed : real;
wGetSpeed : udint; // адрес 0837h (2103) - рабочая скорость, диапазон 0-5000 => 0-50.00 (умножить на 0.01)
wGetIout : udint; // адрес 0839h (2105) - выходной ток
wGetUChainDc : udint; // адрес 083Dh (2109) - напряжение на ЗПТ *1 В
wNoutPower : udint; // адрес 083Bh (2107) - выходная мощность *0,1 %
wGetIrate : udint; // адрес 0070h (112) - номинальный ток (умножить на 0.1)
wGetStateVFD : udint; // адрес 0834h (2100) - регистр состояния:
// 0001 - вращение в прямом направлении
// 0002 - вращение в обратном направлении
// 0003 - остановка
wGetErrorCode : udint; // адрес 083Eh (2110)
bResetAlarm : bool;
end_var

var_output
wSetCmd : udint; // адрес 07D0h (2000):
// 0001 - прямо,
// 0008 - остановка выбегом,
// 0016 - остановка замедлением,
// 0004 - сброс аварии
wSetSpeed : udint; // адрес 1000h (4096), диапазон 0-100% => 0-10000 (умножить на 100)
rGetSpeed : real;
rGetIout : real;
rGetUChainDC : real; // напряжение на ЗПТ
rNoutPower : real; // выходная мощность
rGetIout_A : real;
rGetIrate_A : real;
bStateStop : bool;
bStateRun : bool;
bStateFault : bool;
wErrorCode : udint;
end_var

var
localVariable : real;
end_var


if bResetAlarm then
wSetCmd := 4;
else
if bSetStart then
wSetCmd := 1;
else
wSetCmd := 16;
end_if;
end_if;

wSetSpeed := real_to_udint(rSetSpeed * 100);
rGetSpeed := udint_to_real(wGetSpeed) * 0.02;

rGetIout_A := udint_to_real(wGetIout) * 0.1;
rGetUChainDC :=udint_to_real(wGetUChainDc) * 0.1;
rNoutPower := udint_to_real(wNoutPower) * 0.1;
rGetIrate_A := udint_to_real(wGetIrate) * 0.1;
if wGetIrate = 0 then
rGetIout := 0;
else
rGetIout := 100.0 * rGetIout_A / rGetIrate_A;
end_if;
bStateStop := not (wGetStateVFD.1);
bStateRun := (wGetStateVFD.1);
bStateFault := (wGetStateVFD.3);
wErrorCode := wGetErrorCode;

end_function_block

На вход поступают команды из программы:
- bSetStart - включить ПЧВ
- rSetSpeed - скорость вращения, в %
- bResetAlarm - импульс длительностью 3 с от таймера TP - сброс ошибки
На вход поступают значения из Modbus:
- wGetSpeed - актуальная скорость ПЧВ с учётом разных ограничений в самом ПЧВ (например, максимального тока)
- и др. - описаны в комментариях

На выходе:
- состояния ПЧВ,
- скорость ПЧВ, в %
- рабочий ток, в %

Алгоритмы, которые дают мне для реализации не привязываются к абсолютным значениям, а всегда вычисляются в % - и рабочий ток и скорость. Поэтому и ФБ оперирует с %.

Ещё, при разборе примера я неправильно понял и в конфигурации сделал слово управления и слово состояния размером в 2 регистра - нужно уменьшить до 1 регистра.
Всё читается функцией 3, но и функция 4 тоже даёт правильный результат. Я везде оставил функцию 3.

FPavel
13.05.2026, 06:04
Добавлю примечание.

Сразу не обратил внимание, что команда сброса ошибки bResetAlarm получила приоритет и при подаче на "исправный" ПЧВ прервёт команду пуск bSetStart.
Наверное, нужно усложнить условие (bResetAlarm and 0bStateFault), тогда на исправный ПЧВ команда сброса не отправится.

dan75
13.05.2026, 10:56
FPavel , спасибо! Использую Ваши наработки... если удастся связаться с частотником.

KSergey
13.05.2026, 14:26
Добавлю примечание.

Сразу не обратил внимание, что команда сброса ошибки bResetAlarm получила приоритет и при подаче на "исправный" ПЧВ прервёт команду пуск bSetStart.
Наверное, нужно усложнить условие (bResetAlarm and 0bStateFault), тогда на исправный ПЧВ команда сброса не отправится.

Или записывать конкретный бит в слово wSetCmd (.0 - пуск, .2 - сброс и т.д.) во избежание прерывания других команд.

FPavel
13.05.2026, 18:20
Или записывать конкретный бит в слово wSetCmd (.0 - пуск, .2 - сброс и т.д.) во избежание прерывания других команд.
Наверное, в конкретном ПЧВ VECON 100 для сброса можно сделать именно битовой операцией, но для остальных команд (старт вперёд и плавный останов) лучше оставить в виде чисел - т.к. они взаимоисключающие.
Тогда получится

if bSetStart then
wSetCmd := 1;
else
wSetCmd := 16;
end_if;
if bResetAlarm then
wSetCmd.2 := true;
end_if;

Делал тогда в спешке, на основе каких-то других наработок, не всё учёл...

Валенок
14.05.2026, 08:38
Васон 100 небыло, был Васон 0010. Отметил главные особенности:
1. Реальный регистр = идентефикатор (там именно так звалось в карте) - 1
2. Его A, B это внезапно B, A
Это все может быть родовым заклятьем

dan75
14.05.2026, 16:45
Васон 100 небыло, был Васон 0010. Отметил главные особенности:
1. Реальный регистр = идентефикатор (там именно так звалось в карте) - 1
2. Его A, B это внезапно B, A
Это все может быть родовым заклятьем

Т.е. у него может быть перепутана полярность RS485? Внезапненько! Пожалуй, это то, с чего мне следует начать поиски.

dan75
26.05.2026, 11:53
Васон 100 небыло, был Васон 0010. Отметил главные особенности:
1. Реальный регистр = идентефикатор (там именно так звалось в карте) - 1
2. Его A, B это внезапно B, A
Это все может быть родовым заклятьем

Огромное спасибо за неоценимую подсказку! Кто ж знал, что у Vacon'ов А -- это В, а В -- это А. Доехал до объекта, почитал частотник ноутом, потом почитал ПРкой, попробовал задавать скорость -- всё работает.