dzukpp
Junior Member / Новичок
Участник № / Member № 6383
отправлено / posted
Добрый день. Необходимо реализовать управление рецептами. Планирую использовать БД 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. С помощью каких ГЭ можно реализовать табличное представление данных об актуальных заявках и соответствующих им рецептам. Насколько я понял нечто похожее делает ГЭ "База данных". Может можно как-то сделать произвольную таблицу, заполняя ее из скрипта?
Сообщения / Posts 30 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Значения аргументов любого канала CALL можно в реальном времени увидеть через окно "Просмотр компонентов", если раскрыть его атрибут 124.
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |
dzukpp
Junior Member / Новичок
Участник № / Member № 6383
Этот пример я первым делом посмотрел. С ним все понятно.
Мой вопрос в том, что пока не понятно каким образом вывести на экран все или хотябы штук 10 рецептов, чтобы оператор смог выбрать необходимый.
Пробовал ГЭ База данных. Вроде бы рецепты показывает. Но есть 2 проблемы: 1. Как заставить таблицу периодически автоматиически обновляться (раз в 10 сек например) 2. Как изменить названия колонок. Колонка с названием table.title как-то некрасиво. И вообще хотелось бы убрать все эелементы из шапки ГЭ База данных кроме названия колонок.
По прежнему открыт вопрос с таблицей произвольной структуры, которую можно заполнять произвольными данными. И просьбы выслать (если конечно есть такой) проект из видеоурока Обмен данными между SCADA TRACE MODE и СУБД по ODBC".
Сообщения / Posts 30 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Возможно, следует обратить внимание на групповое считывание строк в аргументы каналов ChGroupReq (см.описание SQL-запросов) и создание для этих аргументов собственной таблицы.
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |
dzukpp
Junior Member / Новичок
Участник № / Member № 6383
отправлено / posted
quote:Отправитель / Originally posted by AdAstra Technical Support: Возможно, следует обратить внимание на групповое считывание строк в аргументы каналов ChGroupReq (см.описание SQL-запросов)
Я писал выше, что не получается по непонятным причинам и просил вылать пример из видеурока "Обмен данными между SCADA TRACE MODE и СУБД по ODBC". Где-то на форуме прочитал, что если запрос возвращает кол-во строк отличное от кол-ва аргументов канала ChGroupReq, то аргументы канала не заполняются. Это так?
quote:Отправитель / Originally posted by AdAstra Technical Support: и создание для этих аргументов собственной таблицы.
Как понять собственной таблицы? Я не нашел ГЭ, способного делать произвольную таблицу.
Читал, что есть некий ГЭ "Текст из файла", но так и не понял где его взять.
Могу ли с помощью ГЭ "Текст из файла" нарисовать таблицу, обновляющуюся раз в несолько секунд, данными из атрибутов SQLQuery?
Сообщения / Posts 30 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
Пример к видео-уроку Вам отправлен.
"Собственную таблицу" можно создать из набора ГЭ "Текст", привязанных к аргументам канала групповой выборки.
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |
dzukpp
Junior Member / Новичок
Участник № / Member № 6383
отправлено / posted
quote:Отправитель / Originally posted by AdAstra Technical Support: Пример к видео-уроку Вам отправлен.
"Собственную таблицу" можно создать из набора ГЭ "Текст", привязанных к аргументам канала групповой выборки.
dzukpp
Junior Member / Новичок
Участник № / Member № 6383
отправлено / posted
И снова, здравствуйте. Проблема с выводом данных из БД на экран. Запрос типа "SELECT * FROM table".
Сделал канал CALL.SQLQuery, к аргументу привязал канал CALL.ChGroupReq, аргументы Экрана привязал к CALL.ChGroupReq. Передаю в атрибут "Входное значение" канала БД 0xFFFF.
В результате если кол-во аргументов в CALL.ChGroupReq равно или меньше кол-ву записей в таблице БД, то все ОК.
В противном случае на экране данные не появляются. Запустил профайлер, вызвал окно компоненты, смотрю атрибут 124 экрана, там нужные данные появились. Т.е. запрос выполнился, данные пришли, но на экране не отобразились.
отправлено / posted
Количество аргументов в канале CALL.ChGroupReq автоматически задается равным количеству считанных строк. Жесткие привязки аргументов экрана к аргументам CALL.ChGroupReq не даст результата.
Можно вывести данные из CALL.ChGroupReq следующим образом. Задать на экране ГЭ "Текст из файла" (группа "Ресурсы"). Привязать этот ГЭ через аргумент экрана к РЕАЛЬНОМУ значению CALL.ChGroupReq. В привязке ГЭ выбрать номер атрибута 522. На экран будет выводиться таблица предустановленного формата со значениями аргументов CALL.ChGroupReq.
Обновляться таблица будет при любом (принудительном) изменении РЕАЛЬНОГО значения CALL.ChGroupReq.
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |
dzukpp
Junior Member / Новичок
Участник № / Member № 6383
отправлено / posted
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?
Сообщения / Posts 30 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
При привязке свойства ГЭ к аргументу открывается таблица аргументов экрана. Работа с этой таблицей описана в разделе "Разработка графического интерфейса/Задание типовых свойств ГЭ/Динамизация атрибута ГЭ".
" выбрать аргумент, сбросить флаг "Использовать привязанный атрибут" и выбрать атрибут (0,R по умолчанию) или задать номер атрибута в поле "Атрибут", если конфигурируемое динамическое свойство должно быть привязано к атрибуту канала, отличному от того, который привязан (будет привязан) к выбранному аргументу. После привязки в поле "Значение" атрибута "Привязка" отображается порядковый номер и имя аргумента, а также короткое имя атрибута (например, "<1> ARG_000 (In)"). Если короткое имя атрибута не существует, отображается номер атрибута ("<1> ARG_000 (452)"). "
dzukpp
Junior Member / Новичок
Участник № / Member № 6383
отправлено / posted
Доброй ночи. Попробовал Ваш совет последний совет. Эффект прежний, в ГЭ "Текст из файла" ничего.
Но обнаружилось несколько деталей.
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. При переходе на другой экран и возвращении обратно в табличке появляются данные из БД.
Сообщения / Posts 30 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
1. Сообщения говорят о некорректности привязок аргументов (например, отсутствие привязанных аргументов в реальном времени.
2. Вы действительно передаете на вход канала CALL.SQLQuery число "-1" (отрицательное)? Номер запроса "1" - положительное число. О каких аргументах идет речь? Как они связаны с SQL-запросом? Какими ГЭ они должны отображаться?
3. Выше было указано "Обновляться таблица будет при любом (принудительном) изменении РЕАЛЬНОГО значения CALL.ChGroupReq." Или при возвращении на этот экран. Судя по всему, запрос реализуется и в аргументах канала CALL.ChGroupReq имеются данные из БД.
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |
dzukpp
Junior Member / Новичок
Участник № / Member № 6383
отправлено / posted
1. А поточнее узнать, что означают цифры? Где искать неправильные привязки. У канала CALL.SQLQuery всего 6 аргументов, а записей в логе 9.
2. На вход CALL.SQLQuery я передаю -1 (отрицательное), передаю 65535, передаю 0xFFFF. Эффект один. В документации написано, чтобы записать результат запроса БД в аргументы CALL.ChGroupReq, нужно на вход передать 0xFFFF. Я так и делаю. При этом атрибут 124 CALL.ChGroupReq заполняются даннымми из БД. Так же заполняются аргументы экрана которые привязаны к аргументам CALL.ChGroupReq тоже меняются. Но при этом на экране остается как было. Также перестаются обновлятся на экране другие данные.
Данные из БД пытаюсь показать двумя способами: через ГЭ "Текст из файла" и привязывая аргументы экрана к аргументам CALL.ChGroupReq.
3. Пробовал менять Реальное значение CALL.ChGroupReq, чтобы обновить ГЭ "Текст из файла", эффекта нет.
Мне кажется если как-то заставить обновиться экран, то данные из БД там должны появиться.
Сообщения / Posts 30 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
Нельзя выводить на экран непосредственно аргументы канала CALL.ChGroupReq, у которого аргументы создаются на лету по количеству считанных строк. Если в какой-то момент времени количество реальных аргументов канала CALL.ChGroupReq меньше, чем число аргументов этого канала, к которым привязаны аргументы экрана, экран выключится и сам не включится.
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |
dzukpp
Junior Member / Новичок
Участник № / Member № 6383
отправлено / posted
Спасибо за быстрый ответ.
quote: Если в какой-то момент времени количество реальных аргументов канала CALL.ChGroupReq меньше, чем число аргументов этого канала, к которым привязаны аргументы экрана, экран выключится и сам не включится.
Это так и задумано или это баг такой? Планируете ли исправить?
Удалил все аргументы у CALL.ChGroupReq, вариант с "Текст из файла" заработал. Но есть один момент. После передачи на вход CALL.SQLQuery значения 65535 (через окно компоненты или по кнопке) в течении 2-5 секунд экран не обновляется. Можно ли от этого избавиться?
Могу ли я в скрипте обратиться к аргументам CALL.ChGroupReq созданным на лету, чтобы заполнить аргументы экрана? Вариант с "Текст из файла" мне не нравиться. Не вижу возможности выделить произвольную строку в таблице и обратиться к ее данным.
Сообщения / Posts 30 | Из / From: Россия
| IP / IP: IP адрес / IP address |
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+<номер аргумента>.
Количество выходных аргументов программы (и соответствующих аргументов экрана) должно быть согласовано с возможным количеством строк в выборке из БД. Если при этом количество реально считанных строк меньше количества заложенных ГЭ, то придется в "лишние" аргументы программы писать нечто, позволяющее сделать соответствующие ГЭ невидимыми.
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |
dzukpp
Junior Member / Новичок
Участник № / Member № 6383
отправлено / posted
quote:Отправитель / Originally posted by AdAstra Technical Support: У канала CALL.ChGroupReq надо оставить хотя-бы 1 аргумент.
Попробовал добавить по одному аргументу в каждый канал CALL.ChGroupReq. Разницы не увидел.
Как справиться с тем, что данные на экране не обновляются несколько секунд после передачи 65535 в CALL.SQLQuery?
Сообщения / Posts 30 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
Какие именно "данные на экране не обновляются несколько секунд после передачи 65535 в CALL.SQLQuery"?
Связь с БД осуществляется локально или по сети?
Надо провести дополнительную диагностику. В файле конфигурирования запуска узла TMcom_<ordinal>.cnf (см."Приложения/Задание параметров работы мониторов") надо задать ключ DEBUGON=70044410
В профайлерном протоколе в папке узла должна быть информация об ошибках SQL-обмена, потоках (в частности, о потоке IDELE). Следует также просмотреть протокол трассировщика ODBC-драйвера.
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |
dzukpp
Junior Member / Новичок
Участник № / Member № 6383
отправлено / posted
Сделал тестовый проект. Имеется: - канал 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. Как раз чтение из БД. Впечатление, что все выполняется в одном потоке и пока БД не получит ответ на запрос все "стоит".
dzukpp
Junior Member / Новичок
Участник № / Member № 6383
отправлено / posted
quote:Отправитель / Originally posted by Nico: Call.sql перевести в поток idle
В настройках канала CALL.SQLQuery пункте Системные-Основные Период указал 1, Единица измерения IDLE. Вы это имели ввиду? Не помогает
Сообщения / Posts 30 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Nico
Forum Professor / Завсегдатай форума
Участник № / Member № 5342
отправлено / posted
Call.math анализирует завeршение выпoлнения call.sql? Если выборка большая то запрос выполняется долго в таком случае лучше использовать autoresize аргументов call.chgr
Сообщения / Posts 873 | Из / From: Россия
| IP / IP: IP адрес / IP address |
dzukpp
Junior Member / Новичок
Участник № / Member № 6383
отправлено / posted
В тестовом примере запрос возвращает 2 записи по 6 полей. В любом случае каким бы тяжелым запрос не был, это не должно влиять на остальную систему.
Сообщения / Posts 30 | Из / From: Россия
| IP / IP: IP адрес / IP address |
dzukpp
Junior Member / Новичок
Участник № / Member № 6383
отправлено / posted
Уважаемая техподдержка, помогите пожалуйста с моей проблемой. Может я вам тестовый пример пришлю?
Сообщения / Posts 30 | Из / From: Россия
| IP / IP: IP адрес / IP address |
dzukpp
Junior Member / Новичок
Участник № / Member № 6383
отправлено / posted
quote:Отправитель / Originally posted by AdAstra Technical Support: У Вас трассировщик ODBC-драйвера включен? Надо его выключить.
Включил трасировку. Запустил профайлер. Передал на вход канала CALL.SQLQuery 65535. Дождался, когда данные снова начнут обновляться (10 сек) Посмотрел лог. Выложил по ссылке http://pastebin.com/Z9qnp0jh
Ни чего не понял.
Этот же самый запрос в среде MS SQL Server Management Studio выполняется 0.000 секунд. Я бы и не против, пусть хоть минуту выполняется. Проблема в том, что в это время не обновляется экран.
Сообщения / Posts 30 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
Присылайте Ваш проект на hotline3@adastra.ru вместе с Базой данных. Опишите последовательность действий и контроля для воспроизведения ситуации.
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |