This is topic Работа с рецептами через БД in forum TRACE MODE 6 бесплатная Базовая версия / TRACE MODE 6 free Base version at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/31/t/001326.html

Posted by dzukpp (Участник № / Member № 6383) on :
 
Добрый день.
Необходимо реализовать управление рецептами. Планирую использовать БД MSSQL Express 2008.
Сторонняя программа периодически будет класть в таблицу Orders заявки на приготовление бетона. Эта заявка содержит массу и марку бетона.
Для каждой марки существует несколько рецептов, который хранятся в таблице Recipes.

Хотелось бы на экране разместить таблицу, в которой были бы показаны текущие заявки (выборка из таблицы Orders).
При выборе в таблице нужной строки, должен выполниться другой запрос (выборка из таблице Recipes c подстановкой выбранной марки), в результате заполняется другая таблица с перечислением подходящих для данной марки бетона

рецептов.
Далее следует выбор нужного рецепта.


Изучил "Пример работы с рецептами из БД".
Я сделал компонент Связь_с_СУБД, запрос SELECT выбирает из БД актуальные заявки. Привязал аргумент экрана к аргументу канала CALL.SQLQuery. При передачи в атрибут "Входное значение" CALL.SQLQuery значения 1 запрос выполняется и

в атрибут экрана записывается текстовая строка из БД. Пока все хорошо.

Посмотрев видеурок "Обмен данными между SCADA TRACE MODE и СУБД по ODBC" решил повторить.
Создаю канал Call.ChGroupReq у него 10 аргументов типа STRING направление IN. Привязываю Реальное значение этого канала к аргументу канала CALL.SQLQuery.По идее в эти аргументы должны записываться результаты запроса. Но ничего не пишется, более того, перестало работать то что описал в предыдущем абзаце.


Вопросы
1. Правильно ли я описал механизм работы с запросами типа (SELECT table_name.title, table_name.value FROM table_name WHERE table_name.status = 0), если да то в чем может быть проблема почему не заполняются аргументы канала Call.ChGroupReq значениями из БД?
2. Есть ли возможность посмотреть значения аргументов канала, кроме как привязав к ним аргументы экрана?
3. Ув. техподдержка, не могли бы вы выслать проект из видеоурока "Обмен данными между SCADA TRACE MODE и СУБД по ODBC". Может я что-то упустил при просмотре.
4. С помощью каких ГЭ можно реализовать табличное представление данных об актуальных заявках и соответствующих им рецептам. Насколько я понял нечто похожее делает ГЭ "База данных". Может можно как-то сделать произвольную таблицу, заполняя ее из скрипта?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/52/t/000003.html/Пример работы с рецептами из БД/

Посмотрите, пожалуйста, этот пример.

Значения аргументов любого канала CALL можно в реальном времени увидеть через окно "Просмотр компонентов", если раскрыть его атрибут 124.
 
Posted by dzukpp (Участник № / Member № 6383) on :
 
quote:
Отправитель / Originally posted by AdAstra Technical Support:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/52/t/000003.html/Пример работы с рецептами из БД/

Посмотрите, пожалуйста, этот пример.

Этот пример я первым делом посмотрел. С ним все понятно.

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

Пробовал ГЭ База данных. Вроде бы рецепты показывает. Но есть 2 проблемы:
1. Как заставить таблицу периодически автоматиически обновляться (раз в 10 сек например)
2. Как изменить названия колонок. Колонка с названием table.title как-то некрасиво.
И вообще хотелось бы убрать все эелементы из шапки ГЭ База данных кроме названия колонок.


По прежнему открыт вопрос с таблицей произвольной структуры, которую можно заполнять произвольными данными. И просьбы выслать (если конечно есть такой) проект из видеоурока Обмен данными между SCADA TRACE MODE и СУБД по ODBC".
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Убрать из имен полей в ГЭ “База данных” слово table можно, если его не задавать в самом шаблоне запроса, например,

SELECT
Param1 #ARG_000#,
Param2 #ARG_001#,
Param3 #ARG_002#

FROM
Table1

вместо

SELECT
Table1.Param1 #ARG_000#,
Table1.Param2 #ARG_001#,
Table1.Param3 #ARG_002#

FROM
Table1

