Скрипты на С, VBS и VBA в помощь разработчикам

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

C: char* strchrback (char* pszString, char chChar)

#11

Сообщение alex » 02 апр 2014, 23:17

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

/*
        (с) 2014 www.proasutp.com

        Функция ищет заданный символ с конца строки.

        Вход:
        pszString - указатель на строковый буфер где будет осуществляться поиск;
        chChar - символ, поиск которого будет осуществляться.
   
        Выход:
                Если символ не найден возвращается NULL иначе возвращается указатель на найденный символ в строковом буфере

*/


#include "apdefap.h"

char* strchrback (char* pszString, char chChar)
{
    int i=0;
   
    if (pszString == NULL) {
        LogMsg ((DWORD)-1,"Передан нулевой указатель на строковый буфер в параметре pszString","strchrback");
        return NULL;
        }

    for (i=
strlen
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
(pszString)-1; i>0; i--)
        if (pszString[i]==chChar) break;

    if (i < 0)
        return NULL;
    else
        return &pszString[i];
}



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

C: DWORD Ticks ()

#12

Сообщение alex » 02 апр 2014, 23:21

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

/*
        (с) 2014 www.proasutp.com

        Функция возвращает количество миллисекунд прошедших с момента запуска ОС.

        Вход:
        Нет.
   
        Выход:
        Количество миллисекунд прошедших с момента запуска операционной системы.

*/


DWORD Ticks ()
{
    #pragma code ("kernel32.dll")
    DWORD GetTickCount(void);
    #pragma code ()

    return GetTickCount();
}



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

C: void WriteValueToExcelTable()

#13

Сообщение alex » 26 ноя 2015, 11:51

/*
        (с) 2015 http://www.proasutp.com

        Функция-пример записи значения в ячейку таблицы Excel.

        Вход:
                Нет
        Выход:
                Нет

*/


#include "apdefap.h"

void WriteValueToExcelTable()
{  
    // указатели на объекты...

    __object* pExcel = NULL;
    __object* pWorkbooks = NULL;
    __object* pActiveWorkbook = NULL;
    __object* pCells = NULL;
   
    #define CELL_VALUE 2.34L;   // значение, которое будем записывать в ячейку таблицы Excel   
    #define TABLE_ROW 2         // номер строки, в нашем случае это строка 2
    #define TABLE_COL 1         // номер столбца, в нашем случае это столбец 1 или столбец А

    // Создаем объект приложения независимо от версии Excel по его ProgID...

    pExcel = __object_create("Excel.Application");
    if(NULL == pExcel) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка создания приложения Excel.Application!\r\n");
        return;
        }

    // Получаем указатель на книгу...
       
    pWorkbooks = pExcel->Workbooks;
    if(NULL == pWorkbooks) {
        __object_delete(pExcel);
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка получения указателя на Workbooks!\r\n");
        return;
        }

    // Делает окно Excel невидимым и открываем предварительно созданный в Excel тестовый файл 

    pExcel->Visible = 0;
    pWorkbooks->Open ("c:\\sample.xlsx");

    // Пишем тестовое значение в ячейку активной рабочей книги в активную таблицу в ячейку A2

    pCells = pExcel->Cells (TABLE_ROW, TABLE_COL);
    pCells->Value = CELL_VALUE;
    __object_delete (pCells);

    // Получаем указатель на активную рабочую книгу и сохраняем измененный файл

    pActiveWorkbook = pExcel->ActiveWorkbook;

    if(NULL == pActiveWorkbook) {
        __object_delete(pWorkbooks);
        __object_delete(pExcel);
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка получения указателя на pActiveWorkbook!\r\n");
        return;
        }

    pActiveWorkbook->Save();
    __object_delete(pActiveWorkbook);

    // Завершаем работу приложения и уничтожаем объекты
   
    pWorkbooks->Close();
    pExcel->Quit();
   
    __object_delete(pWorkbooks);
    __object_delete(pExcel);

    return;
}



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

VBScript: Sub WriteTagToExcelFile ()

#14

Сообщение alex » 06 дек 2015, 17:04

'       (с) 2015 http://www.proasutp.com
'
'       Процедура-пример записи значения тега в таблицу Excel в WinCC на VBScript.
'
'       Вход:
'                Нет
'        Выход:
'                Нет

