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


Ответить с цитированием
