SIEMENS, DF&PD

Предыдущее посещение: Пн июн 13, 2016 10:06 Текущее время: Пн июн 13, 2016 10:06

Часовой пояс: UTC + 3 часа




 [ Сообщений: 19 ] 
Автор Сообщение
 Заголовок сообщения: Ошибка GSD, при получении значения тега
СообщениеДобавлено: Вт окт 02, 2012 23:57 
Не в сети
Известный Писатель

Зарегистрирован: Пн авг 10, 2009 22:04
Сообщения: 108
Здравствуйте специалисты.
Кто может подсказать в чем проблема? Где-то я туплю, однозначно...

вот такой код
Код:
char ResultTag [_MAX_PATH];      // переменная
char PreTag [30] = "State_err_code";   // постоянная часть тега

strcpy (ResultTag, (GetPropChar (lpszPictureName, lpszObjectName, "PrefixName")));   // получаем префикс custom-объекта "В данном примере префикс PMP_H1_"
strcat (ResultTag, PreTag);   // префикс+неизменная часть тега "Получается PMP_H1_STATE_ERR_CODE"

if (GetTagWord (ResultTag) & 0x400 == 1)   // проверка значения тега
   {
   return RGB (255, 0, 255);      // окрас в малиновый
   }
else
   {
   return RGB (145, 145, 145);   // окрас в серый
   }


вроде скрипт работает, НО global script diagnostic выдает вот-такую ошибку:

====================================OnErrorExecute====================================
SystemTime: (ThreadId 4560) 2012-10-02 20:35:06.383
dwErrorCode1: (ThreadId 4560) 1007006
dwErrorCode2: (ThreadId 4560) 0
szErrorText: (ThreadId 4560) Tag unknown, timeout or conversion failed
szApplicationName: (ThreadId 4560) PDLRuntimeSystem
bCycle: (ThreadId 4560) cycle
szFunctionName: (ThreadId 4560) @2aa
szTagName: (ThreadId 4560) "PMP_H1_State_err_code"
dwCycle: (ThreadId 4560) 1
szErrorTextTagName: (ThreadId 4560) Tag not exist
lpszPictureName: (ThreadId 4560) _START.VIEW:NSDR_REAGENT_DOSING
lpszObjectName: (ThreadId 4560) Motor03
lpszPropertyName: (ThreadId 4560) MotorBC
dwParamSize: (ThreadId 4560) 12
====================================OnErrorExecute====================================


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 03, 2012 11:56 
Не в сети
Известный Писатель

Зарегистрирован: Ср мар 28, 2007 8:50
Сообщения: 129
РАЗМЕР ИМЕЕТ ЗНАЧЕНИЕ
Цитата:
char PreTag [30] = "State_err_code"; // постоянная часть тега
...
strcat (ResultTag, PreTag); // префикс+неизменная часть тега "Получается PMP_H1_STATE_ERR_CODE"
...
szTagName: (ThreadId 4560) "PMP_H1_State_err_code"


Последний раз редактировалось Михайлов Максим Чт окт 04, 2012 8:59, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 03, 2012 15:52 
Не в сети
Известный Писатель

Зарегистрирован: Пн авг 10, 2009 22:04
Сообщения: 108
Не понял, а что с размером? Вроде все помещается.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 03, 2012 20:21 
Не в сети
Начинающий писатель

Зарегистрирован: Пн авг 22, 2005 14:05
Сообщения: 98
Откуда: г. Казань НПК "Волга-Автоматика"
PMP_H1_State_err_code
и
PMP_H1_STATE_ERR_CODE
это разные теги


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 03, 2012 20:26 
Не в сети
Начинающий писатель

Зарегистрирован: Пн авг 22, 2005 14:05
Сообщения: 98
Откуда: г. Казань НПК "Волга-Автоматика"
а что не так:

char ResultTag [_MAX_PATH]; // переменная
spritf(ResultTag, "%sState_err_code", GetPropChar (lpszPictureName, lpszObjectName, "PrefixName"));

