Дело в том, что если менять параметр Межсимвольный таймаут (было 1000 мс, поставил 100), то задержка снижается до 4-10 сек. Адрес в отчете правильный, т.к. к описанию протокола к устройству в примере он такой же.
Дело в том, что если менять параметр Межсимвольный таймаут (было 1000 мс, поставил 100), то задержка снижается до 4-10 сек. Адрес в отчете правильный, т.к. к описанию протокола к устройству в примере он такой же.
Добрый день.
Имеется задача: забрать данные по OPC и записать в ПЛК по Modbus. Возможно ли для этого использовать ваш сервер?
То есть взять из стороннего ОРС и запихать в Modbus?
Можно, но со скриптами.
Потребуется MPS с плагином DA Client и Modbus Universal. В MPS, в плагине Script (можно в бесплатной редакции) читаете значения из вашего DA сервера, и записываете в наш Modbus сервер
Спасибо, MPS это Multi-Protocol MasterOPC server?
Нужно установить оба ОРС сервера.
А есть ли возможность в MPS при выполнении 1 запроса считывать несколько данных(скорее всего скрипт на уровне устройства), чтобы опрос устройства происходил быстрее. А потом уже в тегах выбирать какие именно данные необходимо отобразить. Например считывать память, которая имеет размер 2К байт. Устройство позволяет считывать до 64 байт за 1 запрос. Т.е. нужно выполнить 31 запрос для полного считывания памяти.
Про какой протокол идет речь?
Или вы про скрипты? В скриптах запрашивайте как хотите.
У прибора свой протокол. В MPS есть ограничение на количество байт в значении тега, а именно в 4 байта? Например делается запрос для получения в TV 6 или 8 байт, но получают ответ только 2 байта. Если же делать запрос на 4 байта, то получаю ответ в 4 байта. Может я что-то делаю не так? Запрос делают так local destMask = {"byte", "byte", "byte", "byte", "byte", "byte", "int64:6:543210", "byte"}; send = {0x55, 0x01, 0xFE, 0x0F, 0x01, 0x03, 0x04, 0x82, 0x06, CS}; TV = string.format ("%02X",dest[LEN-1]);
Типа int64 у нас нет.
Вы можете запрашивать как int32 значения, а потом их объединять на верхнем уровне или передавать как строку.
можно и в одном запросе. Просто указываете тип - int32, а количество элементов - в два раза больше.
Объеденить их потом можно, но только если в строку, так как тега типа int64 в ОРС сервере нет.
Дело в том, что какое бы количество элементов не указывал int32:4:3210 или int32:6:543210 результат в теге не меняется
Когда local destMask = {"byte", "byte", "byte", "byte", "byte", "byte", "int32:4:3210", "byte"};
send = {0x55, 0x01, 0xFE, 0x0F, 0x01, 0x03, 0x04, 0x82, 0x04};
Результат 4 байта
когда local destMask = {"byte", "byte", "byte", "byte", "byte", "byte", "int32:6:543210", "byte"};
send = {0x55, 0x01, 0xFE, 0x0F, 0x01, 0x03, 0x04, 0x82, 0x06};
Результат 2 байта
Приложите вашу конфигурацию (оставьте в ней только то, что связано с вашим скриптом), а также лог. Для этого в свойствах сервера включите запись журнала и всех его событий, размер лога задайте равным 10000. Запустите режим исполнения и воспроизведите ошибку. Лог пишется в папку:
c:\ProgramData\InSAT\MasterOPC Universal Modbus Server\SERVERLOGS\
Лог заархивируйте и вышлите нам вместе с конфигурацией.
Ошибок так то нет, но вот значения не меняются при изменении int32:4 на int32:6. Это странно
А какие значения не меняются?
Что это такое:
"int32:12:1110976543210"
12 переменных типа int32 у вас в ответе нет. А чередование байт вообще не пойми что
Посмотрите внимательно документацию.
Я вас понял, спасибо. Делаю так local destMask = {"byte", "byte", "byte", "byte", "byte", "byte", "int16:3:10", "byte"}; и так local destMask = {"byte", "byte", "byte", "byte", "byte", "byte", "int16:1:10", "int32:1:3210", "byte"}; Но в ответе не получаю 6 байт
В каком ответе? От устройства?
Потом то что вы с полученным ответом делаете?
Да, от устройства. Ответ записывается в тег TV = string.format ("%02X", dest[LEN-1]); Вообщем я пытаюсь время и дату вывести в одном теге, а не в 6.
И что у вас возвращается? Почему вы ожидаете 6 байт? У вас вернется значение числа int32.
Лучше сначала просто вывести в server.Message результат всех элементов таблицы dest
Когда маска ответа local destMask = {"byte", "byte", "byte", "byte", "byte", "byte", "int16:3:10", "byte"} ответ 218 (номер месяца, год)
Когда маска ответа local destMask = {"byte", "byte", "byte", "byte", "byte", "byte", "int16:1:10", "int32:1:3210", "byte"} ответ 16060218(час, число месяца, номер месяца, год)
При такой маске ответа local destMask = {"byte", "byte", "byte", "byte", "byte", "byte", "int16:1:10", "int32:1:3210", "byte"} вывел через server.Message сначала все элементы dest, затем оставил только нужные
dest7 = string.format("%02X", dest[7]);
dest8 = string.format("%02X", dest[8]);
server.Message ("dest:", " ", dest7, dest8);
получилось так
06-02-2018 16:46:14.191 TESMA_PORT.TESMA_106.TimerMemory.Tag1:dest: 502416060218 (сек, мин, часы, день, месяц, год)
Как все эти числа теперь вывести в тег?
Как вариант - получить год, месяц день и прочее, собрать из этого время (есть специальные функции) преобразовать в строку и запихнуть в тег.
Можете подсказать, какая именно функция собирает из байтов время? Пробовал time.PackTime, но видимо использую не ту функцию
Даже из примера err,timesec = time.PackTime(2012,5,3,12,31,45);
ответ
07-02-2018 16:37:00.031 TESMA_PORT.TESMA_106.Group1.TIME:time: 1336037505 err: 0
а не 201253123145
Добрый день!
Можно ли изменить приоритет в протоколе Bacnet?
сейчас только 16 идет...
Время получаю правильно, но спустя 1-5 мин выбивает ошибку
08-02-2018 09:45:37.827 TIME:TESMA_PORT.TESMA_106.Group1.TIME >> [string "function CRC8 (ArrayByte)..."]:42: attempt to index local 'dest' (a nil value)
42 строка это dest7 = string.format("%02X", dest[7]); -- сек
без этой строки и других таких же для мин, час и т.д. время выводится некорректно
Весь код такой:
dest7 = string.format("%02X", dest[7]); --сек
dest8 = string.format("%02X", dest[8]); --мин
...
err,timesec = time.PackTime (tonumber (dest12), tonumber (dest11), tonumber(dest10), tonumber(dest9), tonumber(dest8), tonumber(dest7));
ts = time.TimeToTimeStamp(timesec, 0);
stringts = time.TimeStampToString(ts);
TV = stringts;
У dest стало равно nil. Возможно запрос не прошел.
Нужно проверять dest на nil перед обработкой
Здравствуйте! На компьютере стоит Скада 3.9 и OPC сервер на 500 тегов. С этого компа я управляю двумя стендами(не одновременно). OPC сервер загружает последнюю конфигурацию. Как сделать так, чтоб OPC сервер загружал правильный конфигурационный файл при запуске соответсвующего проекта?
Имя конфигурации находится в файле:
c:\ProgramData\InSAT\MasterOPC Universal Modbus Server\SERVERCFG\__startconfigv3__
Вы можете с помощью Bat файла перед стартом выполнять замену этого файла на нужный вам.
Можете скинуть шаблон этого Bat файла? Нет времени сейчас вникать в это просто
У нас такого шаблона нет.
Ищите примеры в интернете.
Добрый день, в скрипте узла написан запрос по опросу устройства. Можно ли внести в теги значения из скрипта в узле? И как?