Вчера работал с 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.

