
GSDML-V2_35-VEDA-VF101-20220727.zip - SIEMENS TIA Portal для S7-1200 и S7-1500 и др. = GSDML-V2.35-VEDA-VF101-20220727.xml
profinet-veda-vfd-s300-s400.zip - SIEMENS STEP7 для S7-300 и S7-400 и др. = GSDML-V2.31-VEDA-VF101-20220922.xml
PBC00003_Profinet.pdf - 12.09.2022 Инструкция по эксплуатации VEDA VF-101 PROFINET
VEDA_Profinet.scl - FB блок на SCL TIA Portal V19
FUNCTION_BLOCK "VEDA_Profinet"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
HW_ID : HW_ANY; // Аппаратный идентификатор Profinet телеграммы
Start : Bool; // Пуск вперед
Reverse : Bool; // Пуск назад
Stop : Bool; // Останов с замедлением
ResetFault : Bool; // Сброс ошибки
Freq_Set : Real; // Задание частоты в Гц (например, 50.0)
END_VAR
VAR_OUTPUT
Freq_Actual : Real; // Выходная частота
Current_Actual : Real; // Выходной ток
RPM_Actual : Real; // Выходные обороты
Torque_Actual : Real; // Выходной момент
Fault : Bool; // Ошибка ПЧ
Ready : Bool; // Готовность ПЧ
Running : Bool; // ПЧ в работе
Warning : Bool; // Предупреждение
CommOK : Bool; // Связь с ПЧ ОК
CommError : Bool; // Нет связи с ПЧ
END_VAR
VAR
PZD_In : Array[0..5] of Word;
PZD_Out : Array[0..5] of Word;
ControlWord : Word;
ReadError : Int;
WriteError : Int;
StatusWord : Word;
FaultCode : Word;
CommTimer {InstructionName := 'TON_TIME'; LibVersion := '1.0'; S7_SetPoint := 'False'} : TON_TIME;
END_VAR
BEGIN
(*
1. Настройка работы ПЧ с картой Profinet:
F01.01 = 3 — Источник команды ПУСК: Карта расширения
F01.02 = 10 — Источник задания частоты: Карта расширения
2. Настройка ПЧ для передачи выходных параметров в телеграммы Profinet
таблица 3.3 стр.12 "Руководство по эксплуатации карты Profinet для VF-101"
Параметр в ПЧ Вводимы данные
PZD1 - (Стандартно) — Слово состояния (Status Word)
PZD2 - (Стандартно) — Текущая выходная частота
PZD3 - C02.51 - 2 (Выходной ток)
PZD4 - C02.52 - 3 (Скорость вращения (Обороты))
PZD5 - C02.53 - 4 (Выходной момент (в %))
PZD6 - C02.54 - 16(hex) (Код последней неисправности)
*)
// ------------------------------------------------------
// 1. Логика формирования команды PZD1 (Control Word)
// ------------------------------------------------------
// Согласно инструкции: 1=Run, 2=Reverse, 5=Stop, 7=Reset, 9 (19)=Enable
IF #ResetFault THEN
#ControlWord := 16#0007; // Сброс ошибки
ELSIF #Stop THEN
#ControlWord := 16#0005; // Останов с замедлением
ELSIF #Start THEN
IF #Reverse THEN
#ControlWord := 16#0002; // Пуск Назад
ELSE
#ControlWord := 16#0001; // Пуск Вперед
END_IF;
ELSE
// Нет активных команд - отправляем "Разрешение пуска" (Ready)
// здесь надо подать 9 либо 19
#ControlWord := 16#0009; // 9 - Разрешение команды "Пуск"
END_IF;
// ------------------------------------------------------
// 2. Формирование выходных данных (PZD Out)
// Массив #PZD_Out объявлен как ARRAY[0..5] OF WORD
// ------------------------------------------------------
#PZD_Out[0] := #ControlWord; // PZD1: команда
#PZD_Out[1] := INT_TO_WORD(REAL_TO_INT(#Freq_Set * 100.0)); // PZD2: задание частоты (0.01 Гц)
#PZD_Out[2] := 0; // PZD3: резерв (при необходимости настраивается в ПЧ)
#PZD_Out[3] := 0; // PZD4: резерв (в параметрах C02.41)
#PZD_Out[4] := 0; // PZD5: резерв
#PZD_Out[5] := 0; // PZD6: резерв
// ------------------------------------------------------
// 3. Обмен данными через циклическую связь
// ------------------------------------------------------
#WriteError := DPWR_DAT(LADDR := #HW_ID, RECORD := #PZD_Out);
#ReadError := DPRD_DAT(LADDR := #HW_ID, RECORD => #PZD_In);
// ------------------------------------------------------
// 4. Обработка входных данных (PZD In)
// #PZD_In объявлен как ARRAY[0..5] OF WORD
// ------------------------------------------------------
#StatusWord := #PZD_In[0]; // PZD1: слово состояния (битовое поле)
#Freq_Actual := INT_TO_REAL(WORD_TO_INT(#PZD_In[1])) / 100.0; // PZD2: частота (0.01 Гц)
#Current_Actual := INT_TO_REAL(WORD_TO_INT(#PZD_In[2])) / 10.0; // PZD3: ток (0.1 А)
#RPM_Actual := INT_TO_REAL(WORD_TO_INT(#PZD_In[3])); // PZD4: обороты (1 об/мин)
#Torque_Actual := INT_TO_REAL(WORD_TO_INT(#PZD_In[4])) / 10.0; // PZD5: момент (0.1 %)
#FaultCode := #PZD_In[5]; // PZD6: код последней ошибки
// ------------------------------------------------------
// 5. Диагностика статуса (расшифровка бит согласно таблице 4.4)
// ------------------------------------------------------
// Бит 0: 1 - В работе (Running)
#Running := (#StatusWord & 16#0001) <> 0;
// Бит 4: 1 - Неисправность (Fault)
#Fault := ((#StatusWord & 16#0010) <> 0) OR (#FaultCode > 0);
// Бит 6: 1 - Предупреждение (Warning) - опционально
#Warning := (#StatusWord & 16#0040) <> 0;
// Бит 7: 1 - Пуск возможен (Ready) - опционально
#Ready := (#StatusWord & 16#0080) <> 0;
// ------------------------------------------------------
// 6. Диагностика связи с фильтрацией по времени
// ------------------------------------------------------
#CommOK := (#ReadError = 0) AND (#WriteError = 0);
IF NOT #CommOK THEN
// Связь отсутствует в текущем цикле – запускаем таймер
#CommTimer(IN := NOT #CommOK, PT := t#2s);
IF #CommTimer.Q THEN
#CommError := TRUE;
END_IF;
ELSE
// Связь есть – сбрасываем таймер и ошибку
#CommTimer(IN := FALSE, PT := t#2s);
#CommError := FALSE;
END_IF;
END_FUNCTION_BLOCK |