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

Step7 + WinCC 7.0 SP2 пример проекта DEMO
[ Скачать с сервера (3.80 Mb) · Скачать удаленно (3.8 Mb) ]09.02.2026, 21:59

в данной теме хочу представить способ организации программы, которым пользуюсь несколько лет и выполнил немало проектов

прежде всего, знаю, что бывалым и опытным программистам, накопившим "немало наработок и отлаженных блоков" может быть не по себе такое строение программы, они привыкли по-другому
так же всем, кто боится большого количества Instance DB этот способ покажется неприемлемым

чтобы не тратить попусту слова, часа за полтора сделал демо-проект (STEP+WinCC 7.0 SP2), доносящий основную идею подхода, в основе лежит программа на STEP7 и интегрированный проект WinCC, разработкой которых занимается один человек

теперь коротко об основных моментах:
1. практические любая программа управления технологическим процессом в основном состоит из обработки внешних сигналов и управления механизмами

2. большинство механизмов и датчиков однотипные по входным/выходным сигналам сигналам, принципу работы. электрический проект и символьная таблица для таких механизмов типовая, поэтому логично написать одну FB с логикой работы этого типового механизма или датчика (получается класс механизма)

3. написанный FB вызывается для каждого механизма со своей Instance DB (объект или экземпляр механизма или датчика). DB желательно называть именем, связанным с названием механизма - не будет проблем с названием и не запутаешься

4. для каждого механизма пишется FB "Драйвер-имитатор". через драйвер происходит взаимодействие FB механизма с образом процесса. каждый механизм можно перевести в режим "Имитация", когда реальные входы и выходы отключаются от передаваемых на FB механизма входов/выходов. в этом случае состояние имитируемых тегов можно задавать с HMI. сигналы обратной связи в режиме "Имитация" имитируются программно. драйвер так же вызывается для каждого механизма с созданием Instance DB драйвера.

5. в драйвере можно производить инверсию и другое преобразование переменных. в драйвер можно включить логику управления насосом через контактор, ЧРП, УПП, ВВ ячейку или Симокод. для FB механизма это изменение не существенно. FB механизма содержит лишь логику работы механизма, а через что он включается - это ему не важно. происходит разделение логики. FB по-прежнему будет выдавать сигнал включить двигатель, а драйвер формировать слово управления и задание скорости на ЧРП и отправлять данные например через SFC15. через SFC14 получив слово состояния сформирует сигнал "двигатель работает" и отдаст его FB механизма. тот и успокоится.

6. для группы механизмов можно создать супервизорный FB, который будет управлять ими через предусмотренные входа в определенных режимах, получая дополнительную информацию: давление, расход, уровень и режим и состояние этих механизмов.

7. аналоговые сигналы обрабатываются с помощью FB, в которую заложены функции имитации и подстановки сигнала, чтобы можно было отключить/снять или даже не ставить датчик.

8. при переводе всех необходимых механизмов и аналоговых сигналов в режим имитации становится возможным отладка работы алгоритма в офисе или дома на PLCSim без подключения к ПЛК и реальному объекту. супервизорный блок в этом случае даже не знает, что работа механизмов имитируется, он просто выполняет свою логику работы.

9. даже если в проекте не предусмотрена визуализация на WinCC, ее можно сделать для отладки программы, это ускоряет процесс в разы - программист очень наглядно видит процесс и управляет им

10. написание драйвера для механизма гарантирует полное понимание принципа работы механизма, так как в драйвере закладывается реакция на любое воздействие (включение, превышение времени включения, переезд за конечники, долгое открытие/закрытие, заклинивание, повышенный ток при работе и прочее). на все это FB механизма должен адекватно реагировать.

11. достигается гибкость, масштабируемость и прозрачность программы. типовое изменение делается в типовом блоке и применяется ко всем типовым механизмам одновременно.

FUNCTION_BLOCK Analog - 'Блок масштабирования аналогового сигнала' (SCL)

