PLC, HMI, SCADA, INVERTERS, GSD PROFIBUS,
GSDML PROFINET, EDS CanOpen, INDUSTRIAL AUTOMATION

21:19
VEDA PROFINET GSDML-V2.31-VEDA-VF101-20220922.xml GSDML-V2.35-VEDA-VF101-20220727.xml

VEDA PROFINET GSDML-V2.31-VEDA-VF101-20220922.xml GSDML-V2.35-VEDA-VF1

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

Категория: VEDA MC | Просмотров: 87 | Добавил: gt7600 | Рейтинг: 5.0/2
Всего комментариев: 0
avatar