FAQ

Обсуждение SCADA-систем и HMI SIEMENS: WinCC OA, WinCC, WinCC Flexible, ProTool
Аватара пользователя
alex
Администратор
Сообщений в теме: 5
Сообщения: 1627
Зарегистрирован: 05 апр 2010, 21:58
Откуда: Москва
Благодарил (а): 41 раз
Поблагодарили: 82 раза
Контактная информация:

FAQ

#1

Сообщение alex » 11 дек 2012, 11:38

В этой теме находятся ответы на часто возникающие вопросы по SCADA SIMATIC WinCC.

Официальные источники информации по разрешению проблем и FAQ по SCADA системе SIMATIC WinCC



Аватара пользователя
alex
Администратор
Сообщений в теме: 5
Сообщения: 1627
Зарегистрирован: 05 апр 2010, 21:58
Откуда: Москва
Благодарил (а): 41 раз
Поблагодарили: 82 раза
Контактная информация:

WinCC. Чистка памяти от процессов WinCC

#2

Сообщение alex » 21 ноя 2013, 21:03

Всем известна тяжесть WinCC :) я имею ввиду ее большие требования к системным ресурсам компьютера для отзывчивой работы средней системы диспетчеризации. Это не только благодаря тяжести MS SQL Server, но и благодаря архитектуре самой WinCC. Ведь при старте runtime в память компьютера загружается порядка 20(!) процессов, которые взаимодействуют друг с другом, и если что-то ломается в WinCC во время выполнения или во время разработки SCADA-системы, то без перезагрузки компьютера восстановить ее нормальную работоспособность бывает очень сложно.

Хотя я лично, проработав с ней несколько лет, научился обходится без перезагрузки, я просто выучил все процессы загружаемые в память компьютера и если что-то ломалось, удалял их в ручную, а потом сделал пакетный файл и запускал его при необходимости, тем самым экономя время на перезагрузках компьютера. Но оказывается ребята из SIEMENS уже давно позаботились об этой, достаточно частой операции при разработке SCADA-системы...

WinCC. Чистка памяти от процессов WinCC
Оказывается при установке WinCC на компьютер, в дистрибутиве уже идет нужный нам скрипт написанный на VBS. Называется этот скрипт Reset_WinCC.vbs, при установке по умолчанию он находится по пути C:\Program Files (x86)\Siemens\WinCC\bin\. Если коротко, он запускает утилиту CCCleaner.exe, которая читает XML-файл CCCleaner.xml, в котором перечислены процессы WinCC, которые необходимо убить.

p.s. Кстати, в версии WinCC 7.2 в этом списке 146(!) процессов.



Аватара пользователя
alex
Администратор
Сообщений в теме: 5
Сообщения: 1627
Зарегистрирован: 05 апр 2010, 21:58
Откуда: Москва
Благодарил (а): 41 раз
Поблагодарили: 82 раза
Контактная информация:

WinCC Global Script. Вызов функций из внешних DLL модулей на языке программирования C

#3

Сообщение alex » 03 апр 2014, 10:49

В Global Script C существует достаточно большая библиотека функций, как стандартных, в соответствии с ANSI-C, так и собственных, для работы с разными подсистемами WinCC, например, Alarm Logging, Trend Logging, Graphics Designer и т.д. как в режиме конфигурирования, так и в режиме выполнения (runtime). Казалось бы что еще нужно? Но как показывает практика, все таки есть ситуации когда этого недостаточно.

И вот в этом случае приходит на помощь одна из возможностей, которую заложили разработчики WinCC, это возможность вызова функций из внешних DLL модулей. Это конечно очень мощная возможность, которая перекрывает, наверное, все потребности для любого специфического функционала, который может потребоваться. Ведь это открывает возможности использовать для своих проектов функционал заложенный в DLL модули операционных систем Windows, использовать DLL модули, написанные самостоятельно на одно из общих языков программирования (например, C, С++, Delphi и т.д.).

Итак, как же воспользоваться этой возможность в Global Script C...

