Тема / Topic: OPC HDA через канал CALL не сбрасывает массив аргументов
voldemr
Junior Member / Новичок
Участник № / Member № 7872
отправлено / posted
Здравствуйте. Поясите, как работает канал Обмен по OPC HDA с помощью канала CALL .
Есть сервер OPC HDA. 1. В ТМ6 (демо-версия) в источниках/приемниках создаю компонент OPC HDA. 2. Создаю канал CALL привязанный к источнику из п.1. (по умолчанию, остановлен). 3. В канале CALL из. п.2 создаю 2 аргумента DATE_AND_TIME для задания интервала запроса. 4. Создаю 2 канала Time (From и To) и привязываю соответственно к аргументам интервалов канала CALL. 5. Запускаю профайлер. Далее действия в профайлере.
Начинаю эксперимент: 6. Задаю интервал From и To (данные в сервере OPC HDA точно ОТСУТСТВУЮТ) 7. Запускаю канал CALL (в атрибут (3, C) Состояние записываю 0). 8. Данных соответственно нет, атрибут (124, ArgSize) НЕ меняет значение =2, атрибут (120, ACK) = 0, массив значений заполнен правильно. Только 2 аргумента интервалов. 9. Останавливаю канал CALL (в атрибут (3, C) Состояние записываю 1).
10. Задаю интервал From и To (данные в сервере OPC HDA точно ЕСТЬ) 11. Запускаю канал CALL (в атрибут (3, C) Состояние записываю 0). 12. Данные вычитываются, атрибут (124, ArgSize) меняет значение, атрибут (120, ACK) = 1, массив значений заполнен правильно. 13. Останавливаю канал CALL (в атрибут (3, C) Состояние записываю 1).
14. Задаю ДРУГОЙ интервал From и To (данные в сервере OPC HDA точно ЕСТЬ) 15. Запускаю канал CALL (в атрибут (3, C) Состояние записываю 0). 16. Данные вычитываются, атрибут (124, ArgSize) меняет значение, атрибут (120, ACK) = 1, массив значений перезаполнен правильно. 17. Останавливаю канал CALL (в атрибут (3, C) Состояние записываю 1).
Пока все штатно и логично.
Теперь самое непонятное: 18. Задаю ДРУГОЙ интервал From и To (данные в сервере OPC HDA точно ОТСУТСТВУЮТ) 19. Запускаю канал CALL (в атрибут (3, C) Состояние записываю 0). 20. Данные НЕ вычитываются, но атрибут (124, ArgSize) НЕ меняет значение, атрибут (120, ACK) = 1, и массив значений НЕ ОБНУЛЯЕТСЯ. 21. Останавливаю канал CALL (в атрибут (3, C) Состояние записываю 1).
Т.е. получается, что при штатной работе канала, если в сервере OPC HDA будут отсутствовать данные на запрашиваемый интервал, канал CALL не обновит свои данные и ни как не сообщит об этом!!!
Что я сделал неправильно в данном эксперименте? Каким образом обновить данные, т.е. узнать, что на запрашиваемый интервал данных в сервере OPC HDA нет?
Сообщения / Posts 14 | Из / From: РФ
| IP / IP: IP адрес / IP address |
отправлено / posted
1. Целесообразно задать каналу CALL период обработки ОДНОКРАТНО. Тогда после отработки запроса канал сам автоматически выключится и взведет ACK=1.
2. Когда каналу не удается отработать запрос, он остается включенным и продолжает посылать запросы до получения корректного ответа от OPC-сервера. При этом его атрибуты и аргументы не изменяются.
3. Можно предложить следующий алгоритм диагностики и управления. При включении канала одновременно сбрасывать ACK. После автоматического выключения канала (после его отработки) убедиться, что ACK=1. Если после включения канала в течение достаточно длительного времени (например, 2-3 сек.) ACK=0, сигнализировать ОШИБКУ и ВЫКЛЮЧАТЬ канал CALL.
Сообщения / Posts 17345 | Из / From: Россия
| IP / IP: IP адрес / IP address |
voldemr
Junior Member / Новичок
Участник № / Member № 7872
отправлено / posted
Спасибо. Примерно к подобному алгоритму я и пришел. Анализирую из программы ACK. Если запрос удачный, останавливаю канал, сбрасываю ACK в 0 и начинаю обрабатывать полученный массив данных. Далее, канал можно запускать на опрос с новыми интервалами.
Немного сторонний вопрос... Можно ли из программы по ID канала (атрибут 118), получить имя канала? К сожалению, специальные функции позволяю получить только DINT и REAL значения атрибутов.
Сообщения / Posts 14 | Из / From: РФ
| IP / IP: IP адрес / IP address |
voldemr
Junior Member / Новичок
Участник № / Member № 7872
отправлено / posted
Ясно. Спасибо. Будем думать и искать варианты)
"Не очень понятно, когда это может понадобиться.":
Есть запрос в БД, где имя канала - один из параметров. Также, имя канала(параметра) - это и таблица в БД. Через привязку к аргументам и по команде запрос выполняется.
Была мысль, программно запросу передавать в аргументы имя таблицы и нужные поля, и программно запускать выполнение запроса.
Сообщения / Posts 14 | Из / From: РФ
| IP / IP: IP адрес / IP address |
voldemr
Junior Member / Новичок
Участник № / Member № 7872
отправлено / posted
Здравствуйте. Прошу небольшие уточнения. Организован OPC HDA через канал CALL. 1. В каком формате считываются и хранятся данные "значений" в массиве аргументов 142,144,146 и далее? Этот вопрос возник, т.к. при чтении архива теряется точность представления данных. Судя по виду, то формат REAL (float) – вещественное число (4 байта). Но идет округление значения в десятых, сотых значениях после запятой. Иногда и до единицы.
2. Сомнения в том, что я экспериментирую с данными DoubleFloat (8 байт), канал значения вычитывает относительно верно, с учетом замечания в п.1. Но, т.к. специальные функции на чтение возвращают 4-х байтовые значения, то других вариантов, как использовать тип REAL, у меня не остается?
Сообщения / Posts 14 | Из / From: РФ
| IP / IP: IP адрес / IP address |
отправлено / posted
Аргументы создаются с типом данных REAL (4-байтовые). DoubleFloat принимаются, но преобразуются во FLOAT. Округление при этом неизбежно, т.к. у переменных FLOAT точность не позволяет корректно отображать более 6 значащих цифр. Например, переданное из OPC HDA-сервера число 193.89620 будет принято как 193.896.