Sub WriteTagToExcelFile () 
    Dim fso, myfile
    Dim objexcelapp
    Dim path, filename
   
    Set fso = CreateObject ("scripting.filesystemobject")
    Set myfile = fso.GetFile ("c:\demo.xlsx")
   
    Set objexcelapp = CreateObject ("excel.application")
    objexcelapp.visible=True
   
    objexcelapp.workbooks.open myfile
   
    objexcelapp.worksheets("sheet1").cells(2,3).value = HMIRuntime.Tags("tag1").Read
   
    filename = CStr(Year(Now)) & "-" & CStr(Month(Now)) & "-" & CStr(Day(Now))
    filename = "-" & CStr(Hour(Now)) & "-" & CStr(Minute(Now)) & "-" & CStr(Second(Now))
    path = "c:\" & filename & "-" & "demo.xlsx"
   
    objexcelapp.activeworkbook.SaveAs path
   
    objexcelapp.workbooks.close
    objexcelapp.quit
    Set objexcelapp = Nothing
   
End Sub



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

VBScript: Sub WritingValuesInExcelCells ()

#15

Сообщение alex » 06 дек 2015, 17:17

'       (с) 2015 http://www.proasutp.com
'
'       Процедура-пример работы с ячейками таблицы Excel в WinCC на VBScript.
'
'       Вход:
'                Нет
'        Выход:
'                Нет

Sub WritingValuesInExcelCells ()

    Dim fso, myfile, i
    Dim objexcelapp

    Set fso = CreateObject("scripting.filesystemobject")
    Set myfile = fso.GetFile("d:\demo.xlsx")
    Set objexcelapp = CreateObject("excel.application")
   
    objexcelapp.visible=True
    objexcelapp.workbooks.open myfile
   
    i = objexcelapp.worksheets("sheet1").cells(2,100).value
    objexcelapp.worksheets("sheet1").cells(i,3).value = HMIRuntime.Tags("tag1").Read
    i = i + 1
    objexcelapp.worksheets("sheet1").cells(2,100).value = i
   
    objexcelapp.activeworkbook.Save
   
    objexcelapp.workbooks.close
    objexcelapp.quit
    Set objexcelapp = Nothing

End Sub



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

C: void COMCalling ()

#16

Сообщение alex » 22 дек 2015, 22:20

/*
    (с) 2014 www.proasutp.com

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

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

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


void COMCalling ()
{

    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);
}



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

C: HWND GetWinCCRTMainWinHandle()

#17

Сообщение alex » 22 дек 2015, 22:29

/*
        (с) 2015 http://www.proasutp.com
   
        Функция возвращает хендл главного окна проекта WinCC режима исполнения (runtime).
        Обычно используется для вывода окон дочерних данному окну.

*/


HWND GetWinCCRTMainWinHandle()
{
    return FindWindow("PDLRTisAliveAndWaitsForYou","WinCC-Runtime - ");
}



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

VBA: Создание пользовательского меню в WinCC Graphics Designer

#18

Сообщение alex » 24 янв 2016, 23:48

'       (с) 2016 http://www.proasutp.com
'
'       Пример создания пользовательского меню в графическом дизайнере WinCC (WinCC Graphics Designer).
'       В примере показан вызов пользовательской функции - подсчета количества графических объектов на графической странице.
'
'      Использование: Данный код можно вставить для демонстрации работы, например, на уровне текущей открытой графической страницы
'                     (Tools->Macros->Visual Basic Editor ->VBAProject(X)->Graphics Designer Objects->ThisDocument (PageName.Pdl))
'
'       Вход:
'                Нет
'        Выход:
'                Нет

Dim WithEvents theApp As grafexe.Application

Private Const m_sMenuTitle = "Автоматизация задач"
Private Const m_sItemMenuTitle = "Подсчет количества графических объектов на странице"

' Событие, возникающие при открытии графической страницы в Graphics Designer

Private Sub Document_Opened(CancelForwarding As Boolean)
    Set theApp = grafexe.Application
    CreateMyCustomMenu
End Sub

' Создание пользовательского пункта меню в главном меню Graphics Designer

Private Sub CreateMyCustomMenu()
   
    Dim objMenu As HMIMenu
    Dim objMenuItem As HMIMenuItem

    Set objMenu = Application.CustomMenus.InsertMenu(1, m_sMenuTitle, m_sMenuTitle)
    Set objMenuItem = objMenu.MenuItems.InsertMenuItem(1, m_sItemMenuTitle, m_sItemMenuTitle)

End Sub

' Отработка события выбора элемента меню

Private Sub theApp_MenuItemClicked(ByVal MenuItem As IHMIMenuItem)

    Dim objMenuClicked As HMIMenuItem
    Dim c As Long
       
    Set objMenuClicked = MenuItem
   
    Select Case objMenuClicked.Key
         Case m_sItemMenuTitle
            c = GetGraphicsObjectCount ()
            MsgBox "Количество графических объектов, шт: " & c, vbOKOnly, m_sMenuTitle
    End Select

End Sub

' Получить количество графических объектов на текущей графической странице

