Здравствуйте. Делаю свой первый проект. Вопросов возникало масса. Какие-то отпали, но два из них меня мучают особенно сильно. 1. Пытаюсь сделать архивирование путём пересылки значений в Access. Всё делаю как описаон в "Быстром Старте", даже что-то получается - подключение происходит (подключение, подключено, отключение, отключено). После запуска запроса в отчёте тоже появляется что надо (Получить _Параметр1_=[значение по умолчанию] и т.д.), а вот в таблицу базы эти значения, почему-то, не приходят. То есть я делаю запрос, потом открываю базу, а там пусто. 2. Пробуем организовать управление задвижек с рабочего места оператора. Решил организовать всё это дело по DDE, но сталкнулся с проблемой. DDE-клиентом выступает программа DSData (контроллер Direct Logic) Передаю в канал контроллера через DSData значение, значение приходит как надо, только в DSData по этому каналу начинает писаться передаваемое значение с промежутком в секунду. Ко все тому DSData ещё и является DDE сервером для Trace Mode (если я всё правильно понимаю) т.к. через него приходят данные с контроллера. Заранее спасибо за помощь.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
1. Зачем делать архивирование в MS Access, если в Trace Mode 6 есть свои архивы? Для того чтобы понять, что происходит с SQL-обменом, надо перед запуском профайлера запустить трассировщик ODBC-драйвера (уж если взялись за БД, найдите) и по его протоколу выяснить, идут ли запросы и какие есть ошибки.
2. Непонятно, почему нельзя использовать для связи с контроллерами Direct Logic протокол Modbus? Откуда "в DSData по этому каналу начинает писаться передаваемое значение с промежутком в секунду"? Как Вы связывали Trace Mode 6 с DDE-сервером?
Posted by Hi-man (Участник № / Member № 4154) on :
1. Делаю архивирование в Access потому что монитор у меня не плюсовый, поэтому приходится выкручиваться подручными средствами. Сделал запрос из шаблона без трассировщика - время изменения файла изменилось на текущее, а содержимое осталось прежним. Закрыл IDE, запустил трассировщик, открыл IDE, сделал запрос из шаблона. Результат тот же. В файле лога из всего мне понятна только эта строчка: DIAG [22005] [Microsoft][Драйвер ODBC Microsoft Access] Несоответствие типов данных в выражении условия отбора. (-3030) но не понятно её появление, так как аргументы шаблона у меня IN/REAL, а записи в БД в соответствии с Быстрым Стартом (что видел, то и делал). В чём несоответствие типов данных? 2. Никто не говорит, что нельзя использовать Modbus, я именно так и делал сначала, просто при таком раскладе через некоторое время (промежутки разные - от получаса до... верхнюю границу не улавливал)происходит зависание, после которого перезапуск проекта не помогает, только перезагрузка RTM. Такая же ситуация с выходом - то идёт передача, то не идёт. Если не идёт можно смело закрывать RTM и открывать заново, а это как-то неудобно, да и на объекте может всякое за это время произойти. Если бы я знал "Откуда "в DSData по этому каналу начинает писаться передаваемое значение с промежутком в секунду"?"... Просто создал канал DDE с режимом REQ/POKE (data) направление Output и запустил. В DSData появился канал с адресом назначения и, оставаясь не отключенным, стал появляться ниже новый (адрес тот же) с промежутком в секунду и так далее. В DSData каналы появляются в момент обращения программы, то есть при его запуске ни одного канала нет, когда запускается RTM все описанные в ИС входные каналы (касающиеся контроллера) появляются в DSData и висят, показывая передаваемое в RTM значение. А вот с выходными такие странности.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
1. Разница в стоимости между МРВ и МРВ+ 10%. Заменяя архив МРВ на БД, тем более такую слабую и ненадежную, как MS Access, Вы обрекаете себя на значительное усложнение всех процессов обработки отображения и документирования данных реального процесса. Кроме того, надо учитывать, что быстродействие SQL-обмена через ODBC-драйвер принципиально существенно ниже, чем реальное бастродействие при работе с архивами в МРВ.
По сообщениям трассировщика надо просмотреть соответствие настроек типов данных в полях БД типам данных, передаваемых из Trace Mode 6. В частности, возможно, в БД установлено обозначение точки во FLOAT в виде ",". Надо "."
2. Вместо такой радикальной и довольно громоздкой замены драйвера Modbus на механизм DDE надо было бы разобраться в причинах прекращения обмена по Modbus. Возможно, необходимо посмотреть проект и протоколы перехвата трафика обмена. Можно обсудить это в рабочем порядке непосредственно в службе техподдержки hotline@adastra.ru.
Trace Mode 6 не инспирирует процедур создания тегов в DDE-сервере. Значение из канала DDE_OUT отправляется в DDE-сервер только при его изменении. При получении стандартного сигнала о завершении транзакции передача завершается. Если стандартный сигнал завершения транзакции не получен, передача повторяется.
Надо отметить, что, хотя DDE-обмен в Trace Mode-проектах используется не очень часто, за много лет внедрения Trace Mode такая проблема озвучена впервые.
Posted by Romсheg (Участник № / Member № 3792) on :
В качестве СУБД может работать с MS Access.
Posted by ValArg (Участник № / Member № 4245) on :
Здравствуйте. По ТЗ необходимо данные заносить в БД MS Access. Все сделал как в примере"Быстрый старт". Есть подключение к бд, привязки. Но в сам файл БД ничего не записывается. В БД тип данных float, каналы ТМ также. Вот логи трассировки SQL.LOG: Melang_2_0 110-810 ENTER SQLGetInfoW HDBC 00D815E8 UWORD 70 <SQL_CONVERT_VARCHAR> PTR 06F0C944 SWORD 4 SWORD * 0x00000000
Melang_2_0 110-810 EXIT SQLGetInfoW with return code 0 (SQL_SUCCESS) HDBC 00D815E8 UWORD 91 <SQL_OWNER_USAGE> PTR 06F0C944 SWORD 4 SWORD * 0x00000000 В чем может быть причина?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
В несоответствии типа данных аргументов типам данных полей базы данных или при попытке писать в БД вещественные числа при установленном в ОС разделителе между целой и дробной части числа з а п я т о й.
Posted by ValArg (Участник № / Member № 4245) on :
Тестовый проект на четыре канала работает (данные записываются в БД). На 52 канала не работает. Сделано все также. Проверка проходит, тип данных аргументов-real, тип данных полей БД-float. В ОС разделитель точка В чем может быть причина?
Posted by Romсheg (Участник № / Member № 3792) on :
Одна из вероятных причин, почему на 4 канала работает, а на 52 нет - ограничение на длинну строки SQL-запроса, который формируется к СУБД. У MS Access эта строка имеет ограничение, причем не очень большое, поэтому есть подозрение, что 52 значения канала в запрос просто не помещаются. Тут надо посмотреть документацию на эту тему самого Access.
Posted by ValArg (Участник № / Member № 4245) on :
где эта строка? Как я понял в моем случае лучше организовать, например, 5 запросов с записью в 5 БД. Но как это скажется на производительности МРВ?
Posted by Romсheg (Участник № / Member № 3792) on :
Весь ваш запрос - это и есть одна большая строка, просто большинство СУБД имеют ограничения на длинну этой строки.
Posted by ValArg (Участник № / Member № 4245) on :
Проблема решилась. Максимальная длина инструкции SQL для MS Access составляет 255 символов. Сократил имена до 2 символов. Файл СУБД кинул в корень диска, а то в дереве папки с кириллицей ему не нравились. Все заработало. Еще раз спасибо.
Posted by Romсheg (Участник № / Member № 3792) on :
Ну вот и хорошо... Подводные камни - это всегда неприятно, когда о них не знаешь.