Любой скрипт есть пользовательская функция... Из любого скрипта можно вызвать любую объявленную функцию... А уж какие теги подвешены на входные параметры, и на какой тег подвешено возвращаемое значение - дело вашей фантазии.
Я по-прежнему не понимаю, зачем необходимо огромное кол-во скриптов, и тем более общий сигнал "ручной/автомат". У каждого механизма это должен быть свой сигнал.
Пару лет назад довелось писать блок-иконки и фейсплейты для аналогового канала и ПИД-регулятора. Скриптов внутри практически не было, а те что были - работали по событиям, в основном от пользователя (нажал на кнопку, поставил галочку, выбрал значение из списка и т.п.), поэтому систему вообще не нагружали. Вся остальная динамика работала через прямую привязку тегов к свойствам объектов.
Вопрос по тиражированию однотипных объектов в WinCC v14
-
- Posts: 374
- Joined: Wed Oct 13, 2010 8:44 am
- Location: Russian Federation
-
- Posts: 3
- Joined: Sat Oct 31, 2015 8:09 am
Re: Вопрос по тиражированию однотипных объектов в WinCC v14
Здравствуйте. У меня вопрос схожий с автором, правда я занялся wincc после wanderware intouch и часть функционала wincc мне не до конца понятна. Версия wincc классическая 7.4.
Например как сделать объект который состоит из пиктограммы, которая включает в себя ряд свойств. При нажатии на этот объект открывается вспылвающее окно с дополнительными параметрами. При этом на вход объекта я только подствляю начальный tagprefix.
Допустим объект датчик температуры, состоящий из IO field для отображения текущей величины, Circle который меняет цвет от комбинации двух тегов statusword и alarmword.
1) Я сделал faceplate type (.fpt) с параметрами, но при его вызове всеровно приходится на каждое событие писать либо скрипт либо подставлять прямой тег.
2) Делал через customizedObject там тоже самое выставляем параметры какие используются, но в итоге всеровно под каждый параметр необходимо вручную прописывать теги.
И в чем координальное различие между customizedObject и faceplate type?
Я имею ввиду есть ли функционал для объекта как для открываюшего окна с tagprefix, чтобы я вставил пикторграмму, прописал перед ним префикс DT1 и все остальные теги сами подгрузились как с тагпрефиксом.
Еще один вопрос про открывающееся окно с параметрами (faceplate) теги подргружаются через tagprefix все хорошо работает, но как я понял faceplate необходимо прогружать в заранее размещенное окно на странице. И если имеется 10 одинаковых объектов, то при открытии второго окно окажется тоже самое, просто информация подгрузится с другим tagprefix. Для решения этого я разместил 10 окон, создал внутренний тег с номером окна и сделал скрипт, который проверяет тег с номером окна и определяет в какое окно разметсить faceplate. При открытии окна скриптом увеличиваю номер окна. Этим я добился, что можно открыть 10 одинаковых faceplate для различных объектов. Но есть в этом и большой минус, что можно открыть один и тот же объект 10 раз да и выглядит это всё как мой костыль, как я понял если использовать wincc в составе PCS7, то там есть дополнительные возможности. Есть ли возможность не заморачиваться с количеством окон и дописывании своих скриптов для открытия большого количества окон-faceplate.
Вот прилагаю скриншот с проекта, который изучаю. Как видно при вставке fpt вручную прописывали для параметров скрипты, для изменения свойств.Внутри скриптов теги прописаны прямые.Хотя для данного экземпляра все теги начинаются FLT/A25/Pump422.
Так же в проекте который изучаю для открытия faceplate используется следующий скрипт. Имеется 10 окон TOP_WND1-TOP_WND10.
Т.е. они пошли тем же путем, что и я, просто написав более мощный скрипт.
Например как сделать объект который состоит из пиктограммы, которая включает в себя ряд свойств. При нажатии на этот объект открывается вспылвающее окно с дополнительными параметрами. При этом на вход объекта я только подствляю начальный tagprefix.
Допустим объект датчик температуры, состоящий из IO field для отображения текущей величины, Circle который меняет цвет от комбинации двух тегов statusword и alarmword.
1) Я сделал faceplate type (.fpt) с параметрами, но при его вызове всеровно приходится на каждое событие писать либо скрипт либо подставлять прямой тег.
2) Делал через customizedObject там тоже самое выставляем параметры какие используются, но в итоге всеровно под каждый параметр необходимо вручную прописывать теги.
И в чем координальное различие между customizedObject и faceplate type?
Я имею ввиду есть ли функционал для объекта как для открываюшего окна с tagprefix, чтобы я вставил пикторграмму, прописал перед ним префикс DT1 и все остальные теги сами подгрузились как с тагпрефиксом.
Еще один вопрос про открывающееся окно с параметрами (faceplate) теги подргружаются через tagprefix все хорошо работает, но как я понял faceplate необходимо прогружать в заранее размещенное окно на странице. И если имеется 10 одинаковых объектов, то при открытии второго окно окажется тоже самое, просто информация подгрузится с другим tagprefix. Для решения этого я разместил 10 окон, создал внутренний тег с номером окна и сделал скрипт, который проверяет тег с номером окна и определяет в какое окно разметсить faceplate. При открытии окна скриптом увеличиваю номер окна. Этим я добился, что можно открыть 10 одинаковых faceplate для различных объектов. Но есть в этом и большой минус, что можно открыть один и тот же объект 10 раз да и выглядит это всё как мой костыль, как я понял если использовать wincc в составе PCS7, то там есть дополнительные возможности. Есть ли возможность не заморачиваться с количеством окон и дописывании своих скриптов для открытия большого количества окон-faceplate.
Вот прилагаю скриншот с проекта, который изучаю. Как видно при вставке fpt вручную прописывали для параметров скрипты, для изменения свойств.Внутри скриптов теги прописаны прямые.Хотя для данного экземпляра все теги начинаются FLT/A25/Pump422.
Так же в проекте который изучаю для открытия faceplate используется следующий скрипт. Имеется 10 окон TOP_WND1-TOP_WND10.
Т.е. они пошли тем же путем, что и я, просто написав более мощный скрипт.
Spoiler
Show
Code: Select all
// Fonction: La fonction ouvre la vue type de l'équipement selon les paramètres lpszBlocType
#include "apdefap.h"
char *MInterface_OpenBlockPicture(char *lpszPictureName, char *lpszObjectName)
{
#define FCT_NAME "MInterface_OpenBlockPicture"
#define MAX_WINDOW_OPENED 10
long screen = 0;
char szBasePicture[256] = "";
char *psz = NULL;
long i = 0;
char szPictureWindowName[256] = "";
char *pszBlocType = NULL;
char *pszWindowTitle = NULL;
char *pszComment = NULL;
char *pszTagPrefix = NULL;
char szPicturePath[256] = "";
BOOL bWindowOK = FALSE;
char szWindowTagPrefix[256] = "";
char szTagPrfx[256] = "";
long StarterType = 0;
BOOL bHasStarterType = FALSE;
char StarterTypeObjects[21][256] = {"M_Motor", "M_Motor_State", "M_Motor_Pump", "M_PumpC", "M_PUMP1","M_PumpCNew", "M_MagnSep",
"M_Pump", "M_BlowerX3", "M_FCELL", "M_BlowerX1", "M_PUMP0", "M_Pump5",
"M_Deslimer", "M_AGITATOR", "M_FCELL","M_FEEDER_STATE1","M_SCREEN","M_Fan_State","M_ROUGHER","M_FAN"};
int k = 0;
static char szRetValue[256] = "";
char *pszObjectType = GetPropChar(lpszPictureName, lpszObjectName, "FaceplateType");
//printf("\r\n%s: Object Type = %s", FCT_NAME, pszObjectType);
//screen = MInterface_GetScreen(lpszPictureName); //Return-Type: long int
pszBlocType = GetPropChar(lpszPictureName, lpszObjectName, "BlocTypeText");
strcpy(szRetValue, "");
strncpy(szBasePicture, lpszPictureName, sizeof(szBasePicture)-1);
psz = strstr(szBasePicture, "MINT_WORK");
if (psz)
{
psz += strlen("MINT_WORK");
*(psz) = '\0';
//printf("\r\n%s:: szBasePicture = %s", FCT_NAME, szBasePicture);
for (i = 1; i<MAX_WINDOW_OPENED; i++)
{
sprintf(szPictureWindowName, "TOP_WND%d", i);
//printf("\r\n%s:: szPictureWindowName (%d)= %s", FCT_NAME, i,szPictureWindowName);
if (FALSE == GetVisible (szBasePicture, szPictureWindowName))
{
//printf("\r\n%s:: Window available = %s", FCT_NAME, szPictureWindowName);
// SetTagPrefix(szBasePicture, szPictureWindowName, "");
SetPictureName ( szBasePicture, szPictureWindowName, pszBlocType);
SetVisible (szBasePicture, szPictureWindowName, TRUE);
// Positionner les propriétés intrinsèques à la fenêtre
// Récupération du chemin complet de la vue affichée dans la fenêtre de vue
strncpy(szPicturePath, szBasePicture, sizeof(szPicturePath)-1);
strncat(szPicturePath, ".", sizeof(szPicturePath)-1);
strncat(szPicturePath, szPictureWindowName, sizeof(szPicturePath)-1);
strncat(szPicturePath, ":", sizeof(szPicturePath)-1);
strncat(szPicturePath, pszBlocType, sizeof(szPicturePath)-1);
strncpy(szRetValue, szPicturePath, sizeof(szRetValue)-1);
//printf("\r\n%s:: szPicturePath= %s", FCT_NAME, szPicturePath);
// Tag Prefix
if (1==GetPropBOOL(lpszPictureName, lpszObjectName, "FullTagPrefix"))
{
// TAG Prefix: Cas standard
pszTagPrefix = GetPropChar(lpszPictureName, lpszObjectName, "TagPrefix");
if (!StringIsNullOrEmpty(pszTagPrefix))
strncpy(szTagPrfx, pszTagPrefix , sizeof(szTagPrfx)-1);
if (0 == strncmp(szTagPrfx, "NOTP", 4))
szTagPrfx[0] = '\0';
}
else
{
// TAG Prefix: Cas ou on est dans une fenetre de vue:
STD_GetPictureTagPrefix(lpszPictureName,szWindowTagPrefix,sizeof(szWindowTagPrefix)-1); //Return-Type: BOOL
if (!StringIsNullOrEmpty(szWindowTagPrefix))
{
char *pszObjectPrfx = GetTagPrefix(lpszPictureName, lpszObjectName);
strncpy(szTagPrfx, szWindowTagPrefix, sizeof(szTagPrfx)-1);
if (!StringIsNullOrEmpty(pszObjectPrfx))
strncat(szTagPrfx, pszObjectPrfx, sizeof (szTagPrfx)-1);
}
}
// Starting Mode for Motor Objects
for (k=0;k<21;k++)
{
//printf("\r\n StarterTypeObjects[%d] = %s", k, StarterTypeObjects[k]);
if (strstr(pszBlocType, StarterTypeObjects[k]))
{
bHasStarterType = TRUE;
break;
}
}
if (bHasStarterType) StarterType = (long)GetPropDouble (lpszPictureName, lpszObjectName,"StarterType");
//printf("\r\n%s: TagPrefix = %s", FCT_NAME, szTagPrfx);
//printf("\r\n%s: has starter type = %d", FCT_NAME, bHasStarterType);
// printf("\r\n%s: ObjectFound (k-1=%d) = %s", FCT_NAME, k, StarterTypeObjects[k-1]);
// Window Title
//pszWindowTitle = GetPropChar( lpszPictureName, lpszObjectName, "Tag");
pszWindowTitle = szTagPrfx;
if (pszWindowTitle)
{
SetPropChar(szBasePicture, szPictureWindowName, "CaptionText", pszWindowTitle);
}
else
{
SetPropChar(szBasePicture, szPictureWindowName, "CaptionText", "Error while getting tag");
}
// Value comment
//pszComment = GetPropChar(lpszPictureName, lpszObjectName, "Comment");
pszComment = szTagPrfx;
if (pszComment == NULL)
{
SetPropChar(szPicturePath, "txtComment", "Text", " - ");
}
else
{
SetPropChar(szPicturePath, "txtComment", "Text", pszComment);
}
// Starting Mode for Motor Objects
if (bHasStarterType) SetOutputValueDouble(szPicturePath, "txtListStarterType", StarterType);
//
SetText(szPicturePath, "txtTagPrefix", szTagPrfx);
//printf("\r\n%s: pszBlocType = %s", FCT_NAME, pszBlocType);
if (strstr(pszBlocType, "M_Analog") || strstr(pszBlocType, "M_AO"))
{
LINKINFO Info;
SetText(szPicturePath, "txtUnit", GetPropChar(lpszPictureName, lpszObjectName, "Unit"));
if (!GetLink(lpszPictureName, lpszObjectName, "OutputValue", &Info))
printf("\r\n%s: Error with GetLink Function", FCT_NAME);
else
{
printf("\r\n%s: LinkName = %s", FCT_NAME, Info.szLinkName);
SetText(szPicturePath, "txtTag", Info.szLinkName);
}
}
SetVisible(szPicturePath, "WIN_STD", FALSE);
SetPropChar(szPicturePath, "WIN_STD", "TagPrefix", szTagPrfx);
SetVisible(szPicturePath, "WIN_STD", TRUE);
bWindowOK = TRUE;
}
if (bWindowOK)
break;
}
}
//printf("\r\n%s: End___", FCT_NAME);
return szRetValue;
}
-
- Posts: 202
- Joined: Wed Mar 19, 2008 1:12 pm
- Location: Ukraine
Re: Вопрос по тиражированию однотипных объектов в WinCC v14
нашел тут свою старую тему и решил продолжить, вопрос тот же, но относительно Proffesional - тиражирование
в этом видео https://www.youtube.com/watch?v=0pZrfPW0tbQ&t=1118s
все понятно, но не нравится, что нужно вставлять на Screen несколько Screen_Window (время видео - 23:20) - для открытия нескольких окон. Подскажите, возможно есть еще варианты для тиражирования
PS. В Advenced использовал POP с Faceplate - минуса два - только одно окно можно открыть одновременно и его в рантайме нельзя было таскать по экрану
в этом видео https://www.youtube.com/watch?v=0pZrfPW0tbQ&t=1118s
все понятно, но не нравится, что нужно вставлять на Screen несколько Screen_Window (время видео - 23:20) - для открытия нескольких окон. Подскажите, возможно есть еще варианты для тиражирования
PS. В Advenced использовал POP с Faceplate - минуса два - только одно окно можно открыть одновременно и его в рантайме нельзя было таскать по экрану