Профиль должен быть заполнен на русском языке кириллицей. Заполнение профиля заведомо ложными или некорректными данными - причина возможного отказа в регистрации на форуме.

WinCC скрипт


Автор темы
Digitex
здесь недавно
здесь недавно
Сообщения: 14
Зарегистрирован: 01 авг 2016, 07:36
Ф.И.О.: С. О. Ю.

WinCC скрипт

Сообщение Digitex » 01 авг 2016, 07:49

Добрый день!
Подскажите пожалуйста, так как в WinCC и программировании слаба. В общем есть такие свойства у тега как статус и код качества. Очень просто они устанавливаются в Dinamic Dialog, а вот как все это реализовать на C-Action. Ну допустим при значении тега - Status -Adressing error объект допустим раскрашивался в красный цвет, а при качестве кода Quality Code - not connected - в желтый. Как такое реализовать? Заранее спасибо!

Аватара пользователя

Exactamente
частый гость
частый гость
Сообщения: 409
Зарегистрирован: 20 ноя 2012, 12:45
Ф.И.О.: :.О.N.Ф
Благодарил (а): 3 раза
Поблагодарили: 3 раза

WinCC скрипт

Сообщение Exactamente » 01 авг 2016, 14:58

Возьмите любое свойство, у которого настроен динамик диалог, нажмите на него правой кнопкой мыши, выберите C-Script, нажмите ОК. Динамик диалог преобразуется в равнозначный скрипт. Изучайте.

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

#include "apdefap.h"
 BOOL _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 2
#define TAG_1 "Tyt_imya_vashego_taga_iz_DynamicDialoga"
// WINCC:TAGNAME_SECTION_END

// WINCC:PICNAME_SECTION_START
// syntax: #define PicNameInAction "PictureName"
// next PicID : 1
// WINCC:PICNAME_SECTION_END

static double limitValue[1] = {100.00000000000000,};
static long statusValue[15] = {16777166,16777166,16777166,16777166,16777166,16777166,16777166,16777166,255,16777166,16777166,16777166,16777166,16777166,16777166,};
return statusValue[CheckLimitStatusQC (2,TAG_1, 14, 1,&limitValue[0])];

}
«Сразу видно внимание к каждой мелочи, неиспорченным не осталось ничто».


Автор темы
Digitex
здесь недавно
здесь недавно
Сообщения: 14
Зарегистрирован: 01 авг 2016, 07:36
Ф.И.О.: С. О. Ю.

WinCC скрипт

Сообщение Digitex » 02 авг 2016, 09:29

Спасибо! А не подскажете тогда где можно почитать по этой функции statusValue[CheckLimitStatusQC.... да и вообще по функциям что WinCC использует.

Аватара пользователя

Exactamente
частый гость
частый гость
Сообщения: 409
Зарегистрирован: 20 ноя 2012, 12:45
Ф.И.О.: :.О.N.Ф
Благодарил (а): 3 раза
Поблагодарили: 3 раза

WinCC скрипт

Сообщение Exactamente » 02 авг 2016, 13:11

Подскажу где про них почитать - справка, поиск :) И там гораздо интереснее всё, когда более одного тега и несколько лимитов)

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

#include "apdefap.h"
 long _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 3
#define TAG_1 "zdes_tag"
#define TAG_2 "i_tyt_ewe_odin"
// WINCC:TAGNAME_SECTION_END

// WINCC:PICNAME_SECTION_START
// syntax: #define PicNameInAction "PictureName"
// next PicID : 1
// WINCC:PICNAME_SECTION_END

// Return value
int index;

// Tag
unsigned long var1;
unsigned long var2;

// Expression
double expression;

// Status values
unsigned long status[2];
unsigned long quality[2];
int statExist = -1;
static int nItemsStatus = 14;
static long statusValue[2*14] = {8388608,8388608,8388608,8388608,8388608,8388608,8388608,8388608,8388608,8388608,8388608,8388608,8388608,255,
8388608,8388608,8388608,8388608,8388608,8388608,8388608,8388608,8388608,8388608,8388608,8388608,8388608,8388608,
};


// Value range limits
static double limitValue[4] = {100.00000000000000,200.00000000000000,300.00000000000000,400.00000000000000};
static long value[5] = {8388608,8388608,8388608,8388608,8388608};

// Read values
var1 = (unsigned long)GetTagDoubleStateQC (TAG_1,&status[0],&quality[0]);
GetTagDoubleStateQC (TAG_1,&status[0],&quality[0]);
var2 = (unsigned long)GetTagDoubleStateQC (TAG_2,&status[1],&quality[1]);
GetTagDoubleStateQC (TAG_2,&status[1],&quality[1]);

// Call of the status check function
statExist = Check_StatusExQC (1, nItemsStatus, 2, &status[0], &quality[0]);
if (statExist != -1) return statusValue[statExist];

// Expression to be monitored
expression = var1 && var2;

// Call of the check function
index = Check_LimitsD (expression, 5, &limitValue[0]);

return value[index];

}


Function

