Спасибо, попробую разобраться
Может, подскажете ответ? Пытаюсь реализовать чтение файла, ответ, судя по всему, приходит, но ОРС сервер пишет "таймаут ответа". Что может быть не так?
Вид для печати
Спасибо, попробую разобраться
Может, подскажете ответ? Пытаюсь реализовать чтение файла, ответ, судя по всему, приходит, но ОРС сервер пишет "таймаут ответа". Что может быть не так?
Вы имеете ввиду какую-то собственную конфигурацию или же нашу конфигурацию для чтения файлов из ПЛК?
Посмотрите лог запросов - действительно ли контроллер отвечает на запрос.
Код собственный на базе примеров из справки
Самая забавная вещь в том, что в логе запросов нет никаких ответов
А в логе промежуточного GPRS модема есть
При подключении напрямую всё выглядит точно так же
Родная программа напрямую работает, через GPRS модем с горем пополам тоже (таймауты слишком маленькие, но констатировать факт обмена пакетами можно)
Лучше все таки создавать новые темы.
Для начала вам лучше попытаться соединится с устройством напрямую, а уже после того как все отладите начинайте работать через GPRS модем.
В случае с GPRS модема возможно потребуется увеличение межсимвольного таймаута (в настройках узла) и время ожидания ответа.
Прошу прощения
Прошу модератора разделить тему
Программа не работает ни через модем, ни напрямую.
Межсимвольный и таймаут увеличены, опрос каналов проходит успешно.
Что у вас за устройство?
Приложите конфигурацию ОРС сервера и лог запросов и ответов. Для этого в настройках ОРС сервера, в свойствах сервера включите запись журнала и всех событий журнала, запустите режим исполнения и воспроизведите ошибку. Файл запишется в папку
c:\Documents and Settings\All Users\Application Data\InSAT\MasterOPC Universal Modbus Server\SERVERLOGS\
Также пришлите несколько скриншотов.
Устройство - МСД-200
Предупреждая вопрос, в коде встретите комментарий насчёт некорректной работы с порядком байт, сейчас объясню.
Если сделать любой запрос со значением, например, 1000000 и его маской uint32:3210, отправлено будет 00 0F 42 0F, а не 00 0F 42 40
Устройство почему то не отвечает на запрос. Вот часть из лога:
[05.11.2013 8:17:27.437] Information : Запрос 7:МСД-200:EXT_FUNCTION
[05.11.2013 8:17:27.437] TRACE : (COM5) Tx: [0034] 10 47 03 1C 00 00 00 01 5C 32 30 31 33 5F 30 38 5C 32 30 31 33 5F 30 38 5F 33 30 2E 63 73 76 00 DB 23
[05.11.2013 8:17:28.484] Error : Превышение таймаута МСД-200:EXT_FUNCTION
[05.11.2013 8:17:28.484] Information : Запрос 7:МСД-200:EXT_FUNCTION
[05.11.2013 8:17:28.484] TRACE : (COM5) Tx: [0034] 10 47 03 1C 00 00 00 01 5C 32 30 31 33 5F 30 38 5C 32 30 31 33 5F 30 38 5F 33 30 2E 63 73 76 00 DB 23
[05.11.2013 8:17:29.515] Error : Превышение таймаута МСД-200:EXT_FUNCTION
[05.11.2013 8:17:29.515] Information : Запрос 7:МСД-200:EXT_FUNCTION
[05.11.2013 8:17:29.515] TRACE : (COM5) Tx: [0034] 10 47 03 1C 00 00 00 01 5C 32 30 31 33 5F 30 38 5C 32 30 31 33 5F 30 38 5F 33 30 2E 63 73 76 00 DB 23
[05.11.2013 8:17:30.531] Error : Превышение таймаута МСД-200:EXT_FUNCTION
[05.11.2013 8:17:30.640] Information : Порт 5 закрыт
[05.11.2013 8:17:30.640] Error : Порт 5 не открыт !
А после этого порт уже не открывается.
Там в примечании к МСД-100 говорится:
"при передаче, если длина пакета получилась четной, в конце пакета, после CRC, добавляем дополнительный байт 0х00"
У вас как раз четное число, возможно проблема связана с этим.
Самая забавная вещь в том, что промежуточный GPRS модем в логе отмечает, что МСД-200 отвечает на запрос
Плюс к тому запрос не кратен 64 байтам
Плюс к тому я пробовал слать различные запросы
Цитата:
10 47 03 1C 00 00 00 00 5C 32 30 31 33 5F 30 38
5C 32 30 31 33 5F 30 38 5F 33 30 2E 63 73 76 00
8F DA
Цитата:
10 47 03 1D 00 00 00 00 5C 32 30 31 33 5F 30 38
5C 32 30 31 33 5F 30 38 5F 33 30 2E 63 73 76 00
00 9A F4
Ни на один программа ответа не получилаЦитата:
10 47 03 1C 00 00 00 00 5C 32 30 31 33 5F 30 38
5C 32 30 31 33 5F 30 38 5F 33 30 2E 63 73 76 00
8F DA 00 00 00
Как мы вам писали ранее, лучше сначала пробовать без GPRS модема. В описании сказано что нужно прибавлять еще один байт не к пакетам кратным 64 байтам, а к любым четным.
Попробуйте также выполнить пробный запрос не функцией modbus.ExtFunction, а функцией server.SendAndRecieveDatabyMask. Она настраивается примерно аналогично (нужно будет только адрес устройства указать). Тем более что учитывая нюанс про дополнительный байт функцию ExtFucntion вы использовать не сможете (контрольная сумма не будет вычисляться).
При использовании SendAndRecieveDatabyMask в логе запросов есть ответ на любой из запросов выше.
У вас используется версия 2.0.0.12. Попробуйте установите текущую версию 2.0.0.16 - была подобная ошибка, и мы ее исправляли.
Однако, как мы писали ранее, использовать ExtFunction у вас для данного прибора не получится - так как контрольная сумма будет вычислять не верно. Нужно будет использовать SendAndRecieveDatabyMask, и контрольную сумму считать вручную.
Планируется работа по 485му интерфейсу, закрывать ошибки работы по USB нет смысла
Попробую обновить сервер, спасибо
Навскидку, не скажете, победили там проблему с порядком байт?
2.0.0.16, изменений нет
Ошибка с чередованием байт в текущей версии все еще присутсвует - мы ее исправим, но не в ближайшей версии.
Пришлите нам логи одинаковых запросов при работе с функциями SendAndReciveDataByMask и ExtFunction, и конфигурации - мы сравним их.
Пожалуйста, вот логи и конфигурация
Код не причёсан, но убедиться в разнице работы функций можно, при запуске делает два одинаковых запроса разными функциями, один успешный, другой нет.
Мы сравнили два запроса в первом и втором случае, запросы отличаются:
[05.11.2013 8:17:27.437] TRACE : (COM5) Tx: [0034] 10 47 03 1C 00 00 00 01 5C 32 30 31 33 5F 30 38 5C 32 30 31 33 5F 30 38 5F 33 30 2E 63 73 76 00 DB 23
[05.11.2013 15:34:04.859] TRACE : (COM5) Tx: [0034] 10 47 03 1C 00 00 00 00 5C 32 30 31 33 5F 30 38 5C 32 30 31 33 5F 30 38 5F 33 30 2E 63 73 76 00 8F DA
Возможно устройство не отвечает на такой запрос. Попробуйте сделать идентичные запросы.
Косяк
Это рудимент от проб с порядком байт
С одинаковыми та же песня
Мы нашли ошибку приводящую к этому поведению. Ошибка будет исправлена в следующей версии.
Пока что используйте функцию SendAndReciveDataByMask - по функционалу она идентична.
Спасибо
Ждём
Пока что используйте SendAndReciveDataByMask