- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
WinCC скрипт
Модератор: Глоб.модераторы
-
- здесь недавно
- Сообщения: 20
- Зарегистрирован: 01 авг 2016, 07:36
- Имя: С. О. Ю.
WinCC скрипт
Добрый день!
Подскажите пожалуйста, так как в WinCC и программировании слаба. В общем есть такие свойства у тега как статус и код качества. Очень просто они устанавливаются в Dinamic Dialog, а вот как все это реализовать на C-Action. Ну допустим при значении тега - Status -Adressing error объект допустим раскрашивался в красный цвет, а при качестве кода Quality Code - not connected - в желтый. Как такое реализовать? Заранее спасибо!
Подскажите пожалуйста, так как в WinCC и программировании слаба. В общем есть такие свойства у тега как статус и код качества. Очень просто они устанавливаются в Dinamic Dialog, а вот как все это реализовать на C-Action. Ну допустим при значении тега - Status -Adressing error объект допустим раскрашивался в красный цвет, а при качестве кода Quality Code - not connected - в желтый. Как такое реализовать? Заранее спасибо!
-
- частый гость
- Сообщения: 409
- Зарегистрирован: 20 ноя 2012, 13:45
- Имя: :.О.N.Ф
- Страна: Россия
- Благодарил (а): 3 раза
- Поблагодарили: 7 раз
WinCC скрипт
Возьмите любое свойство, у которого настроен динамик диалог, нажмите на него правой кнопкой мыши, выберите 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])];
}
«Сразу видно внимание к каждой мелочи, неиспорченным не осталось ничто».
-
- здесь недавно
- Сообщения: 20
- Зарегистрирован: 01 авг 2016, 07:36
- Имя: С. О. Ю.
WinCC скрипт
Спасибо! А не подскажете тогда где можно почитать по этой функции statusValue[CheckLimitStatusQC.... да и вообще по функциям что WinCC использует.
-
- частый гость
- Сообщения: 409
- Зарегистрирован: 20 ноя 2012, 13:45
- Имя: :.О.N.Ф
- Страна: Россия
- Благодарил (а): 3 раза
- Поблагодарили: 7 раз
WinCC скрипт
Подскажу где про них почитать - справка, поиск :) И там гораздо интереснее всё, когда более одного тега и несколько лимитов)
Код: Выделить всё
#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".
«Сразу видно внимание к каждой мелочи, неиспорченным не осталось ничто».
-
- здесь недавно
- Сообщения: 20
- Зарегистрирован: 01 авг 2016, 07:36
- Имя: С. О. Ю.
-
- здесь недавно
- Сообщения: 20
- Зарегистрирован: 01 авг 2016, 07:36
- Имя: С. О. Ю.
WinCC скрипт
Еще вопросик возник! Вообще по функционалу 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. Возможно ли такое реализовать? Заранее спасибо
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. Возможно ли такое реализовать? Заранее спасибо
-
- завсегдатай
- Сообщения: 524
- Зарегистрирован: 05 окт 2009, 11:51
- Имя: Тихомиров Дмитрий Викторович
- Страна: Россия
- город/регион: Москва
- Благодарил (а): 17 раз
- Поблагодарили: 20 раз
WinCC скрипт
Как вариант, варианты значений для Б сделать тегами и два скрипта на изменение тега: При изменении тега А - то, что вы писали выше, но только не константы 10, 20, 30, а теги В1, В2, В3. При изменении тега Б - считать А и в зависимости от него перекладывает значение Б в В1, В2 или В3. Ну и третий скрипт на старт рантайма для инициализации В1, В2, В3. Топорно конечно, но профдеформация - stl накладывает отпечаток. :) Думаю, коллеги могут предложить более изящные решения.
-
- частый гость
- Сообщения: 409
- Зарегистрирован: 20 ноя 2012, 13:45
- Имя: :.О.N.Ф
- Страна: Россия
- Благодарил (а): 3 раза
- Поблагодарили: 7 раз
WinCC скрипт
А вы полностью логику-то расскажите. После ввода значения вручную оно совсем навсегда остаётся таким? Или только пока А не зименилось?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);
«Сразу видно внимание к каждой мелочи, неиспорченным не осталось ничто».
-
- здесь недавно
- Сообщения: 20
- Зарегистрирован: 01 авг 2016, 07:36
- Имя: С. О. Ю.
WinCC скрипт
Смысл такой: А- это состояние датчиков, В - это состояние всего устройства исходя из состояния датчиков, но диспетчер может допустим отправить это устройство например в "ремонт", это как раз и будет то значение, которое будет В присваиваться вручную, но если состояние датчиков А вновь поменяется, то В снова переписывается исходя из состояния датчиков А и будет храниться до тех пор пока вновь не изменится А либо диспетчер не отправит снова допустим в "ремонт" или еще куда. Вот как то так. К сожалению, нижний уровень переделывать не дадут и скорее всего А и B там тоже в логике контроллера участвуют, раньше была другая скада, теперь переводится на WinCC вот и возникают такие вопросы.А вы полностью логику-то расскажите. После ввода значения вручную оно совсем навсегда остаётся таким? Или только пока А не зименилось?
-
- частый гость
- Сообщения: 409
- Зарегистрирован: 20 ноя 2012, 13:45
- Имя: :.О.N.Ф
- Страна: Россия
- Благодарил (а): 3 раза
- Поблагодарили: 7 раз
WinCC скрипт
Тогда самое простое - где-нибудь сохранять предыдущее состояние тега А. Сравнивать его каждый раз с текущим - если совпадают, то ничего не делать, если разные - перезаписать В, сохранить А. Где сохранять - вариантов масса, у нас в таком случае используются CustomizedObject'ы (типа "группы", только выглядит как один объект), можно завести Internal Tag (мне такое чуть меньше нравится), ещё неплохой вариант сохранять в User Arhive'ы (но там кода много и они, бывает, отваливаются :) ), а можно хоть в файл, хоть в БД писать (вариант для особых извращенцев ).
«Сразу видно внимание к каждой мелочи, неиспорченным не осталось ничто».
-
- здесь недавно
- Сообщения: 20
- Зарегистрирован: 01 авг 2016, 07:36
- Имя: С. О. Ю.
WinCC скрипт
Всем спасибо огромное за помощь! Решила следующим способом: повесила событие на открытие кадра где присвоила тегу из Internal Tag значение С=1, далее на I/O Field на событие по изменению параметра А навесила всю необходимую логику, а в начале вписала условие if (GetTagBit("С")==0) , то выполняем ряд действий (соответственно при инициализации этой страницы и при запуске WinCC в это условие не попадаем и перезапись значений происходить не будет), в конце же кода присваиваю С=0, что соответственно приведет при изменении параметра А к выполнению необходимой логики. Вот как-то так:) Наверное как-то топорно, но пока как умею :)
-
- частый гость
- Сообщения: 409
- Зарегистрирован: 20 ноя 2012, 13:45
- Имя: :.О.N.Ф
- Страна: Россия
- Благодарил (а): 3 раза
- Поблагодарили: 7 раз
WinCC скрипт
нипанятнааа... Это работает?
Я бы не обрадовался, попади ко мне такой проект) У вас получилось так, что логика размазана - никаких явных признаков того, что с IOField'ом что-то делается в обработчике открытия окна, кроме чуйки.
мм, вы же понимаете, что инициализация страницы это OnPictureOpen()? И выполняется каждый раз при открытии PDL'ки в каждом (== любом) окне. А при закрытой пдльке никакие скрипты с неё не выполняются.при инициализации этой страницы и при запуске WinCC
Я бы не обрадовался, попади ко мне такой проект) У вас получилось так, что логика размазана - никаких явных признаков того, что с IOField'ом что-то делается в обработчике открытия окна, кроме чуйки.
«Сразу видно внимание к каждой мелочи, неиспорченным не осталось ничто».
-
- здесь недавно
- Сообщения: 20
- Зарегистрирован: 01 авг 2016, 07:36
- Имя: С. О. Ю.
WinCC скрипт
Всё верно, хоть меня и заверили что это окно будет одно единственное, но тоже считаю что такое решение не "айс". Буду дальше изучать пробовать:)мм, вы же понимаете, что инициализация страницы это OnPictureOpen()? И выполняется каждый раз при открытии PDL'ки в каждом (== любом) окне. А при закрытой пдльке никакие скрипты с неё не выполняются.