WinCC Global Script. Вызов функций из внешних DLL модулей на языке программирования C
Чтобы вызвать функции из DLL модуля необходимо предварительно их объявить в начале функции на С в соответствии со следующим синтаксисом:

Код: Выделить всё

#pragma code("<Name>.dll")
    <Type of returned value> <Function_name 1>(...);
    <Type of returned value> <Function_name2>(...);
    .
    .
    .
    <Type of returned value> <Function_name n>(...);
#pragma code()

Например, так:
SYSTEMTIME LocalTime ()
{
    #pragma code("kernel32.dll")
        void GetLocalTime (LPSYSTEMTIME lpSystemTime);
    #pragma code()

    SYSTEMTIME st;
    GetLocalTime(&st);
    return st;
}

Важные примечания:
  • Когда используются собственный DLL модуль в WinCC, необходимо использовать релизную его версию. WinCC поставляется в виде релизной версии и использует также релизные версии системных DLL модулей. Если собственный DLL модуль будет в виде отладочной версии, возможно что в память будут загружены и релизная и отладочная версия DLL модуля, что увеличить расход памяти.
  • Структуры в DLL модулях должны быть выровнены относительно 1 байта.
  • DLL модуль должен находиться либо в директории bin по пути установки WinCC, либо находиться по одному из путей прописанных в переменной окружения PATH.
  • Если список объявляемых функций из DLL модуля достаточно большой, бывает неудобно их перечислять в начале функции, т.к. это увеличивает размер функции, поэтому их можно вынести в отдельный файл с названием, например, "MyFunctions.h" (файл должен находиться рядом с функцией, в которой он используется) и включить его следующим образом:
    #pragma code("kernel32.dll")
            #include "MyFunctions.h"
    #pragma code()

  • Если в одной функции Global Script C необходимо использовать определения нескольких функций из разных DLL модулей, то можно поступить следующим образом:
    void MyFunction ()
    {
        #pragma code("module1.dll")
            void Func1 ();
        #pragma code()

        #pragma code("module2.dll")
            void Func2 ();
        #pragma code()

        Func1 ();
        Func2 ();
    }



Аватара пользователя
alex
Администратор
Сообщений в теме: 5
Сообщения: 1627
Зарегистрирован: 05 апр 2010, 21:58
Откуда: Москва
Благодарил (а): 41 раз
Поблагодарили: 82 раза
Контактная информация:

WinCC Global Script. Использование внешних COМ/ActiveX-объектов на языке программирвоания C

#4

Сообщение alex » 04 апр 2014, 13:31

Одна из неописанных в документации к Global Script C возможностей - это работа с внешними COM/ActiveX-компонентами через ряд встроенных функций. Это еще одна мощная возможность, которая очень часто может стать подспорьем в работе и расширить функциональные возможности проекта, т.к. количество COM/ActiveX-компонентов реализующие разнообразные функции существует великое множество, как стандартных, в рамках Windows, так и написанных независимыми разработчиками, более того никто не мешает использовать свои собственные компоненты.

Ниже приведен типовой пример работы с COM-объектом из Global Script C. В качестве COM-объекта используется стандартный с версии WinCC 6.0 COM-объект HMIRuntime, который, как видно из встроенной помощи, активно используется в VBA для задач автоматизации, но никто не запрещает его использовать и в Global Script C.

WinCC Global Script. Использование внешних COМ/ActiveX-объектов на языке программирвоания C
/*
    (с) 2014 www.proasutp.com

    Функция - пример работы с COM-объектами через Global Script C.

    В качестве подопытного COM-объекта выбран HMIRuntime, описание которого
    присутствует во встроенной помощи и который является частью WinCC, поэтому
    гарантированно присутствует на компьютере.

    Вход:
                    Нет.
            Выход:
                    Нет.
*/