Determines the value of a tag of data type "64-bit floating point value". In addition, the status and the quality code of the tags are returned.

Syntax

double GetTagDoubleStateQC(Tag Tag_Name, PDWORD lp_dwstate, PDWORD pdwQualityCode);

Parameters

Tag_Name

Name of the tag.

lp_dwstate

Pointer to a DWORD in which the status of the tag is stored after the function has been completed.

pdwQualityCode

Pointer to a DWORD in which the quality code of the tag is stored after the function is complete.

Return value

Value of the tag in the data type "double".
«Сразу видно внимание к каждой мелочи, неиспорченным не осталось ничто».


Автор темы
Digitex
здесь недавно
здесь недавно
Сообщения: 14
Зарегистрирован: 01 авг 2016, 07:36
Ф.И.О.: С. О. Ю.

WinCC скрипт

Сообщение Digitex » 03 авг 2016, 05:57

Спасибо! Буду разбираться)


Автор темы
Digitex
здесь недавно
здесь недавно
Сообщения: 14
Зарегистрирован: 01 авг 2016, 07:36
Ф.И.О.: С. О. Ю.

WinCC скрипт

Сообщение Digitex » 04 авг 2016, 13:33

Еще вопросик возник! Вообще по функционалу WinCC реально ли такое сделать- имеем переменную А (считываем в нее значение с контроллера- например значения 1,2,3), имеем переменную Б(в зависимости от значения переменной А в переменную Б присваевается знчение 10,20,30 соответственно )
void OnObjectChanged(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
if (GetTagWord("A")==1)
SetTagWord("B",10);
if (GetTagWord("A")==2)
SetTagWord("B",20);
if (GetTagWord("A")==3)
SetTagWord("B",30);
}
при этом также в переменную Б я могу записать любое значение с поля ввода- вывода. Так вот - если допустим А=2, Б присвоилось 20,но позже Б вручную прописали 100, то при смене кадра или при перезагрузке wincc значение переменной Б сбрасывается в 20, а должно остаться 100. Возможно ли такое реализовать? Заранее спасибо

Аватара пользователя

Marrenoloth
частый гость
частый гость
Сообщения: 489
Зарегистрирован: 05 окт 2009, 10:51
Ф.И.О.: Тихомиров Дмитрий Викторович
Откуда: Москва
Благодарил (а): 13 раз
Поблагодарили: 17 раз
Контактная информация:

WinCC скрипт

Сообщение Marrenoloth » 04 авг 2016, 14:24

Как вариант, варианты значений для Б сделать тегами и два скрипта на изменение тега: При изменении тега А - то, что вы писали выше, но только не константы 10, 20, 30, а теги В1, В2, В3. При изменении тега Б - считать А и в зависимости от него перекладывает значение Б в В1, В2 или В3. Ну и третий скрипт на старт рантайма для инициализации В1, В2, В3. Топорно конечно, но профдеформация - stl накладывает отпечаток. :) Думаю, коллеги могут предложить более изящные решения.

Аватара пользователя

Exactamente
частый гость
частый гость
Сообщения: 409
Зарегистрирован: 20 ноя 2012, 12:45
Ф.И.О.: :.О.N.Ф
Благодарил (а): 3 раза
Поблагодарили: 3 раза

WinCC скрипт

Сообщение Exactamente » 04 авг 2016, 15:48

Digitex писал(а):Источник цитаты при этом также в переменную Б я могу записать любое значение с поля ввода- вывода. Так вот - если допустим А=2, Б присвоилось 20,но позже Б вручную прописали 100, то при смене кадра или при перезагрузке wincc значение переменной Б сбрасывается в 20, а должно остаться 100. Возможно ли такое реализовать? Заранее спасибо


А вы полностью логику-то расскажите. После ввода значения вручную оно совсем навсегда остаётся таким? Или только пока А не зименилось?

Я бы вообще предложил сделать рядом с полем ввода чекбокс для разрешения ручной подстановки, его завязать на Operation-enabled IOField'a. Во-первых, это даёт явно понять оператору - автоматически тут значение установлено или кто-то зачем-то поменял вручную, во-вторых, это удобно использовать в скрипте. Когда чекбокс отмечен - в IOField можно ввести значение вручную. А в вашем скрипте читаете это свойство - если оно enabled (то есть TRUE == GetPropBOOL(lpszPictureName, lpszObjectName, "Operation")), то не ничего меняем, если FALSE, то выполняется ваш код.

Ещё костыльный вариант, который подойдёт при условии, что когда у вас, например, А == 1, никто в В не поставит 20 или 30 (соответствующие А == 2 или А == 3).

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

if (GetTagWord("A")==1 && (GetTagWord("B")==20 || GetTagWord("B")==30))
SetTagWord("B",10);
else if (GetTagWord("A")==2 && (GetTagWord("B")==10 || GetTagWord("B")==30))
SetTagWord("B",10);
else if (GetTagWord("A")==3 && (GetTagWord("B")==10 || GetTagWord("B")==20))
SetTagWord("B",10);