Других изменений в этот ГЭ внести нельзя.

Возможно, следует обратить внимание на групповое считывание строк в аргументы каналов ChGroupReq (см.описание SQL-запросов) и создание для этих аргументов собственной таблицы.
 
Posted by dzukpp (Участник № / Member № 6383) on :
 
quote:
Отправитель / Originally posted by AdAstra Technical Support:

Возможно, следует обратить внимание на групповое считывание строк в аргументы каналов ChGroupReq (см.описание SQL-запросов)

Я писал выше, что не получается по непонятным причинам и просил вылать пример из видеурока "Обмен данными между SCADA TRACE MODE и СУБД по ODBC".
Где-то на форуме прочитал, что если запрос возвращает кол-во строк отличное от кол-ва аргументов канала ChGroupReq, то аргументы канала не заполняются. Это так?

quote:
Отправитель / Originally posted by AdAstra Technical Support:

и создание для этих аргументов собственной таблицы.

Как понять собственной таблицы? Я не нашел ГЭ, способного делать произвольную таблицу.

Читал, что есть некий ГЭ "Текст из файла", но так и не понял где его взять.

Могу ли с помощью ГЭ "Текст из файла" нарисовать таблицу, обновляющуюся раз в несолько секунд, данными из атрибутов SQLQuery?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Пример к видео-уроку Вам отправлен.

"Собственную таблицу" можно создать из набора ГЭ "Текст", привязанных к аргументам канала групповой выборки.
 
Posted by dzukpp (Участник № / Member № 6383) on :
 
quote:
Отправитель / Originally posted by AdAstra Technical Support:
Пример к видео-уроку Вам отправлен.

"Собственную таблицу" можно создать из набора ГЭ "Текст", привязанных к аргументам канала групповой выборки.

Спасибо, почему то об этом я даже и не подумал.
 
Posted by dzukpp (Участник № / Member № 6383) on :
 
И снова, здравствуйте.
Проблема с выводом данных из БД на экран.
Запрос типа "SELECT * FROM table".

Сделал канал CALL.SQLQuery, к аргументу привязал канал CALL.ChGroupReq, аргументы Экрана привязал к CALL.ChGroupReq. Передаю в атрибут "Входное значение" канала БД 0xFFFF.

В результате если кол-во аргументов в CALL.ChGroupReq равно или меньше кол-ву записей в таблице БД, то все ОК.

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

Кто виноват и что делать?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Количество аргументов в канале CALL.ChGroupReq автоматически задается равным количеству считанных строк.
Жесткие привязки аргументов экрана к аргументам CALL.ChGroupReq не даст результата.

Можно вывести данные из CALL.ChGroupReq следующим образом.
Задать на экране ГЭ "Текст из файла" (группа "Ресурсы").
Привязать этот ГЭ через аргумент экрана к РЕАЛЬНОМУ значению CALL.ChGroupReq.
В привязке ГЭ выбрать номер атрибута 522.
На экран будет выводиться таблица предустановленного формата со значениями аргументов CALL.ChGroupReq.

Обновляться таблица будет при любом (принудительном) изменении РЕАЛЬНОГО значения CALL.ChGroupReq.
 
Posted by dzukpp (Участник № / Member № 6383) on :
 
quote:
Отправитель / Originally posted by AdAstra Technical Support:
Количество аргументов в канале CALL.ChGroupReq автоматически задается равным количеству считанных строк.
Жесткие привязки аргументов экрана к аргументам CALL.ChGroupReq не даст результата.

Я же самолично создаю аргументы CALL.ChGroupReq. Что значит автоматически создаются? Вы же мне нечто подобное в посте №13346 советовали.

Ну да ладно. Попытался реализовать через ГЭ "Текст из файла".
quote:
Отправитель / Originally posted by AdAstra Technical Support:
В привязке ГЭ выбрать номер атрибута 522.

В этом месте не понятно. Я же привязываю ГЭ к реальному значению CALL.ChGroupReq. Где я должен выбрать атрибут 522?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
При привязке свойства ГЭ к аргументу открывается таблица аргументов экрана.
Работа с этой таблицей описана в разделе "Разработка графического интерфейса/Задание типовых свойств ГЭ/Динамизация атрибута ГЭ".

