This is topic Связь с Access. Дискретный выход DDE in forum Работа с приложениями (ODBC-SQL/OPC/DDE) at Форум TRACE MODE: техническая поддержка.


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

Posted by Hi-man (Участник № / Member № 4154) on :
 
Здравствуйте.
Делаю свой первый проект. Вопросов возникало масса. Какие-то отпали, но два из них меня мучают особенно сильно.
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 :
 
Чтобы не напрягать МРВ ТМ6 обменом по ODBC и быстро архивировать данные во внешние СУБД - рекомендую посмотреть здесь: http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/50/t/000017.html

В качестве СУБД может работать с 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 70 <SQL_CONVERT_VARCHAR>
PTR 06F0C944
SWORD 4
SWORD * 0x00000000

Melang_2_0 110-810 ENTER SQLGetInfoW
HDBC 00D815E8
UWORD 62 <SQL_CONVERT_LONGVARCHAR>
PTR 06F0C944
SWORD 4
SWORD * 0x00000000

Melang_2_0 110-810 EXIT SQLGetInfoW with return code 0 (SQL_SUCCESS)
HDBC 00D815E8
UWORD 62 <SQL_CONVERT_LONGVARCHAR>
PTR 06F0C944
SWORD 4
SWORD * 0x00000000

Melang_2_0 110-810 ENTER SQLGetInfoW
HDBC 00D815E8
UWORD 91 <SQL_OWNER_USAGE>
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 :
 
Спасибо за ответ. Честно говоря не врубаюсь. Вот запрос:
INSERT INTO Mel_2
(
Data,
Koncentrac_R1,
Koncentrac_R10,
Koncentrac_R11,
Koncentrac_R12,
Koncentrac_R13,
Koncentrac_R2,
Koncentrac_R3,
Koncentrac_R4,
Koncentrac_R5,
Koncentrac_R6,
Koncentrac_R7,
Koncentrac_R8,
Koncentrac_R9,
Riven'_R1,
Riven'_R10,
Riven'_R11,
Riven'_R12,
Riven'_R13,
Riven'_R2,
Riven'_R3,
Riven'_R4,
Riven'_R5,
Riven'_R6,
Riven'_R7,
Riven'_R8,
Riven'_R9,
Temperatura_R1,
Temperatura_R10,
Temperatura_R11,
Temperatura_R12,
Temperatura_R13,
Temperatura_R2,
Temperatura_R3,
Temperatura_R4,
Temperatura_R5,
Temperatura_R6,
Temperatura_R7,
Temperatura_R8,
Temperatura_R9,
Tisk_R1,
Tisk_R10,
Tisk_R11,
Tisk_R12,
Tisk_R13,
Tisk_R2,
Tisk_R3,
Tisk_R4,
Tisk_R5,
Tisk_R6,
Tisk_R7,
Tisk_R8,
Tisk_R9
)
VALUES
(
'#Временная_отметка#',
'#Концентрація_Р1#',
'#Концентрація_Р10#',
'#Концентрація_Р11#',
'#Концентрація_Р12#',
'#Концентрація_Р13#',
'#Концентрація_Р2#',
'#Концентрація_Р3#',
'#Концентрація_Р4#',
'#Концентрація_Р5#',
'#Концентрація_Р6#',
'#Концентрація_Р7#',
'#Концентрація_Р8#',
'#Концентрація_Р9#',
'#Рівень_Р1#',
'#Рівень_Р10#',
'#Рівень_Р11#',
'#Рівень_Р12#',
'#Рівень_Р13#',
'#Рівень_Р2#',
'#Рівень_Р3#',
'#Рівень_Р4#',
'#Рівень_Р5#',
'#Рівень_Р6#',
'#Рівень_Р7#',
'#Рівень_Р8#',
'#Рівень_Р9#',
'#Температура_Р1#',
'#Температура_Р10#',
'#Температура_Р11#',
'#Температура_Р12#',
'#Температура_Р13#',
'#Температура_Р2#',
'#Температура_Р3#',
'#Температура_Р4#',
'#Температура_Р5#',
'#Температура_Р6#',
'#Температура_Р7#',
'#Температура_Р8#',
'#Температура_Р9#',
'#Тиск_Р1#',
'#Тиск_Р10#',
'#Тиск_Р11#',
'#Тиск_Р12#',
'#Тиск_Р13#',
'#Тиск_Р2#',
'#Тиск_Р3#',
'#Тиск_Р4#',
'#Тиск_Р5#',
'#Тиск_Р6#',
'#Тиск_Р7#',
'#Тиск_Р8#',
'#Тиск_Р9#'
)

где эта строка?
Как я понял в моем случае лучше организовать, например, 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 :
 
Ну вот и хорошо... Подводные камни - это всегда неприятно, когда о них не знаешь. [Пдмигивание / Wink]
 


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



Powered by Infopop Corporation
UBB.classic™ 6.7.2