//странная маска 0x400 для проверки с 1
//может так надо?
if (GetTagWord (ResultTag) & 0x400 <>0) // проверка значения тега
{
return RGB (255, 0, 255); // окрас в малиновый
}
else
{
return RGB (145, 145, 145); // окрас в серый
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт окт 04, 2012 11:07 
Не в сети
Известный Писатель

Зарегистрирован: Пн авг 10, 2009 22:04
Сообщения: 108
cias писал(а):
PMP_H1_State_err_code
и
PMP_H1_STATE_ERR_CODE
это разные теги


Спасибо cias.
Действительно имена разные, и при использовании PMP_H1_STATE_ERR_CODE - не ругается. Но забавно что даже при использовании имени PMP_H1_State_err_code - код работает. И что более забавно, в структуре тегов WinCC нельзя сделать тег "Aa" и "aa" одновременно, говорит есть такое имя. Я поэтому и думал, что нет значения как писать тег.
Потому что в других скриптах работает без ошибок, но там я использую готовую строку, а не формирую.

cias писал(а):
//странная маска 0x400 для проверки с 1

А что странного? 11-й бит, в слове в шестнадцатеричной системе счисления (HEX)? проверка по "И".
Или Вы имеете ввиду выражение "<>" и "=="... так это кто как привык.


Всем спасибо за помощь, тема закрыта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт окт 04, 2012 12:18 
Не в сети
Известный Писатель

Зарегистрирован: Пн янв 26, 2009 14:50
Сообщения: 147
Оператор & - это побитное 'И', следовательно выражение (GetTagWord (ResultTag) & 0x400) будет равняться либо 0, либо 0x400.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт окт 04, 2012 13:47 
Не в сети
Известный Писатель

Зарегистрирован: Пн авг 10, 2009 22:04
Сообщения: 108
kaa1979 писал(а):
Оператор & - это побитное 'И', следовательно выражение (GetTagWord (ResultTag) & 0x400) будет равняться либо 0, либо 0x400.

Да-ааааа, Вы чтоооо.
А у меня целый проект писан так и все работает.
Такой операцией я проверяю в данном случае 11-бит в слове на TRUE или FALSE. И независимо от того какое значение вообще имеет слово, если 11-бит имеет значение TRUE, то и все выражение будет иметь значение TRUE.
Прежде чем писать охинею (извините за грубость) проверили бы, для начала.
Код:
#define TAG_1 "QdwState"
   if ((GetTagDWord (TAG_1)) & 0x20)   // проверка bit 5, слова QdwState на TRUE
      return 0x0000FF00;      // цвет зеленый
   else
      return 0x00B6B6B6;      // возврат цвета

WinCC 7.0 UPD 4 - работает на ура.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт окт 04, 2012 15:29 
Не в сети
Известный Писатель

Зарегистрирован: Пн янв 26, 2009 14:50
Сообщения: 147
Для интерпретатора C FALSE - это значение, равное 0, а TRUE - не равное нулю, поэтому:
если GetTagWord (ResultTag) == 0x400, то
if (GetTagWord (ResultTag) & 0x400 == 1) вернет FALSE,
а
if ((GetTagDWord (TAG_1)) & 0x400) вернет TRUE.
поэтому
Цитата:
Прежде чем писать охинею (извините за грубость) проверили бы, для начала.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт окт 04, 2012 15:38 
Не в сети
Писатель со стажем

Зарегистрирован: Чт май 29, 2008 15:48
Сообщения: 985
Откуда: Минск
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт окт 04, 2012 17:02 
Не в сети
Известный Писатель

Зарегистрирован: Пн авг 10, 2009 22:04
Сообщения: 108
kaa1979 писал(а):
если GetTagWord (ResultTag) == 0x400, то
if (GetTagWord (ResultTag) & 0x400 == 1) вернет FALSE

Вы уверены в том, что Вы пишете???? Если уверены, предлагаю Вам для начала почитать ЭТУ статью, а конкретно раздел Побитовое И (AND)
По вашему получается (0x400 & 0x400 == 1) вернет FALSE????


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт окт 04, 2012 17:26 
Не в сети
Возможно это нечеловек

Зарегистрирован: Пн авг 15, 2011 9:44
Сообщения: 2232
Evolver писал(а):
По вашему получается (0x400 & 0x400 == 1) вернет FALSE????

(0x000 == 1) получается "?"
(0x400 == 1) получается "?"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт окт 04, 2012 17:27 
Не в сети
Известный Писатель

Зарегистрирован: Пн янв 26, 2009 14:50
Сообщения: 147
0x400 в двоичном виде 0000 0100 0000 0000.

0000 0100 0000 0000
И
0000 0100 0000 0000
равно
0000 0100 0000 0000

вообще
xxxx x1xx xxxx xxxx
И
0000 0100 0000 0000
равно
0000 0100 0000 0000, то есть 0x400, то есть 1024, поэтому
(0x400 & 0x400 == 1) вернет FALSE
а (0x400 & 0x400 == 1024) вернет TRUE.

Вы сами читали эту статью?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт окт 04, 2012 17:47 
Не в сети
Известный Писатель

Зарегистрирован: Пн авг 10, 2009 22:04
Сообщения: 108
kaa1979 писал(а):
xxxx x1xx xxxx xxxx
И
0000 0100 0000 0000
равно
0000 0100 0000 0000, то есть 0x400, то есть 1024

Тут вообще кто-нибудь читает что тут пишут??? Или все тихо ржут... :)
Уважаемый kaa1979.
Вам знакомо понятие Булева алгебра. Так вот РЕЗУЛЬТАТ СРАВНЕНИЯ не может быть 1024, результат сравнения двух чисел может быть либо 1 (TRUE) либо 0(FALSE)!
Таким образом хочу констатировать тот факт, что Вы заблуждаетесь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт окт 04, 2012 17:59 
Не в сети
Известный Писатель