FUNCTION_BLOCK drv_Pump - 'Драйвер-имитатор насоса' (SCL)

FUNCTION_BLOCK Pump - Блок управления насосом' (SCL)

PLC - CPU 315-2 PN/DP

HMI_Demo - SIMATIC AS-OS-Engineering V7.1 SP2


FUNCTION_BLOCK Analog


FUNCTION_BLOCK Analog

TITLE = 'Блок масштабирования аналогового сигнала'

VERSION: '0.1'
AUTHOR: aranea
NAME: Analog
FAMILY: Demo

// Block Parameters
VAR_INPUT
    // Input Parameters
    i_Value                             :   WORD    := W#16#0;  // Analog Channel Input Data
    i_RawMax                            :   INT     := 27648;   // Analog Input Raw Data Maximum 
    i_RawMin                            :   INT     := 0;       // Analog Input Raw Data Minimum
    i_EUMax         {S7_m_c := 'true'}  :   REAL    := 100.0;   // Maximum processed value for scaling of iValue
    i_EUMin         {S7_m_c := 'true'}  :   REAL    := 0.0;     // Minimum processed value for scaling of iValue
END_VAR

VAR_IN_OUT
    // I/O Parameters
    // HMI Related inputs
    io_ImitVal      {S7_m_c := 'true'}  :   REAL    := 0.0;     // Force Imitation Value (EU) FOR Analog Input Channel
    io_SubstVal     {S7_m_c := 'true'}  :   REAL    := 0.0;     // Force Substitution Value (EU) FOR Analog Input Channel

    io_Imit         {S7_m_c := 'true'}  :   BOOL    := 0;       // Enable Imitation
    io_Subst        {S7_m_c := 'true'}  :   BOOL    := 0;       // Enable Substitution
END_VAR

VAR_OUTPUT
    // Output Parameters
    q_Value          {S7_m_c := 'true'}  :   REAL    := 0.0;     // Scaled Output or Process output signal
    q_ValueP         {S7_m_c := 'true'}  :   REAL    := 0.0;     // Scaled Output OR Process output signal in percent (%)
END_VAR

VAR
    // Static Variables
    st_f_Imit   : BOOL  := 0;   // Imitation mode positive edge
END_VAR

// Statement Section
BEGIN

(* Compute the Process Output Value *)
IF i_RawMax <> i_RawMin THEN
    q_Value := (WORD_TO_INT(i_Value) - i_RawMin)*(i_EUMax - i_EUMin)/(i_RawMax - i_RawMin) + i_EUMin;
END_IF;

(* On entering Imitation mode receive last actual value *)
IF NOT st_f_Imit AND io_Imit THEN io_ImitVal := q_Value; END_IF;
st_f_Imit := io_Imit;

(* Substitution and Simulation Output Value*)
IF io_Subst THEN q_Value := io_SubstVal; END_IF;
IF io_Imit  THEN q_Value := io_ImitVal; END_IF;

(* Calculating value in percents *)
IF i_EUMax <> i_EUMin THEN q_ValueP := (q_Value-i_EUMin) / (i_EUMax-i_EUMin) * 100.0; END_IF;

END_FUNCTION_BLOCK


FUNCTION_BLOCK drv_Pump


FUNCTION_BLOCK drv_Pump

TITLE = 'Драйвер-имитатор насоса'

VERSION: '0.1'
AUTHOR: aranea
NAME: drv_Pump
FAMILY: Demo

//-- Block Parameters
VAR_INPUT
    //-- Input Parameters
    i_Cmd_Imit      : BOOL  := 0;   // Включение имитации
    i_Cmd_KM_On     : BOOL  := 0;   // Задание на включение
    // Реальные входы
    ir_QF_Motor     : BOOL  := 0;   // Автомат защиты двигателя
    ir_SA_Auto      : BOOL  := 0;   // Ключ "Автомат"
    ir_SA_Manual    : BOOL  := 0;   // Ключ "Ручной"
    ir_SB_Start     : BOOL  := 0;   // Кнопка "Пуск"
    ir_SB_Stop      : BOOL  := 0;   // Кнопка "Стоп"
    ir_SB_Emer_Stop : BOOL  := 0;   // Кнопка "Аварийный Стоп"
    ir_KM_On        : BOOL  := 0;   // Силовой контактор включен
    ir_RT_Fault     : BOOL  := 0;   // Тепловое реле