" выбрать аргумент, сбросить флаг "Использовать привязанный атрибут" и выбрать атрибут (0,R по умолчанию) или задать номер атрибута в поле "Атрибут", если конфигурируемое динамическое свойство должно быть привязано к атрибуту канала, отличному от того, который привязан (будет привязан) к выбранному аргументу. После привязки в поле "Значение" атрибута "Привязка" отображается порядковый номер и имя аргумента, а также короткое имя атрибута (например, "<1> ARG_000 (In)"). Если короткое имя атрибута не существует, отображается номер атрибута ("<1> ARG_000 (452)"). "

В Вашем случае надо выбрать атрибут с номером 522.
 
Posted by dzukpp (Участник № / Member № 6383) on :
 
Доброй ночи.
Попробовал Ваш совет последний совет. Эффект прежний, в ГЭ "Текст из файла" ничего.

Но обнаружилось несколько деталей.

1.
В файле fm2_0.txt (fm2 - название проекта) вот такое
code:
 
(2:57:14) WRN_RTM:wrong entry out -140(9,2) id=7
(2:57:14) WRN_RTM:wrong entry out -139(9,2) id=7
(2:57:14) WRN_RTM:wrong entry out -138(9,2) id=7
(2:57:14) WRN_RTM:wrong entry out -137(9,2) id=7
(2:57:14) WRN_RTM:wrong entry out -136(9,2) id=7
(2:57:14) WRN_RTM:wrong entry out -135(9,2) id=7
(2:57:14) WRN_RTM:wrong entry out -134(9,2) id=7
(2:57:14) WRN_RTM:wrong entry out -133(9,2) id=7
(2:57:14) WRN_RTM:wrong entry out -132(9,2) id=7

ID 7 это как раз канал CALL.SQLQuery, который я пытаюсь показать на экране.
После передачи -1 на вход канала CALL.SQLQuery еще добавляется строка

code:
 
(2:58:19) WRN_RTM:wrong entry(g)

2.
После передачи -1 на вход канала CALL.SQLQuery перестают обновляться данные на экране. В окошке Вид-Компоненты видно, что аргументы экрана обновляются.