Зарегистрирован: Пн авг 10, 2009 22:04
Сообщения: 108
proskur писал(а):
(0x000 == 1) получается "?"
(0x400 == 1) получается "?"

В приведенном Вами примере, результат в обоих случаях будет FALSE.

В моем же примере (0x400 & 0x400 == 1) результат будет TRUE, т.к операция сравнения будет выполняться последовательно.
Возможно понятнее будет так ( (0x400 & 0x400) == 1 )
Сначала сравнивается 0x400 с числом 0x400, а результат этого сравнения будет уже сравниваться с 1. Поэтому результат будет TRUE.
Можете проверить такую операцию с внутренним тегом в WinCC. Код по аналогии можно взять из моего (четвертого) поста.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт окт 04, 2012 18:09 
Не в сети
Известный Писатель

Зарегистрирован: Пн янв 26, 2009 14:50
Сообщения: 147
Вы кроме булевой алгебры что-нибудь изучали?
Результатом побитного И является число (комбинация бит), каждый бит которого является результатом булевой операции И соответствующих бит операндов. Если число 16-ти битное (как в примере), то и булевых операций 16.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт окт 04, 2012 19:46 
Не в сети
Писатель со стажем

Зарегистрирован: Пн май 16, 2005 7:41
Сообщения: 500
Откуда: Самара
Evolver писал(а):
Тут вообще кто-нибудь читает что тут пишут??? Или все тихо ржут... :)

Читают.... и тихо ржут. :)
Посмотрите, чем отличается Ваш первый и Ваш четвертый пост.
В Вашем примере, исходя из:
Код:
if (GetTagWord (ResultTag) & 0x400 == 1)   // проверка значения тега
   {
   return RGB (255, 0, 255);      // окрас в малиновый
   }

Неисправность малиновым цветом не отразится никогда. То есть оператору не будет показана неисправность насоса H1 (исходя из PMP_H1_STATE_ERR_CODE).
А что перекачивает насос Н1? Незамеченный останов насоса теплоносителя в каком-нибудь "большом котле" может привести к печальным последствиям......


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт окт 04, 2012 20:05 
Не в сети
Написал больше чем Вы читали

Зарегистрирован: Пт мар 04, 2011 23:01
Сообщения: 1089
Как бы ржущие сравнивают на 0 результат И-маскирования бита в слове
Цитата:
if ((GetTagWord (ResultTag) & 0x400) == 0) // проверка значения тега
{
return RGB (145, 145, 145); // окрас в серый
}
else
{
return RGB (255, 0, 255); // окрас в малиновый
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт окт 04, 2012 20:10 
Не в сети
Известный Писатель

Зарегистрирован: Пн авг 10, 2009 22:04
Сообщения: 108
Vasiliy писал(а):
(GetTagWord (ResultTag) & 0x400 == 1)
Неисправность малиновым цветом не отразится никогда.

Да согласен, тут я поторопился и впорол косяк, конечно же (GetTagWord (ResultTag) & 0x400) хотел коммент более подробный написать, но руки видимо опередили мысль, в четвертом посте вариант правильный
Vasiliy писал(а):
А что перекачивает насос

перекачивает воду из одного резервуара, в другой. И в проекте вариант правильный, проверил на всякий :)
Извините на кого наехал, просто нужно было сразу обратить внимание на то что я ошибся в первом посте, в четвертом-то ведь код правильный и рабочий. Зато повеселил всех :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
 [ Сообщений: 19 ] 

Часовой пояс: UTC + 3 часа


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

Сейчас этот форум просматривают: Yahoo [Bot] и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group