END_VAR

VAR_OUTPUT
    //-- Output Parameters
    // Виртуальные выходы
    q_QF_Motor      {S7_m_c := 'true'}  : BOOL  := 0;       // Автомат защиты двигателя
    q_SA_Auto       {S7_m_c := 'true'}  : BOOL  := 0;       // Режим "Автомат"
    q_SA_Manual     {S7_m_c := 'true'}  : BOOL  := 0;       // Режим "Ручной"
    q_SB_Start      {S7_m_c := 'true'}  : BOOL  := 0;       // Кнопка "Пуск"
    q_SB_Stop       {S7_m_c := 'true'}  : BOOL  := 0;       // Кнопка "Стоп"
    q_SB_Emer_Stop  {S7_m_c := 'true'}  : BOOL  := 0;       // Кнопка "Аварийный Стоп"
    q_KM_On                             : BOOL  := 0;       // Силовой контактор включен
    q_RT_Fault      {S7_m_c := 'true'}  : BOOL  := 0;       // Тепловое реле
    // Реальный выход
    qr_KM_On        : BOOL  := 0;   // Задание на включение
END_VAR

VAR
    //-- Static Variables
    st_f_ImitOn     : BOOL := 0; //
END_VAR

//-- Statement Section
BEGIN
IF i_Cmd_Imit THEN
    (* Режим имитации *)
    // Первоначальная инициализация
    IF NOT st_f_ImitOn THEN
        q_QF_Motor  := true;
        q_SA_Auto   := false;
        q_SB_Stop   := false;
        q_SB_Emer_Stop := false;
        q_RT_Fault  := false;

        st_f_ImitOn := true;
    END_IF;

    // Имитация включения контактора
    q_KM_On := i_Cmd_KM_On;
ELSE
    (* Реальная работа механизма *)
    // Передача сигналов
    // Виртуальные выходы
    q_QF_Motor      := ir_QF_Motor;
    q_SA_Auto       := q_SA_Auto;
    q_SA_Manual     := q_SA_Manual;
    q_SB_Start      := q_SB_Start;
    q_SB_Stop       := NOT q_SB_Stop;
    q_SB_Emer_Stop  := NOT ir_SB_Emer_Stop;
    q_KM_On         := q_KM_On;
    q_RT_Fault      := NOT ir_QF_Motor;
    // Реальный выход
    qr_KM_On        := i_Cmd_KM_On;

    // Сброс фронта перехода в имитацию
    st_f_ImitOn := false;
END_IF;

END_FUNCTION_BLOCK


FUNCTION_BLOCK Pump


FUNCTION_BLOCK Pump

TITLE = 'Блок управления насосом'

VERSION: '0.1'
AUTHOR: aranea
NAME: Pump
FAMILY: Demo

//-- Block Parameters
VAR_INPUT
    //-- Input Parameters
    i_QF_Motor      {S7_m_c := 'true'}  : BOOL  := 0;       // Автомат защиты двигателя

    i_SA_Auto       {S7_m_c := 'true'}  : BOOL  := 0;       // Режим "Автомат"
    i_SA_Manual     {S7_m_c := 'true'}  : BOOL  := 0;       // Режим "Ручной"

    i_SB_Start      {S7_m_c := 'true'}  : BOOL  := 0;       // Кнопка "Пуск"
    i_SB_Stop       {S7_m_c := 'true'}  : BOOL  := 0;       // Кнопка "Стоп"
    i_SB_Emer_Stop  {S7_m_c := 'true'}  : BOOL  := 0;       // Кнопка "Аварийный Стоп"

    i_KM_On         {S7_m_c := 'true'}  : BOOL  := 0;       // Силовой контактор включен

    i_RT_Fault      {S7_m_c := 'true'}  : BOOL  := 0;       // Тепловое реле

    i_Auto_Run      : BOOL  := 0;   // Задание на включение в автомате