Private Function GetGraphicsObjectCount () As Long
    GetGraphicsObjectCount = theApp.ActiveDocument.HMIObjects.Count
End Function



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

С: Чтение данных из пользовательского архива (User Archive) WinCC

#19

Сообщение alex » 01 фев 2016, 22:12

/*
    (с) 2016 http://www.proasutp.com

    Функция-пример чтения значений полей записей пользовательского архива (User Archive) WinCC.

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


#include "apdefap.h"

void UserArchiveReadingValues()
{
    #define ARCHIVE_NAME "UserArchiveName"

    #define ARCHIVE_ID_FIELD_NUMBER 0
    #define ARCHIVE_FLOAT_FIELD_NUMBER 1
    #define ARCHIVE_STRING_FIELD_NUMBER 2

    #define STRING_FILED_SIZE 255
   
    UAHCONNECT hConnect = 0;
    UAHARCHIVE hArchive = 0;
    long nError = 0;
    BOOL bIsOk = FALSE;
   

    long nCount = 0, i = 0;

    long nIDFieldValue = 0;
    float fFloatFieldValue = 0;
    char szStringFieldValue[STRING_FILED_SIZE+1] = "";

    // Подключение к среде исполнения пользовательских архивов...

    bIsOk = uaConnect (&hConnect);

    if (!bIsOk) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaConnect: %d\r\n", uaGetLastError());
        return;
        }

    // Подключение к конкретному пользовательскому архиву...

    bIsOk = uaQueryArchiveByName (hConnect, ARCHIVE_NAME, &hArchive);
    if (!bIsOk) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaQueryArchiveByName: %d\r\n", uaGetLastError());
        return;
        }

    // Открытие пользовательского архива...

    bIsOk = uaArchiveOpen (hArchive);
    if (!bIsOk) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaArchiveOpen: %d\r\n", uaGetLastError());
        return;
        }  

    // Получение количества записей в пользовательском архиве...

    bIsOk = uaArchiveGetCount (hArchive, &nCount);
    nError = uaGetLastError();
    if (!bIsOk && (nError != 0)) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaArchiveGetCount: %d\r\n", nError);
        return;
        }

    // Если записей нет, дальнейшее выполнение фукнции бессмысленно

    if (nCount == 0) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Пользовательский архив %s пустой!\r\n", ARCHIVE_NAME);
        }
    else {

        // Перемещаем указатель записей на первую запись архива

        bIsOk = uaArchiveMoveFirst (hArchive);
        if (!bIsOk) {
           
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaArchiveMoveFirst: %d\r\n", uaGetLastError());
            return;
            }

        // Выводим значения всех полей в окно диагностики...
   
        for (i = 1; i <= nCount; i++) {

            // Читаем поле ID текущей записи...

            bIsOk = uaArchiveGetFieldValueLong (hArchive, ARCHIVE_ID_FIELD_NUMBER, &nIDFieldValue);

            if (!bIsOk) {
               
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaArchiveGetFieldValueLong: %d\r\n", uaGetLastError());
                return;
                }

            // Читаем поле содержащее плавающее значение...

            bIsOk = uaArchiveGetFieldValueFloat (hArchive, ARCHIVE_FLOAT_FIELD_NUMBER, &fFloatFieldValue);

            if (!bIsOk) {
               
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaArchiveGetFieldValueLong: %d\r\n", uaGetLastError());
                return;
                }

            // Читаем поле содержащее строку...

            bIsOk = uaArchiveGetFieldValueString (hArchive, ARCHIVE_STRING_FIELD_NUMBER, szStringFieldValue, STRING_FILED_SIZE);

            if (!bIsOk) {
               
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaArchiveGetFieldValueString: %d\r\n", uaGetLastError());
                return;
                }
   
            // Выводим в окно диагностики прочитанные значения...

           
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("%d: %f - %s\r\n", nIDFieldValue, fFloatFieldValue, szStringFieldValue);

            // Переходим к следующей записи...

            if (i < nCount) {

                bIsOk = uaArchiveMoveNext (hArchive);

                if (!bIsOk) {
                   
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaArchiveMoveNext: %d\r\n", uaGetLastError());
                    return;
                    }
                }
            }
        }      

    // Закрываем пользовательский архив...

    bIsOk = uaArchiveClose (hArchive);

    if (!bIsOk) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaArchiveClose: %d\r\n", uaGetLastError());
        return;
        }  

    // Закрываем подключение к пользовательскому архиву...

    bIsOk = uaReleaseArchive (hArchive);

    if (!bIsOk) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaReleaseArchive: %d\r\n", uaGetLastError());
        return;
        }

    // Отключаемся от среды исполнения пользовательских архивов...

    bIsOk = uaDisconnect (hConnect);

    if (!bIsOk) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaDisconnect: %d\r\n", uaGetLastError());
        return;
        }
}



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

С: Запись значений в пользовательский архив (User Archive) WinCC

#20

Сообщение alex » 02 фев 2016, 22:10

/*
    (с) 2016 http://www.proasutp.com

    Функция-пример добавления новой записи в базу данных пользовательского архива (User Archive) WinCC.

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


#include "apdefap.h"

void UserArchiveWritingValues()
{
    #define ARCHIVE_NAME "UserArchiveName"

    #define ARCHIVE_ID_FIELD_NUMBER 0
    #define ARCHIVE_FLOAT_FIELD_NUMBER 1
    #define ARCHIVE_STRING_FIELD_NUMBER 2

    #define STRING_FILED_SIZE 255
   
    UAHCONNECT hConnect = 0;
    UAHARCHIVE hArchive = 0;
    BOOL bIsOk = FALSE;
   
    long nIDFieldValue = 0;
    float fFloatFieldValue = 0;
    char szStringFieldValue[STRING_FILED_SIZE+1] = "";

    // Подключение к среде исполнения пользовательских архивов...

    bIsOk = uaConnect (&hConnect);

    if (!bIsOk) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaConnect: %d\r\n", uaGetLastError());
        return;
        }

    // Подключение к конкретному пользовательскому архиву...

    bIsOk = uaQueryArchiveByName (hConnect, ARCHIVE_NAME, &hArchive);
    if (!bIsOk) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaQueryArchiveByName: %d\r\n", uaGetLastError());
        return;
        }

    // Открытие пользовательского архива...

    bIsOk = uaArchiveOpen (hArchive);
    if (!bIsOk) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaArchiveOpen: %d\r\n", uaGetLastError());
        return;
        }  

    // Перемещаемся к последней записи пользовательского архива...

    bIsOk = uaArchiveMoveLast (hArchive);
    if (!bIsOk) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaArchiveMoveLast: %d\r\n", uaGetLastError());
        return;
        }  

    // Получаем ID текущей записи пользовательского архива...

    bIsOk = uaArchiveGetFieldValueLong (hArchive, ARCHIVE_ID_FIELD_NUMBER, &nIDFieldValue);
    if (!bIsOk) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaArchiveGetFieldValueNumber: %d\r\n", uaGetLastError());
        return;
        }  

    // Начинаем формировать значения полей для новой записи пользовательского архива...

    // Устанавливаем следующий ID новой записи...

    nIDFieldValue++;
    bIsOk = uaArchiveSetFieldValueLong (hArchive, ARCHIVE_ID_FIELD_NUMBER, nIDFieldValue);
    if (!bIsOk) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaArchiveSetFieldValueLong: %d\r\n", uaGetLastError());
        return;
        }      

    // Записываем значение с плавающей точкой в соответствующее поле пользовательского арихва...

    fFloatFieldValue = 1.2345;
    bIsOk = uaArchiveSetFieldValueFloat (hArchive, ARCHIVE_FLOAT_FIELD_NUMBER, fFloatFieldValue);
    if (!bIsOk) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaArchiveSetFieldValueFloat: %d\r\n", uaGetLastError());
        return;
        }

    // Записываем строковое значение в соответствующее поле пользовательского арихва...

   
strcpy
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
(szStringFieldValue, "Добро пожаловать на форум forum.proasutp.com!");
    bIsOk = uaArchiveSetFieldValueString (hArchive, ARCHIVE_STRING_FIELD_NUMBER, szStringFieldValue);
    if (!bIsOk) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaArchiveSetFieldValueString: %d\r\n", uaGetLastError());
        return;
        }

    // Вставляем новую запись в пользовательский арихв...

    bIsOk = uaArchiveInsert (hArchive);
    if (!bIsOk) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaArchiveInsert: %d\r\n", uaGetLastError());
        return;
        }

    // Закрываем пользовательский архив...

    bIsOk = uaArchiveClose (hArchive);

    if (!bIsOk) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaArchiveClose: %d\r\n", uaGetLastError());
        return;
        }  

    // Закрываем подключение к пользовательскому архиву...

    bIsOk = uaReleaseArchive (hArchive);

    if (!bIsOk) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaReleaseArchive: %d\r\n", uaGetLastError());
        return;
        }

    // Отключаемся от среды исполнения пользовательских архивов...

    bIsOk = uaDisconnect (hConnect);

    if (!bIsOk) {
       
printf
Чтобы увидеть ссылку зарегистрируйтесь или войдите под своим логином.
("Ошибка вызова uaDisconnect: %d\r\n", uaGetLastError());
        return;
        }
}




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

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