Зачем?
Может быть просто опрашивать каждый канал отдельным запросом?
Зачем?
Может быть просто опрашивать каждый канал отдельным запросом?
192 - это константа признака качества GOOD
Меня смутил знак "~=". Погуглил, понял,что имелось ввиду "!="
На языке Lua оператор "Не равно" обозначается как ~=
Ясно, не вникал ещё в Lua, спасибо.
То есть, как я понял в настройках устройства нужно выставить выполнение скрипта и ,соответственно, в скрипте прописать server.SetCurrentDeviceRetry(2). Только почему то не работает...Цитата:
Настройкой у устройства имелось ввиду сделать количество повторов.
Либо можно получить количество повторов устройства через функцию server.GetCurrentDeviceRetry( );
Не нужно ничего этого делать.
Все это описывалось если вы хотите сделать количество повторов не константой, а изменяемым значением. Если нужно чтобы количество повторов равнялось заданному в устройстве, то просто измените код на:
count=0;
-- Initialization
function OnInit()
end
-- Uninitialization
function OnClose()
end
-- Processing
function OnRead()
val,qual=server.ReadCurrentTag();
if qual~=192 and count<server.GetCurrentDeviceRetry( ) then
server.PollCurrentDevice( );
count=count+1;
end;
end
Понял) То есть без дополнительного тэга никак.
Подскажите, пожалуйста:
Объявляю в конфигурации ПЛК MODBUS TCP Master, создаю в нём несколько тэгов и среди них тэг: 32bit output module
Создаю в Master OPC Server Modbus TCP SLAVE с соответствующим набором тэгов.
Присваиваю 32bit output module в ПЛК значение 16#FFFFFF00 - вижу в сервере правильное значение,
Присваиваю 16#FFFFFF01, значение в сервере не меняется - 16#FFFFFF00, хотя вижу в "запросах" данные передаются корректно.
Присваиваю 16#FFFFFFFF, значение в сервере 0.
Меняю в сервере свойство тэга "тип данных в сервере" с UINT32 на DOUBLE и всё становится хорошо.
Вопрос: почему не работает тип данных в устройстве UINT32 = в сервере UINT32 - для тэга ПЛК 32bit output module ?
Ошибка проявилась.
Ошибка будет исправлена в следующей версии (3.1.3)
Сообщите, пожалуйста когда появится новая версия.
Вопрос для самоконтроля: для того чтобы тэг TCP мастера работал в режиме передачи "по изменению значения", период опроса ставим в ноль, правильно? Уже поставил и работает, спрашиваю, потому что в ПЛК для этого есть отдельная опция "by value change", а здесь нет.
Новая версия выложена на сайт.
Хочу получать время последнего удачного опроса. Создаю тег timeofpoll (server_only, int32). В скрипте после чтения прописываю:
Но после опроса никаких значений нет. Что я делаю не правильно?Код:-- Initialization
function OnInit()
end
-- Uninitialization
function OnClose()
end
-- Processing
function OnRead()
val,qual=server.ReadCurrentTag();
if qual==192 then
timeofpoll= time.TimeNow( );
end;
end
Вы делаете неправильно. Во первых, вы не производите запись в тег (для этого есть специальные функции). Во-вторых тег ServerOnly никак не может определить был ли опрос корректным или нет. В-третьих, вы пытаетесь в тег типа Int записать время - так не получится.
Вам нужно сделать так - при помощи тега ServerOnly отследить признак качества другого тега, который непосредственно опрашивает регистр. Если признак будет достоверным, то произвести запись в текущий тег любого значения - оно запишется с текущей меткой времени.
function OnRead()
val,qual=server.ReadTagByRelativeName("Tag1");
if qual==192 then
server.WriteCurrentTag(true,192);
end;
end
На верхнем уровне - отслеживайте метку времени времени этой переменной. В MasterSCADA для этого есть функция расчета TimeStamp( ), также ФБ "Метка времени" (закладка "Работа со временем" палитры ФБ).
Огромное спасибо, всё получилось.
Выявился странный глюк. Почему то опрос устройства повторяется несколько раз:
Количество повторов равняется заданному количеству повторов при ошибке, но при этом не выдерживается время между повторами. И ошибок нет при опросе. Т.е. все переменные ОК, кроме тех, которые SERVER_ONLY (они COM_FAILURE)Код:06-01-2015 21:01:16.087 гайдара-99а.гайдара-99а:Стоп опроса устройства (t = 3101 ms) (H42 0,3091,10 )
06-01-2015 21:01:12.986 гайдара-99а.гайдара-99а:Старт опроса устройства
06-01-2015 21:01:12.986 гайдара-99а.гайдара-99а:Стоп опроса устройства (t = 8099 ms) (H42 0,3091,8 )
06-01-2015 21:01:04.886 гайдара-99а.гайдара-99а:Старт опроса устройства
06-01-2015 21:01:04.886 гайдара-99а.гайдара-99а:Стоп опроса устройства (t = 8426 ms) (H42 0,3421,4 )
06-01-2015 21:00:56.461 гайдара-99а.гайдара-99а:Старт опроса устройства
06-01-2015 21:00:56.461 гайдара-99а.гайдара-99а:Стоп опроса устройства (t = 8641 ms) (H42 0,3630,11 )
06-01-2015 21:00:47.819 гайдара-99а.гайдара-99а:Старт опроса устройства
06-01-2015 21:00:47.819 гайдара-99а.гайдара-99а:Стоп опроса устройства (t = 8991 ms) (H42 0,1496,4 )
06-01-2015 21:00:41.319 гайдара-99а:Соединение установлено хх.хх.ххх.х ххх
06-01-2015 21:00:38.829 гайдара-99а:Попытка соединения хх.хх.ххх.х ххх
06-01-2015 21:00:38.828 гайдара-99а.гайдара-99а:Старт опроса устройства
06-01-2015 21:00:38.822 Server:Cтарт конфигурации C:\ProgramData\InSAT\MasterOPC Universal Modbus Server\SERVERCFG\test.mbp
06-01-2015 21:00:38.822 Server:MasterOPC Universal Modbus Server Demo 32 Build - 3.1.3
Пришлите несколько скриншотов описывающих проблему. Также пришлите лог обмена с устройством. Для этого в свойствах сервера включите запись журнала и всех его событий, размер лога задайте равным 10000. Запустите режим исполнения и воспроизведите ошибку. Лог пишется в папку:
c:\Documents and Settings\All Users\Application Data\InSAT\MasterOPC Universal Modbus Server\SERVERLOGS\
Лог заархивируйте и вышлите нам.
Также пришлите конфигурацию ОРС сервера.
Прилагаю лог и конфигурацию.
Вложение 16032
Насколько я понял проблема (если это можно отнести к проблеме) связана с тем что переменные server only после опроса остаются в comm_failure и происходит повторный опрос, т.к. если их удалить из конфигурации, то такого не наблюдается.
Да, тег ServerOnly не будет меняться, если в него что либо не записать (скриптом или ОРС клиентом).
Сейчас внеочередной опрос у вас вызывает тег reconnect. Что вы хотите им сделать?
Сейчас у вас такой код:
function OnRead()
val,qual=server.ReadCurrentTag();
if qual~=192 and count<4 then
server.Sleep(5000);
server.PollCurrentDevice( );
count=count+1;
end;
end
Зачем вы анализируете признак качества тега ServerOnly? Вы хотите контролировать были ли теги опрошены? Тогда анализируйте обычные Modbus теги, при помощи функции server.ReadTagByRelativeName.
Изменил скрипт:
В итоге в логе получаюКод:-- Processing
function OnRead()
t, q, ts = server.ReadTagByRelativeName("гайдара-99а.гайдара-99а.Pust");
if q~=192 and count<4 then
server.Sleep(5000);
server.PollCurrentDevice( );
count=count+1;
end;
end
И соответственно, повторной попытки соединения нетКод:[07.01.2015 15:07:19.970] Err : гайдара-99а:ошибка установления соединения хх.хх.ххх.хх 502
[07.01.2015 15:07:19.970] SCRIPT : <<reconnect>> : reconnect:гайдара-99а.гайдара-99а.reconnect >> ReadTagByRelativeName : тег не найден
[07.01.2015 15:07:19.970] SCRIPT : <<timepoll>> : timepoll:гайдара-99а.гайдара-99а.timepoll >> ReadTagByRelativeName : тег не найден
[07.01.2015 15:07:19.970] Inf : гайдара-99а.гайдара-99а:Ошибка опроса устройства
Спасибо, разобрался. 2 тега оказались лишними, записал скрипт в текущий тег
Здравствуйте!
Вопрос начинающего.
Необходимо производит опрос 4 функцией Modbus аналогично этому: Вложение 16058, Вложение 16059. Пытаюсь это сделать по примеру из руководства Вложение 16060, Вложение 16061. Запрос-ответ есть, но как получить десятичное число из 4х байтного ответа не могу разобраться?
Да, Float с регионом InputRegisters получилось, но для того, что бы разобраться, что не правильно делаю Вложение 16087,
local destmask={"byte","byte","float:10325476"};
вроде и тип переменной правильный и последовательность байт?
И как применять modbus.ReadInputRegistersAsFloat( ) совместно с server.SendAndReceiveDataByMask? Если можно, пример.
Помогите, пожалуйста. Необходимо читать получаемые значения с модуля МСД-200(ТРМ-210 подключен к RS2) в Master OPC (на компьютере подключенному к RS1). Не могу разобраться. Выручайте. Приложил файл для конфигуратора МСД-200.
Вы хотите читать архивные значения или действующие значения?
Вам лучше обратится в техподдержку компании ОВЕН - узнайте как получить адреса Modbus регистров для опроса.
Что означает сообщение "Ошибка в процедуре записи 14"? Не могу найти описание ошибок...
Приложите скриншот ошибки и опишите обстоятельства при которых она проявляется.
Ошибка появляется при попытке произвести запись в один из тэгов
Вложение 16258
Вложение 16259
Вложение 16260
Пришлите лог обмена с устройством. Для этого в свойствах сервера включите запись журнала и всех его событий, размер лога задайте равным 10000. Запустите режим исполнения и воспроизведите ошибку. Лог пишется в папку:
c:\Documents and Settings\All Users\Application Data\InSAT\MasterOPC Universal Modbus Server\SERVERLOGS\
Лог заархивируйте и вышлите нам.
Также пришлите конфигурацию ОРС сервера.
Лог и конфигурация во вложении
Вложение 16261
Ошибку вызывает set_yy. У вас у него установлен тип данных в устройстве double. Скорее всего вы имели ввиду int16 (остальные теги у вас имеют этот тип).
Рекомендуем также обновить версию до текущей 3.1.3.
Нет, дело в том, что в плк стоит тип 4byte, который в программе преобразуется как нужно. Пробовал и int32 и double, в общем различные варианты, отправил последний, так как он хотя читает информацию.
4 byte - это 2 Modbus регистра. Double - 8 байт, 4 Modbus регистра. Вам нужно установить Int32.
У вас ПЛК ОВЕН?
Почему у вас используется запись командой 6? Нельзя использовать 0x10?
И зачем вы установили такой тип данных? Вы ожидаете что ваша система проработает до 32 767 года?