END_VAR

VAR_IN_OUT
    //-- I/O Parameters
    io_Curr_On      {S7_m_c := 'true'}  : BOOL  := 0;       // Схема собрана
    io_On           {S7_m_c := 'true'}  : BOOL  := 0;       // 

    io_e_Stop       {S7_m_c := 'true'}  : BOOL  := 0;       // Ошибка. Аварийный стоп
    io_e_RT         {S7_m_c := 'true'}  : BOOL  := 0;       // Ошибка. Тепловое реле
    io_e_All        {S7_m_c := 'true'}  : BOOL  := 0;       // Результирующая ошибка
    io_b_All        {S7_m_c := 'true'}  : BOOL  := 0;       // Результирующая блокировка
    io_HMI_Reset    {S7_m_c := 'true'}  : BOOL  := 0;       // Сброс ошибки
END_VAR

VAR_OUTPUT
    //-- Output Parameters
    q_KM_On         : BOOL  := 0;   // Задание на включение

    q_Imit          {S7_m_c := 'true'} : BOOL  := 0;    // Режим "Имитация"
END_VAR

VAR_TEMP
    //-- Temporary Variables

END_VAR

VAR
    //-- Static Variables
    st_Ready        : BOOL := 0; // Готовность клапана
    st_f_SB_Start   : BOOL := 0; // Фронт кнокпи "Пуск"
    st_On           : BOOL := 0; // Работа двигателя
    st_f_SB_Reverse : BOOL := 0; // Готовность клапана
    st_f_SA_Manual  : BOOL := 0; // Готовность клапана
END_VAR

//-- Statement Section
BEGIN

(* Формирование статусных битов *)
//== Электрическая схема собрана
io_Curr_On := i_QF_Motor;
//== Работа двигателя
io_On := i_KM_On;

(* Формирование и сброс ошибок *)
//== Формирование ошибки "Аварийный стоп"
io_e_Stop   := (i_SB_Emer_Stop OR (io_e_Stop AND NOT io_HMI_Reset));

//== Формирование ошибки "Тепловое реле"
io_e_RT     := (i_RT_Fault OR (io_e_RT AND NOT io_HMI_Reset));

//== Формирование сборной ошибки
io_e_All := io_e_Stop OR io_e_RT;

io_HMI_Reset := false;

(* Формирование блокировок *)
io_b_All := NOT io_Curr_On OR i_RT_Fault;

(* Формирование признака готовности *)
st_Ready := NOT io_e_All AND NOT io_b_All;

(* Задание на включение *)
IF st_Ready AND (                                               // Готов
    (i_SA_Manual AND (i_SB_Start AND NOT st_f_SB_Start))        // Режим "Ручной" и фронт кнопки "Пуск"
    OR                                                          // или
    (i_SA_Auto AND i_Auto_Run)                                  // Режим "Автомат" и задание на включение
    ) THEN
        q_KM_On := true;
END_IF;

(* Задание на отключение *)
IF NOT st_Ready OR                                              // Не готов
    (i_SA_Manual AND i_SB_Stop)                                 // Режим "Ручной" и кнопка "Стоп"
    OR                                                          // или
    (i_SA_Auto AND NOT i_Auto_Run)                              // Режим "Автомат" и нет разрешения
    THEN
        q_KM_On := false;
END_IF;

st_f_SB_Start   := i_SB_Start;

END_FUNCTION_BLOCK


Категория: SIEMENS | Добавил: gt7600
Просмотров: 33 | Загрузок: 16 | Рейтинг: 5.0/1
Всего комментариев: 0
avatar