Спасибо, попробую разобраться
Может, подскажете ответ? Пытаюсь реализовать чтение файла, ответ, судя по всему, приходит, но ОРС сервер пишет "таймаут ответа". Что может быть не так?
Вид для печати
Спасибо, попробую разобраться
Может, подскажете ответ? Пытаюсь реализовать чтение файла, ответ, судя по всему, приходит, но ОРС сервер пишет "таймаут ответа". Что может быть не так?
Вы имеете ввиду какую-то собственную конфигурацию или же нашу конфигурацию для чтения файлов из ПЛК?
Посмотрите лог запросов - действительно ли контроллер отвечает на запрос.
Код собственный на базе примеров из справки
Самая забавная вещь в том, что в логе запросов нет никаких ответов
А в логе промежуточного 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 вы использовать не сможете (контрольная сумма не будет вычисляться).