Не совсем понятно. Что значит кусок ответа? Для Ethernet не типично рвать пакеты.
Какой у вас канал связи?
Вид для печати
Не совсем понятно. Что значит кусок ответа? Для Ethernet не типично рвать пакеты.
Какой у вас канал связи?
Тем не менее, в логе запросов ответ расчленялся на отдельные куски, которые принимались за ответы на несколько запросов
Связь через 127.0.0.1 идёт
У вас имитатор Modbus устройства?
Выложите конфигурацию и лог с запросами.
Имитатор этот http://www.plcsimulator.org/Home
Конфигурацию и лог не могу выложить, текущая конфигурация следит за обменом
Когда будет время, я постараюсь создать аналогичную и без лишних кусков
Добрый день.
Нужно выводить окно объекта каждый час, некое всплывающее окно напоминания. Окно собирался выводить при помощи События. Если научите выводить через скрипт - еще лучше. Как сделать?
Можно поступить проще. Воспользуйтесь закладкой объекта "Расписание" - с ее помощью можно открывать окно через определенные интервалы времени.
Вышел из отпуска
В приложении проект, демонстрирующий проявление ошибки
Вот фрагмент лога, когда она появляется
Обратите внимание, сначала одновременно отсылается два разных запроса, до того, как был получен хоть какой-то ответКод:04-08-2014 09:32:29.511 Node1::Device1:(10.0.3.2:502) Rx: [0011] 19 00 00 00 00 05 01 03 02 00 01
04-08-2014 09:32:29.461 Node1::Device1:(10.0.3.2:502) Tx: [0012] 19 00 00 00 00 06 01 03 00 00 00 01
04-08-2014 09:32:29.251 Node1::Device1:(10.0.3.2:502) Rx: [0011] 18 00 00 00 00 05 01 03 02 00 01
04-08-2014 09:32:29.201 Node1::Device1:(10.0.3.2:502) Tx: [0012] 18 00 00 00 00 06 01 03 00 00 00 01
04-08-2014 09:32:29.171 Node1::Device1:(10.0.3.2:502) Tx: [0012] 17 00 00 00 00 06 01 03 00 00 00 01
04-08-2014 09:32:29.151 Node1::Device1:(10.0.3.2:502) Tx: [0012] 16 00 00 00 00 06 01 03 00 00 00 01
04-08-2014 09:32:29.101 Node1::Device1:(10.0.3.2:502) Rx: [0001] 01
04-08-2014 09:32:29.081 Node1::Device1:(10.0.3.2:502) Tx: [0012] 00 00 00 00 00 06 01 03 00 01 00 01
04-08-2014 09:32:29.041 Node1::Device1:(10.0.3.2:502) Tx: [0012] 15 00 00 00 00 06 01 03 00 00 00 01
<...>
04-08-2014 09:32:28.109 Node1::Device1:(10.0.3.2:502) Tx: [0012] 03 00 00 00 00 06 01 03 00 00 00 01
04-08-2014 09:32:28.069 Node1::Device1:(10.0.3.2:502) Rx: [0004] 01 03 00 01
04-08-2014 09:32:28.059 Node1::Device1:(10.0.3.2:502) Tx: [0012] 02 00 00 00 00 06 01 03 00 00 00 01
04-08-2014 09:32:27.989 Node1::Device1:(10.0.3.2:502) Tx: [0012] 00 00 00 00 00 06 01 03 00 01 00 01
04-08-2014 09:32:27.979 Node1::Device1:(10.0.3.2:502) Tx: [0012] 01 00 00 00 00 06 01 03 00 00 00 01
Ошибка нестабильная. Её можно получить с большей вероятностью если в опрашиваемом устройстве задать задержку ответа побольше, вплоть до 1с.
У вас ключевая версия или Demo?
Попробуйте проверить на текущей версии на 32 точки (версия 3.0.0.5) - мы исправляли подобную ошибку.
Демо на 32 тега
На версии 3.0.0.5 поведение такое:
Код:04-08-2014 13:07:49.575 Node1::Device1:(10.0.3.2:502) Rx: [0011] 00 00 00 00 00 05 01 03 02 00 0F
04-08-2014 13:07:49.525 Node1::Device1:(10.0.3.2:502) Tx: [0012] 00 00 00 00 00 06 01 03 00 01 00 01
04-08-2014 13:07:49.515 Node1::Device1:(10.0.3.2:502) Rx: [0008] 00 00 00 05 01 03 00 01
04-08-2014 13:07:48.524 Node1::Device1:(10.0.3.2:502) Rx: [0003] 03 00 02
04-08-2014 13:07:48.504 Node1::Device1:(10.0.3.2:502) Tx: [0012] 00 00 00 00 00 06 01 03 00 01 00 01
04-08-2014 13:07:48.504 Node1::Device1:(10.0.3.2:502) Rx: [0000]
04-08-2014 13:07:48.504 Node1::Device1:(10.0.3.2:502) Tx: [0012] 04 00 00 00 00 06 01 03 00 00 00 01
04-08-2014 13:07:47.502 Node1::Device1:(10.0.3.2:502) Tx: [0012] 00 00 00 00 00 06 01 03 00 01 00 01
04-08-2014 13:07:47.502 Node1::Device1:(10.0.3.2:502) Tx: [0012] 03 00 00 00 00 06 01 03 00 00 00 01
04-08-2014 13:07:47.292 Node1::Device1:(10.0.3.2:502) Rx: [0000]
04-08-2014 13:07:47.292 Node1::Device1:(10.0.3.2:502) Rx: [0011] 02 00 00 00 00 05 01 03 02 00 01
04-08-2014 13:07:46.501 Node1::Device1:(10.0.3.2:502) Tx: [0012] 00 00 00 00 00 06 01 03 00 01 00 01
04-08-2014 13:07:46.301 Node1::Device1:(10.0.3.2:502) Rx: [0001] 00
04-08-2014 13:07:45.299 Node1::Device1:(10.0.3.2:502) Tx: [0012] 00 00 00 00 00 06 01 03 00 01 00 01
04-08-2014 13:07:45.299 Node1::Device1:(10.0.3.2:502) Rx: [0003] 01 03 00
04-08-2014 13:07:45.279 Node1::Device1:(10.0.3.2:502) Tx: [0012] 02 00 00 00 00 06 01 03 00 00 00 01
04-08-2014 13:07:44.288 Node1::Device1:(10.0.3.2:502) Tx: [0012] 00 00 00 00 00 06 01 03 00 01 00 01
04-08-2014 13:07:44.278 Node1::Device1:(10.0.3.2:502) Tx: [0012] 01 00 00 00 00 06 01 03 00 00 00 01
У вас в устройстве есть тег, и также вы вызываете собственную функцию с запросом из другого узла. Зачем вы так делаете? Что вы хотите получить?
Сейчас получается следующее - при вызове функции SendAndRecive происходит очищение входного буфера, и принятые байты затираются. Второй запрос замещает первый и принимает оставшиеся байты, естественно уже некорректные. То есть у вас происходит перехлестывание запросов.
Вам нужно реализовать обмен по одному из способов - либо только теги Modbus, либо программные теги, и чтение при помощи функции SendAndRecive.
Я об этом и писал с самого начала
Сейчас разъясню зачем это было сделано
В моей конфигурации скрипт готовит пакет для отправки его на узел
Если связи с узлом нет, работа с другим узлом сильно замедляется (пока скрипт ждёт ответа узла с проблемой связи)
Чтобы такого не происходило, я добавил обычный тег в устройство.
Если у него установлен плохой признак качества, это означает, что связи с узлом нет и нет смысла пробовать ему что-то отсылать
Плюс к тому обычный тег сам "следит" за реинициализацией узла при необходимости.
Если есть другой способ организовать работу, хотелось бы его узнать.
Требования: контроль связи с узлом независимо от других; автоматическая реинициализация узла; отсылка пакетов с помощью скрипта.
Я вызываю из скрипта устройства в одном узле функцию в другом узле, которая обменивается данными с этим узлом. До тех пор, пока "другой узел" не ответит или не выйдет время ожидания, обмен информацией с первым узлом происходить не будет т. к. выполнение скрипта предыдущего обмена ещё не закончилось.
А почему вы делаете именно так - вызываете функцию обмена с устройством, из другого узла? Почему нельзя вызывать ее в функции BeforeReading в самом узле?
P.S. И скачайте снова версию на 32 точки - мы поправили одну ошибку при работе функции SendAndReciveDataByMask
Потому что данные для обмена готовит скрипт другого узла
Вы предлагаете вместо непосредственно отправки сохранять их в узле и работать с обменом узлу самостоятельно?
Что было исправлено в последней версии?
Проверьте на версии 3.0.0.5 вашу конфигурацию - мы исправили вероятность появления коллизий при перехлесте запросов.
Можно.
Только нужно не выключаться опрос устройства, а прописать период опроса - 0, и отключить настройку "Старт после запуска". После этого можно вызывать опрос при помощи фукции
server.PollDeviceByName( );
Вот, пожалуйстаКод:06-08-2014 10:48:21.690 Node1::Device1:(10.0.3.2:502) Tx: [0012] 00 00 00 00 00 06 01 03 00 01 00 01
06-08-2014 10:48:21.142 Node1::Device1:(10.0.3.2:502) Rx: [0011] 00 00 00 00 00 05 01 03 02 00 00
06-08-2014 10:48:20.674 Node1::Device1:(10.0.3.2:502) Tx: [0012] 00 00 00 00 00 06 01 03 00 01 00 01
06-08-2014 10:48:19.549 Node1::Device1:(10.0.3.2:502) Rx: [0011] 00 00 00 00 00 05 01 03 02 00 00
06-08-2014 10:48:19.520 Node1::Device1:(10.0.3.2:502) Tx: [0012] 00 00 00 00 00 06 01 03 00 01 00 01
06-08-2014 10:48:19.313 Node1::Device1:(10.0.3.2:502) Rx: [0000]
06-08-2014 10:48:18.332 Node1::Device1:(10.0.3.2:502) Tx: [0012] 00 00 00 00 00 06 01 03 00 01 00 01
06-08-2014 10:48:18.332 Node1::Device1:(10.0.3.2:502) Rx: [0022] 00 00 00 00 00 05 01 03 02 00 00 00 00 00 00 00 05 01 03 02 00 00
06-08-2014 10:48:15.162 Node1::Device1:(10.0.3.2:502) Tx: [0012] 00 00 00 00 00 06 01 03 00 01 00 01
Вы проверяли на той же конфигурации?
Выложите ее. Как долго вы ждете для воспроизведения ошибки.
Также приложите полный лог.
Это запросы из вашего скрипта? Вам нужно менять Transaction ID - это позволит избежать подобных ошибок.
Да, конфигурация ровно та же
Подчинённое устройство отвечает с задержкой в 1 секунду
Лог, который я прикладывал, идёт с запуска ОРС сервера, т. е. в данном конкретном случае ждать пришлось около четырёх секунд. Затем ошибки повторяются через разные промежутки времени.
Вот более длинный аналогичный лог
Лог:
Проблема в том, что вы применяете функцию SendAndRecive без всякого контроля (вы не проверяете поступил ответ или нет). Кроме того у вас указан максимальный размер приемного буфера - 255. Поэтому, если по какой то причине ответ от устройства не успел поступить, то сервер сначала выдает пустой ответ, а затем принимает следующий за ним который состоит уже из двух.
Вам нужно сделать полный контроль достоверности приема данных.
Либо используйте функции из раздела Modbus - в них эти нюансы учитываются.
Вы правы, на моей тестовой конфигурации дело оказалось в слишком маленьком времени ожидания ответа устройства.
Функции из раздела Modbus не совсем удобны в том плане, что смешать обновление регистров разных типов не удастся, а от ExtFunction я отказался уже достаточно давно
Добрый день.
1. Как в скрипте выйти без подтверждения из режима исполнения?
2. Как в скрипте получить имя текущего оператора?
Нет, чередование байт тогда я реализовал своей функцией
Просто ExtFunction пытается сама обрабатывать если устройство ответило ошибкой, меня это не устраивает
В секцию using добавить
using MasterSCADALib;
код:
MasterSCADAHlp.Instance.ToDesign(EApplicationOpFla gs.aofIgnorePermissions | EApplicationOpFlags.aofAsyncCall);
Работает начиная с версии 3.6
HostFB.TreeItemHlp.Project.RTPermissions.CurrentUs er
Добрый день
Возникла необходимость реализации рецепта, по типу, как на картинке:
Вложение 14008
Описание:
1. Количество этапов N задается пользователем в режиме исполнения
2. Возможность загрузки и сохранения каждой строки таблицы
Т.е. происходит некий процесс в несколько этапов с разной длительностью, в каждом из этапов параметры должны быть такими, как задано в таблице, по окончанию данного этапа происходит переход на следующий до завершения.
Как понимаю стандартными средствами такое не реализовать? Если можно сделать что то похожее то как?
Штатными средствами можно сделать только если заранее известно количество шагов (или хотя бы их максимальное количество).
Если это неизвестно, то тогда нужно писать собственный ВФБ. Инструкция по созданию ВФБ прилагается к MasterSCADA - в разделе "документация"
В MasterSCADA возможно создать "вогнутый" объёмный элемент?
Вогнутый нельзя.
Можете попробовать сделать его сторонним редактором и импортировать как рисунок.
Хм... Жаль
Ещё вопрос
Использую MasterSCADA 3.5 и MasterOPC 3.0
ОРС-сервер запускается непосредственно скадой и, по задумке, автоматически завершает свою работу после остановки скады
Однако достаточно часто этого не происходит, причём если открыть окно ОРС-сервера, внизу написано, что остался один HDA-клиент
К сожалению, не нашёл где можно увидеть список клиентов, чтобы узнать скада ли это остаётся или какая-то другая программа. Могу лишь сказать, что если не трогать ОРС-сервер и перезапустить скаду несколько раз, клиентов становится всё больше и больше
Подскажете что можно с этим сделать?
Добрый день , подскажите как сделать так, чтобы при нажатии на созданную кнопку, появлялось окошко на подобии этого
Вложение 14053
Но только, чтобы я мог поставить свой заголовок и убрать опцию заблокировать.
Можно ли это сделать без создания ВФБ?
Свой заголовок сделать нельзя, а вот ввод через подобное окно можно.
Вытащите на мнемосхему правой кнопкой мыши дискретную команду и выберите контрол "Редактируемое значение". В свойствах редактируемого значения, на вкладке "Значения" уберите содержимое полей значений - в итоге вы получите пустой контрол. Положите его поверх вашей кнопки - теперь при нажатии будет появляться окно ввода дискретного значения. Галочки "Заблокировать" там не будет