Смысл в том, что если у нас в В стоит автоматич. значение - то при изменении А автоматом продолжаем менять тег В, если какое-то другое, значит его кто-то установил вручную, тогда не переустанавливаем. Но с точки зрения людей, которые этим будут пользоваться и т.з. кода, лучше так не делать, потому что будем иметь некрасивое неявное поведение.
«Сразу видно внимание к каждой мелочи, неиспорченным не осталось ничто».


Автор темы
Digitex
здесь недавно
здесь недавно
Сообщения: 14
Зарегистрирован: 01 авг 2016, 07:36
Ф.И.О.: С. О. Ю.

WinCC скрипт

Сообщение Digitex » 04 авг 2016, 18:49

А вы полностью логику-то расскажите. После ввода значения вручную оно совсем навсегда остаётся таким? Или только пока А не зименилось?


Смысл такой: А- это состояние датчиков, В - это состояние всего устройства исходя из состояния датчиков, но диспетчер может допустим отправить это устройство например в "ремонт", это как раз и будет то значение, которое будет В присваиваться вручную, но если состояние датчиков А вновь поменяется, то В снова переписывается исходя из состояния датчиков А и будет храниться до тех пор пока вновь не изменится А либо диспетчер не отправит снова допустим в "ремонт" или еще куда. Вот как то так. К сожалению, нижний уровень переделывать не дадут и скорее всего А и B там тоже в логике контроллера участвуют, раньше была другая скада, теперь переводится на WinCC вот и возникают такие вопросы.

Аватара пользователя

Exactamente
частый гость
частый гость
Сообщения: 409
Зарегистрирован: 20 ноя 2012, 12:45
Ф.И.О.: :.О.N.Ф
Благодарил (а): 3 раза
Поблагодарили: 3 раза

WinCC скрипт

Сообщение Exactamente » 05 авг 2016, 11:47

Тогда самое простое - где-нибудь сохранять предыдущее состояние тега А. Сравнивать его каждый раз с текущим - если совпадают, то ничего не делать, если разные - перезаписать В, сохранить А. Где сохранять - вариантов масса, у нас в таком случае используются CustomizedObject'ы (типа "группы", только выглядит как один объект), можно завести Internal Tag (мне такое чуть меньше нравится), ещё неплохой вариант сохранять в User Arhive'ы (но там кода много и они, бывает, отваливаются :) ), а можно хоть в файл, хоть в БД писать (вариант для особых извращенцев :crazy0to: ).
«Сразу видно внимание к каждой мелочи, неиспорченным не осталось ничто».


Автор темы
Digitex
здесь недавно
здесь недавно
Сообщения: 14
Зарегистрирован: 01 авг 2016, 07:36
Ф.И.О.: С. О. Ю.

WinCC скрипт

Сообщение Digitex » 05 авг 2016, 14:25

Всем спасибо огромное за помощь! Решила следующим способом: повесила событие на открытие кадра где присвоила тегу из Internal Tag значение С=1, далее на I/O Field на событие по изменению параметра А навесила всю необходимую логику, а в начале вписала условие if (GetTagBit("С")==0) , то выполняем ряд действий (соответственно при инициализации этой страницы и при запуске WinCC в это условие не попадаем и перезапись значений происходить не будет), в конце же кода присваиваю С=0, что соответственно приведет при изменении параметра А к выполнению необходимой логики. Вот как-то так:) Наверное как-то топорно, но пока как умею :)

Аватара пользователя

Exactamente
частый гость
частый гость
Сообщения: 409
Зарегистрирован: 20 ноя 2012, 12:45
Ф.И.О.: :.О.N.Ф
Благодарил (а): 3 раза
Поблагодарили: 3 раза

WinCC скрипт

Сообщение Exactamente » 05 авг 2016, 16:05

нипанятнааа... Это работает?

при инициализации этой страницы и при запуске WinCC
мм, вы же понимаете, что инициализация страницы это OnPictureOpen()? И выполняется каждый раз при открытии PDL'ки в каждом (== любом) окне. А при закрытой пдльке никакие скрипты с неё не выполняются.

Я бы не обрадовался, попади ко мне такой проект) У вас получилось так, что логика размазана - никаких явных признаков того, что с IOField'ом что-то делается в обработчике открытия окна, кроме чуйки.
«Сразу видно внимание к каждой мелочи, неиспорченным не осталось ничто».


Автор темы
Digitex
здесь недавно
здесь недавно
Сообщения: 14
Зарегистрирован: 01 авг 2016, 07:36
Ф.И.О.: С. О. Ю.

WinCC скрипт

Сообщение Digitex » 05 авг 2016, 17:43

мм, вы же понимаете, что инициализация страницы это OnPictureOpen()? И выполняется каждый раз при открытии PDL'ки в каждом (== любом) окне. А при закрытой пдльке никакие скрипты с неё не выполняются.
Всё верно, хоть меня и заверили что это окно будет одно единственное, но тоже считаю что такое решение не "айс". Буду дальше изучать пробовать:)


Вернуться в «WinCC»



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей