Да, все верно.
Да, все верно.
Добрый день.
В Руководстве по языку Lua 5.1 для MasterOPC Universal Modbus Server написано, что функция server.SendAndReceiveDataByMask в скрипте должна находиться на уровне узла (узла COM). В руководстве пользователя
при реализации собственных протоколов приведен пример для протокола Rnet, где данная функция расположена в теге.
Или я что-то путаю. Как сделать правильно? Правильно ли будет разместить эту функцию в скрипте узла, расчет CRC в скрипте устройства, а в тегах все остальное?
Добрый день!
Не работает функция err,buf,len = server.SendAndReceiveData(srcbuf,srclen,dstlen).
Вот код в теге:
function OnRead()
-- инициилизация устройства
local send={1,2,3,4,5,6}; --кадр запроса
local Length=table.maxn(send); --вычисление длины запроса в байтах
local srcbuf="";
srcbuf=server.TableToString(send); --байты данных строки для посылки
server.Message("srcbuf-данные для передачи ",srcbuf);
local srclen=table.maxn(send); --количество байт данных с учетом байта CRC
server.Message("srclen-длина данных в байтах ",srclen);
local dstlen=20; --длина принимаемых данных
local err,len;
local buf="";
--запрос к устройству
server.Message("srcbuf-данные для передачи окончательные",srcbuf);
server.Message("srclen-длина данных в байтах окончательная ",srclen);
err,buf,len = server.SendAndReceiveData(srcbuf,srclen,dstlen); --посылаем и принимаем байты от устройства
--[[Входные параметры: srcbuf-данные для передачи, srclen-длина данных в байтах, dstlen-длина принимаемых данных.
err=TRUE при ошибке выполнения функции, buf – строка с принятыми данными (nil, если приема не было),
len – длина buf.--]]
--принят ответ. Проверим контрольную сумму
end
Вот лог:
[02.01.2017 18:23:51.230] Inf : Server:MasterOPC Universal Modbus Server Demo 32 Build - 3.2.20
[02.01.2017 18:23:51.231] Inf : Server:Cтарт конфигурации C:\ProgramData\InSAT\MasterOPC Universal Modbus Server\SERVERCFG\OPC_PRIBOR.mbp
[02.01.2017 18:23:51.245] SCRIPT : <<ПортCOM.Прибор5.Вход>> : ПортCOM.Прибор5.Вход:srcbuf-данные для передачи 123456
[02.01.2017 18:23:51.245] SCRIPT : <<ПортCOM.Прибор5.Вход>> : ПортCOM.Прибор5.Вход:srclen-длина данных в байтах 6
[02.01.2017 18:23:51.245] SCRIPT : <<ПортCOM.Прибор5.Вход>> : ПортCOM.Прибор5.Вход:srcbuf-данные для передачи окончательные123456
[02.01.2017 18:23:51.245] SCRIPT : <<ПортCOM.Прибор5.Вход>> : ПортCOM.Прибор5.Вход:srclen-длина данных в байтах окончательная 6
[02.01.2017 18:23:51.247] Inf : ПортCOM:Порт 1 открыт
[02.01.2017 18:23:51.247] TRACE : (COM1) Tx: [0006] 06 01 31 01 32 01
[02.01.2017 18:24:02.356] Inf : ПортCOM:Порт 1 закрыт
[02.01.2017 18:24:02.769] Inf : Server:Завершение работы
В порт уходят другие данные. В чем проблема не понятно.
Выше пример без CRC:
local srclen=table.maxn(send); --количество байт данных
Если нужно посылать в порт числа, то лучше использовать sendandrecivedatabymask.
Ознакомьтесь с этой документацией:
http://www.insat.ru/products/Univers...ver_API_UG.pdf
Добрый день!
Да, server.SendAndReceiveDataByMask() работает. Хотел упростить себе задачу и не использовать
маски преобразования. Поэтому решил использовать server.SendAndReceiveData.
Тогда в каких случаях используется функция server.SendAndReceiveData, все-таки интересно?
И еще вопрос.
Код из примера:
local err,len,lenbuf;
local bufs=""; --строка принятых байт
err,dest,len,bufs,lenbuf=server.SendAndReceiveData ByMask...
Т.е. bufs - строка принятых байт. Раз это строка, то ее вроде можно сразу отправить на подсчет CRC.
Но в примере строку преобразуем в таблицу, а таблицу опять в строку для отправки на подсчет CRC:
--преобразование из строки в таблицу байт
local buf={}; --таблица принятых байт
for i = 1, lenbuf, 1 do
table.insert (buf,string.byte(bufs,i));
end
s = server.TableToString(buf); --вызов функции для подсчета контрольной суммы CRC=server.RunFunctionFromDevice("CRCsum",1,s,lenb uf-1); и т.д.
И вот строка s получается с нормальными данными, полученными от устройства.
И на самом деле, без этого двойного преобразования не работает. Принятые данные local bufs="" - не понятно что.
Т.е. получается - понятие "строка" имеет разные значения ?
Имеется ли к Modbus Universal MasterOPC Server конфигурация на Промышленный датчик (преобразователь) влажности и температуры воздуха ОВЕН ПВТ100? Ссылка на конфигурации для различных устройств на сайте insat.ru не работает.
Спасибо.
Данный аргумент - это строка из всех символом принятых байт.
Для подсчета контрольной суммы, как правило, нужно использовать массив байт. А массивы между узлами не передаются, поэтому и преобразуются в строку. Посмотрите в документации пример 4 документации.
Готовой конфигурации нет, но учитывая что там всего 10 регистров, вы можете легко сделать ее самостоятельно штатными функциями сервера
Добрый день!
Веду опрос устройства с периодичностью 1 сек. тегом с помощью функции server.SendAndReceiveDataByMask
в скрипте - функция function OnRead(). Работает.
Для инициализации устройства для однократного выполнения тот же самый код записываю в тег
в функцию function OnInit(). Данные не отсылаются. Пробовал записать в функцию function OnInit() устройства,
тоже ничего.
Что делаю неправильно?
И, если можно, все-таки, в каких случаях используется функция server.SendAndReceiveData (спрашивал выше #454).
Так нельзя делать, в этот момент порт еще не открыт.
Нужно все делать в цикле OnRead.
Создаете вне функций переменную, например Start инициализируете ее False. В OnRead проверяете - если false, то выполняете нужный вам запрос. Запрос корректно выполнен - взводим Start в true.
Спасибо за ответы!
Здравствуйте! В декабре 2016 купили Modbas OPC безлимитный. Используется MasterSCADA на 1000 точек - планируем расширение. На ПК используется WinXP - перейти на 7-ку нет возможности - основной контроль через OPC BRC Server Version IW-SCP 4_0, который работает только под XP. При установке и последующем запуске выдает сообщение "Точка входа в процедуру InterlockedCompareExchange64 не найдена". Вопрос - можно ли как нибудь заставить работать Ваш сервер под XP? Интересно, демо-версия устанавливается и работает без нареканий...
С уважением...
Демо версия той же версии? Или более ранняя? Попробуйте на текущей.
В связи с переходом на новый компилятор и прекращением поддержки Windows XP наш ОРС сервер более в ней не работает. Можно попробовать установить на XP последние доступные обновления - тогда может заработать.
Спасибо, попробуем. А если под 7-кой попробовать для замены OPC BRC Server Version IW-SCP 4_0 Ваш мультипротокольный сервер? Этот OPC BRC Server Version IW-SCP 4_0 из IndraWorks. Modbus пригодится для другого оборудования.
С уважением...
Вложение 28791
Это наш проект. Вместо первого на 32 точки куплен безлимитный. Второй зверек - стандартный OPC DA сервер. Находится через поиск - СКАДА его видит. В этой машине 14822 переменных - начальство хочет каждый чих писать с трендами и отчетами. Когда заказывали Modbus OPC server U никто не предупредил...
Так в чем вопрос?
Судя по скриншоту на Windows 7 он запустился.
Очень часто ПО разработанное для XP нормально работает на Windows 7 если выключить UAC или инсталлировать его не в Program Files.
Это скриншот с домашнего ноута. На рабочей машине - Win XP. Каким компилятором пользуетесь? Буду копать в том направлении...
Компилятор Embarcadero RAD Studio
Спасибо! Будем пробовать по всем направлениям. Если получится - планируем взять Вашу безлимитную MasterSCADA.
Аналогичная проблема. WinXP SP2.
Вложение 28853
Скопировал dll проблему не решило.
Windows XP более не поддерживается. Используйте более современные ОС
Добрый день!
Преобразованием в скрипте получаю десятичное число float c 5 знаками после запятой, после записываю в тег.
Как преобразовать в число с одним знаком после запятой в скрипте?
Спасибо.
С помощью функции
math.floor(val*10)/10
На 3-м сервис паке у нас некорректно работает другое ПО
К сожалению других вариантов предложить не можем.
Старые версии ОРС серверов мы не собираем.
Пытаюсь прочитать через ОРС мдвв, но не получается, всё время в качестве пишет BAD. Конфигурацию использую готовую, т.е импортированную для мдвв.
Настройки мдвв:
Скорость обмена данными: 115200
Длина слова данных: 8
Тип контроля чётности: Отсутствует
Кол-во стоп битов: 1
Длина сетевого адреса: 8
Базовый адрес прибора: 16
Протокол обмена: Modbus-RTU
Максимальный сетевой тайм-аут: 0
Задержка ответа по RS-485: 2 мс
Настройки в ОРС: Узел <<COM RTU-Master>>:mdvv1
Включен в работу: True
Порт: 13
Скорость: 115200
Данные: 8
Контроль четности: Нет
Стоп-биты: 1
Межсимвольный таймаут: 0
Использовать ASCII: False
Использовать модем: False
Вот что пишет:
25-01-2017 11:01:04.716 mdvv1.МДВВ:Включен таймаут ошибки запроса 1
25-01-2017 11:01:04.716 МДВВ:Ошибка выполнения команды 3 в устройстве 16 от МДВВ:HOLDING_REGISTERS
25-01-2017 11:01:03.684 МДВВ:Запрос 1:МДВВ:HOLDING_REGISTERS
25-01-2017 11:01:02.653 МДВВ:Запрос 1:МДВВ:HOLDING_REGISTERS
25-01-2017 11:01:01.623 МДВВ:Запрос 1:МДВВ:HOLDING_REGISTERS
25-01-2017 11:01:01.623 mdvv1:Порт 13 открыт
25-01-2017 11:01:01.608 Server:Cтарт конфигурации C:\ProgramData\InSAT\MasterOPC Universal Modbus Server\SERVERCFG\mdvv1.mbp
25-01-2017 11:01:01.608 Server:MasterOPC Universal Modbus Server Demo 32 Build - 3.0.0.7
МДВВ к ПК подключен через АС4 USB-RS485 адаптер.
Где копать ?
Порт открывает, но прибор не отвечает.
Подключитесь конфигуратором к МДВВ, проверьте еще раз все настройки в нем - адрес, скорость, честность, стоп-биты, протокол.
После этого отключите конфигуратор. Выключите питание прибора и включите снова - после этого проверяйте
всё заработало после выключения включения питания. Никогда бы не подумал, что надо выключать включать питание, чтобы настройки применились. Спасибо за помощь.
Совершенно не надо отключать модуль. Нажмите в конфигураторе кнопку "инициализация".
И Modbus и Multi-Protocol XP более не поддерживают. ОС снята с поддержки Microsoft и компиляторы перестают с ней работать.
Нет, Modbus то работает на sp3