3.
При переходе на другой экран и возвращении обратно в табличке появляются данные из БД.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
1. Сообщения говорят о некорректности привязок аргументов (например, отсутствие привязанных аргументов в реальном времени.

2. Вы действительно передаете на вход канала CALL.SQLQuery число "-1" (отрицательное)? Номер запроса "1" - положительное число.
О каких аргументах идет речь? Как они связаны с SQL-запросом? Какими ГЭ они должны отображаться?

3. Выше было указано
"Обновляться таблица будет при любом (принудительном) изменении РЕАЛЬНОГО значения CALL.ChGroupReq." Или при возвращении на этот экран.
Судя по всему, запрос реализуется и в аргументах канала CALL.ChGroupReq имеются данные из БД.
 
Posted by dzukpp (Участник № / Member № 6383) on :
 
1. А поточнее узнать, что означают цифры? Где искать неправильные привязки. У канала CALL.SQLQuery всего 6 аргументов, а записей в логе 9.

2. На вход CALL.SQLQuery я передаю -1 (отрицательное), передаю 65535, передаю 0xFFFF. Эффект один. В документации написано, чтобы записать результат запроса БД в аргументы CALL.ChGroupReq, нужно на вход передать 0xFFFF.
Я так и делаю. При этом атрибут 124 CALL.ChGroupReq заполняются даннымми из БД. Так же заполняются аргументы экрана которые привязаны к аргументам CALL.ChGroupReq тоже меняются. Но при этом на экране остается как было. Также перестаются обновлятся на экране другие данные.

Данные из БД пытаюсь показать двумя способами: через ГЭ "Текст из файла" и привязывая аргументы экрана к аргументам CALL.ChGroupReq.

3. Пробовал менять Реальное значение CALL.ChGroupReq, чтобы обновить ГЭ "Текст из файла", эффекта нет.


Мне кажется если как-то заставить обновиться экран, то данные из БД там должны появиться.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Нельзя выводить на экран непосредственно аргументы канала CALL.ChGroupReq, у которого аргументы создаются на лету по количеству считанных строк.
Если в какой-то момент времени количество реальных аргументов канала CALL.ChGroupReq меньше, чем число аргументов этого канала, к которым привязаны аргументы экрана, экран выключится и сам не включится.
 
Posted by dzukpp (Участник № / Member № 6383) on :
 
Спасибо за быстрый ответ.

quote:
Если в какой-то момент времени количество реальных аргументов канала CALL.ChGroupReq меньше, чем число аргументов этого канала, к которым привязаны аргументы экрана, экран выключится и сам не включится.
Это так и задумано или это баг такой? Планируете ли исправить?

Удалил все аргументы у CALL.ChGroupReq, вариант с "Текст из файла" заработал. Но есть один момент. После передачи на вход CALL.SQLQuery значения 65535 (через окно компоненты или по кнопке) в течении 2-5 секунд экран не обновляется. Можно ли от этого избавиться?

Могу ли я в скрипте обратиться к аргументам CALL.ChGroupReq созданным на лету, чтобы заполнить аргументы экрана? Вариант с "Текст из файла" мне не нравиться. Не вижу возможности выделить произвольную строку в таблице и обратиться к ее данным.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
1. "Это" так и задумано.

2. У канала CALL.ChGroupReq надо оставить хотя-бы 1 аргумент.

3. В атрибуте 124 канала CALL.ChGroupReq указывается, сколько аргументов у него создано.
С учетом этого параметра и используя специальные ST-функции
"DINT getAttributeI(UDINT ch_id, UINT attr_id)

//чтение атрибута канала (вещественное, 4 байта)

REAL getAttributeF(UDINT ch_id, UINT attr_id)

//установка атрибута канала (целое со знаком,4 байта)"
можно считать из CALL.ChGroupReq его аргументы в программу и переписать в выходные аргументы программы, к которым привязываются соответствующие аргументы экрана.

Номер атрибута равен 1000+<номер аргумента>.

Количество выходных аргументов программы (и соответствующих аргументов экрана) должно быть согласовано с возможным количеством строк в выборке из БД.
Если при этом количество реально считанных строк меньше количества заложенных ГЭ, то придется в "лишние" аргументы программы писать нечто, позволяющее сделать соответствующие ГЭ невидимыми.
 
Posted by dzukpp (Участник № / Member № 6383) on :
 
quote:
Отправитель / Originally posted by AdAstra Technical Support:
У канала CALL.ChGroupReq надо оставить хотя-бы 1 аргумент.

Попробовал добавить по одному аргументу в каждый канал CALL.ChGroupReq. Разницы не увидел.

Как справиться с тем, что данные на экране не обновляются несколько секунд после передачи 65535 в CALL.SQLQuery?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Задайте каналу CALL.SQLQuery период обработки
1*"цикл IDLE".
 
Posted by dzukpp (Участник № / Member № 6383) on :
 
quote:
Отправитель / Originally posted by AdAstra Technical Support:
Задайте каналу CALL.SQLQuery период обработки
1*"цикл IDLE".

Изменил, проблема осталась
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Какие именно "данные на экране не обновляются несколько секунд после передачи 65535 в CALL.SQLQuery"?

Связь с БД осуществляется локально или по сети?

Надо провести дополнительную диагностику.
В файле конфигурирования запуска узла TMcom_<ordinal>.cnf (см."Приложения/Задание параметров работы мониторов") надо задать ключ
DEBUGON=70044410

В профайлерном протоколе в папке узла должна быть информация об ошибках SQL-обмена, потоках (в частности, о потоке IDELE).
Следует также просмотреть протокол трассировщика ODBC-драйвера.
 
Posted by dzukpp (Участник № / Member № 6383) on :
 
Сделал тестовый проект. Имеется:
- канал CALL.SQLQuery, период 1*цикл IDLE
- 2 канала CALL.ChGroupReq, привязанных к аргументам CALL.SQLQuery
- скрипт посылающий на вход CALL.SQLQuery 65535, меняющий реальное значение CALL.ChGroupReq
- скрипт увеличивающий аргумент экрана counter на 1
- Экран, на нем значение counter, 2 ГЭ "Текст из файла" с привязанными CALL.ChGroupReq.

В результате
1. counter увеличивается.
2. когда CALL.SQLQuery получает на вход 65535 counter перестает увеличиваться.
3. через 10 сек. в ГЭ "Текст из файла" появляются данные из БД, counter продолжает увеличиваться.

Кусок лога:
code:
 

(11:5:22) INF_GRAPH:scr:1:popup=0 scrref=0 trend=0,0 update=1
(11:5:24) INF_RTM:Thread Enable
(11:5:24) INF_RTM:Idle period = 1100
(11:5:27) INF_RTM:SQL: connect База_данных#1:1
(11:5:27) INF_RTM:SQL : exec prepare R=0xffff for next fetch all row База_данных#1:1
(11:5:35) INF_RTM:SQL: select 2 row База_данных#1:1
(11:5:35) INF_RTM:SQL: fetch row from 0 to 2 База_данных#1:1
(11:5:35) INF_RTM:SQL: disconnect after select База_данных#1:1
(11:5:43) INF_RTM:stoping...
(11:5:43) INF_RTM:mode=5(Stop) e15=00 e18=00 e20=00 [src0]
(11:5:43) INF_RTM:stop CALC[8444] ku=0 workT=0 Sleep=12
(11:5:43) INF_RTM:stop Ext Graph[9248] ku=0 workT=21 Sleep=0
(11:5:43) INF_RTM:stop Main[9404] ku=0 workT=0 Sleep=22
(11:5:43) INF_RTM:stop IDLE[1752] ku=0 workT=0 Sleep=14
(11:5:44) INF_RTM:stop GRAPH[7392] ku=0 workT=22 Sleep=19
(11:5:44) INF_RTM:stop ACT[9552] ku=0 workT=21 Sleep=21
(11:5:44) INF_RTM:stop SDDE[9816] ku=0 workT=0 Sleep=0
(11:5:44) INF_RTM:stop time is 1.387 s
(11:5:44) INF_RTM:number of calculation = 21
(11:5:44) INF_RTM:END OF WORK


В логе виден момент когда все "подвисает" 11:5:27-11:5:35. Как раз чтение из БД. Впечатление, что все выполняется в одном потоке и пока БД не получит ответ на запрос все "стоит".

quote:
протокол трассировщика ODBC-драйвера.
как посмотреть?

БД на том же компьютере, что и ТМ6.
 
Posted by Nico (Участник № / Member № 5342) on :
 
Call.sql перевести в поток idle
 
Posted by dzukpp (Участник № / Member № 6383) on :
 
quote:
Отправитель / Originally posted by Nico:
Call.sql перевести в поток idle

В настройках канала CALL.SQLQuery пункте Системные-Основные Период указал 1, Единица измерения IDLE. Вы это имели ввиду?
Не помогает
 
Posted by Nico (Участник № / Member № 5342) on :
 
Call.math анализирует завeршение
выпoлнения call.sql?
Если выборка большая то запрос выполняется долго в таком случае лучше использовать
autoresize аргументов call.chgr
 
Posted by dzukpp (Участник № / Member № 6383) on :
 
В тестовом примере запрос возвращает 2 записи по 6 полей. В любом случае каким бы тяжелым запрос не был, это не должно влиять на остальную систему.
 
Posted by dzukpp (Участник № / Member № 6383) on :
 
Уважаемая техподдержка, помогите пожалуйста с моей проблемой.
Может я вам тестовый пример пришлю?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
У Вас трассировщик ODBC-драйвера включен?
Надо его выключить.
 
Posted by dzukpp (Участник № / Member № 6383) on :
 
quote:
Отправитель / Originally posted by AdAstra Technical Support:
У Вас трассировщик ODBC-драйвера включен?
Надо его выключить.

Включил трасировку.
Запустил профайлер.
Передал на вход канала CALL.SQLQuery 65535.
Дождался, когда данные снова начнут обновляться (10 сек)
Посмотрел лог. Выложил по ссылке http://pastebin.com/Z9qnp0jh

Ни чего не понял.

Этот же самый запрос в среде MS SQL Server Management Studio выполняется 0.000 секунд. Я бы и не против, пусть хоть минуту выполняется. Проблема в том, что в это время не обновляется экран.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Присылайте Ваш проект на hotline3@adastra.ru вместе с Базой данных.
Опишите последовательность действий и контроля для воспроизведения ситуации.
 


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2