void COMObjectCalling ()
{

    const char HMIRuntimeProgID [] = "CCHMIRuntime.HMIRuntime";

    double dblValue = 0.0;

    __object * pHMIRuntimeObject = NULL;
    __object * pHMITagInterface = NULL;

    // 1. Создаем COM-объект с помощью специальной встроенной функции WinCC
    //     в качестве входного параметра используется ProgID. На выходе получаем указатель на созданный объект

    pHMIRuntimeObject = __object_create (HMIRuntimeProgID);
   
    // 2. Проверяем что объект успешно создан, если указатель равено NULL, значит объект не создан

    if (pHMIRuntimeObject == NULL) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Не могу создать COM-объект CCHMIRuntime.HMIRuntime\r\n");
        return;
        }

    // 3. Теперь необходимо получить указатель на COM-интерфейс работы с тегом

    pHMITagInterface = pHMIRuntimeObject->Tags ("DoubleTag");

    // 4. Проверяем что интерфейс был успешно получен

    if (pHMITagInterface == NULL) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Не могу получить COM-интерфейс на тег DoubleTag\r\n");
        __object_delete (pHMITagInterface);
        return;
        }

    // 5. Читаем значение тега в локальную переменную

    dblValue = pHMITagInterface->Read ();

    // 6. Проверяем что тег прочитался успешно

    if (pHMITagInterface->LastError != 0) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка чтения тега DoubleTag, ErrorDescription: %s\r\n", pHMITagInterface->ErrorDescription);
        }

    // 7. Делаем инкремент значения локальной переменной и записываем значение в тег

    dblValue = dblValue + 1;
    pHMITagInterface->Write (dblValue);

    // 8. Проверяем успех операции

    if (pHMITagInterface->LastError != 0) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка записи в тег DoubleTag, ErrorDescription: %s\r\n", pHMITagInterface->ErrorDescription);
        }

    // 9. Удаляем объекты в обратной последовательности

    __object_delete (pHMITagInterface);
    __object_delete (pHMIRuntimeObject);
}

p.s. Да, важное замечание, не все COM/ActiveX-объекты могут быть использованы в Global Script C, а только те, в которых реализован COM-интерфейс IDispatch, так называемый интерфейс COM автоматизации.



Аватара пользователя
alex
Администратор
Сообщений в теме: 5
Сообщения: 1627
Зарегистрирован: 05 апр 2010, 21:58
Откуда: Москва
Благодарил (а): 41 раз
Поблагодарили: 82 раза
Контактная информация:

WinCC. Локализация на русский язык своими руками

#5

Сообщение alex » 06 сен 2016, 14:41

Обычная практика, что с выходом очередной версии SCADA-системы WinCC, локализация на русский язык существенно задерживается, а в некоторых случаях вообще не осуществляется. Но что делать, если один из выше описанных случаев ваш? Вы, как разработчик системы диспетчеризации, еще можете мириться с обычно англоязычной версией среды разработки, но как это объяснить конечному пользователю, который будет использовать вашу системы на производстве, заставлять учить английский язык? Ведь встраиваемые в графические страницы компоненты, например, такие как ActiveX-компоненты, невозможно локализовать из самой среды разработки штатным способом.

Оказывается, выход из ситуации есть, благо что разработчики SCADA-системы WinCC уже достаточно давно закладывают возможность локализации на другие языки интерфейсных элементов.

К локализации можно подойти системно, как это делает СМС-Автоматизация по заказу от SIEMENS, но в большинстве случаем, у компаний - системных интеграторов, работающих над конкретным проектом, нет таких ресурсов, поэтому на уровне отдельного инженера-программиста, в рамках конкретного проекта, можно сделать локализацию своими руками, не полную конечно, а только тех интерфейсных элементов, которые используются в проекте.

Как это сделать? Cмотрите видео под спойлером....

SIEMENS WinCC. Локализация на русский язык своими руками
Скрытая информация. Чтобы ее увидеть зарегистрируйтесь или войдите под своим логином.




Если эта тема может быть полезна другим, поделитесь ссылкой:

Вернуться в «SIMATIC: WinCC OA, WinCC, WinCC Flexible, ProTool»