|
Вопросы о Matrix Работа и применение контроллеров Matrix. |
|
Опции темы | Поиск в этой теме |
29.10.2019, 14:59 | #91 | ||
Senior Member
Регистрация: Nov 2017
Сообщения: 561
Благодарил(а): 3 раз(а)
Поблагодарили:
38 раз(а) в 30 сообщениях
|
Ответ: Функционал
Цитата:
Извлечь последние 10 значений из базы: Код:
plink -pw segnetics root@192.168.111.2 sqlite3 -csv /projects/history_data/data.sqlite 'select datetime(timestamp/1000,'\''unixepoch'\''),id_variable,real_value,int_value from value order by timestamp desc limit 10;' Цитата:
Если вспоминать анекдоты, то здесь подходит такой: - Доктор, когда я делаю вот так, у меня тут болит. - А Вы так не делайте. |
||
Благодарность от: |
29.10.2019, 18:11 | #92 | |
Senior Member
Регистрация: May 2010
Адрес: Novosibirsk
Сообщения: 761
Благодарил(а): 1 раз(а)
Поблагодарили:
10 раз(а) в 10 сообщениях
|
Ответ: Функционал
Цитата:
1. Здесь ключевое поле будет состоять из двух столбцов timestamp и id_variable. 2. К каждому значению переменной будет добавляться timestamp это примерно удвоение объема данных 3. Переменная не может быть одновременно real_value и int_value. Одно поле лишнее - это примерно утроение объема сохраняемых данных Чтобы компенсировать, необходимо вводить апертуры и сжимать данные. 4. При чтении нескольких значений для конечного представления добавится объединение. 5. Некоторые значения могут быть пропущены и при объединении заменятся на NULL, придется подставлять старые данные. Либо это делать дальше при отображении. 6. Теряется сам NULL как показатель, что данные были недостоверные. Придется заменить либо +Inf либо -Inf. Теряется автоматическое заполнение. Понятно, что способ плохенький. Ограничения тоже понятны. Единственный (на мой взгляд) правильный выход - поле с двоичными данными, что и сделано например у Siemens на сервере данных. У других не видел. Пока это не мой уровень. __________________ В жизни 2 правила успеха: 1 Не говори всего что знаешь 2 ... |
|
29.10.2019, 20:48 | #93 |
Senior Member
Регистрация: May 2010
Адрес: Москва
Сообщения: 862
Благодарил(а): 4 раз(а)
Поблагодарили:
86 раз(а) в 67 сообщениях
|
Ответ: Функционал
Какое отношение имеет это соревнование в длине "аргументов" к контроллерам Matrix?
|
29.10.2019, 22:17 | #94 | ||
Senior Member
Регистрация: May 2010
Адрес: Novosibirsk
Сообщения: 761
Благодарил(а): 1 раз(а)
Поблагодарили:
10 раз(а) в 10 сообщениях
|
Ответ: Функционал
Цитата:
Цитата:
Правильно брать протестированные версии с официального репозитория сообщества. В Вашем случае с Вашего репозитория. Остальное на свой страх и риск и требуется тестирование и наработка. Это Вы так же отмечали посте про репозитории. Например мы поставили с репозитория дебиана. Собранные данные нужно как-то передать в базу данных. Готового интерфейса от Вас нет - это значит через С,С++ и др. Собирать данные с 485 интерфейса и вашей шины, можно через только через лоджик, так как это обмен через драйверы уровня ядра. Передать в базу далее можно будет только по одной переменной через шмемы. Это непреодолимое препятствие. Больше нескольких десятков каналов терпения не хватит. Пока Вами (ни у кого другого просто нет доступа) не будет решен вопрос с формированием массивов и передачи массива хотя бы с входов в шмемы, нет смысла даже пробовать, как бы руки ни чесались. Нужны связи типа массив. __________________ В жизни 2 правила успеха: 1 Не говори всего что знаешь 2 ... |
||
29.10.2019, 22:31 | #95 | |||
Senior Member
Регистрация: Nov 2017
Сообщения: 561
Благодарил(а): 3 раз(а)
Поблагодарили:
38 раз(а) в 30 сообщениях
|
Ответ: Функционал
Собирать данные с 485 совсем не обязательно через лоджик. И по скоростному интерфейсу, я думаю, если очень захотеть, то можно забирать данные напрямую.
Добавлено через 2 минуты Цитата:
Цитата:
Добавлено через 5 минут Цитата:
Если сбор идет интервалами, то, если допустимо, можно фиксировать только одно значение времени -- средину этого интервала. Отдельные колонки в БД имеет смысл делать, если они нужны для построения запросов (фильтров). Иначе, можно все упаковать в одну строку. |
|||
29.10.2019, 23:02 | #96 | |
Senior Member
Регистрация: May 2010
Адрес: Novosibirsk
Сообщения: 761
Благодарил(а): 1 раз(а)
Поблагодарили:
10 раз(а) в 10 сообщениях
|
Ответ: Функционал
Цитата:
При этих цифрах функционал это далеко не только железка. Тут есть чего обсудить. __________________ В жизни 2 правила успеха: 1 Не говори всего что знаешь 2 ... |
|
30.10.2019, 08:52 | #97 | ||||
Senior Member
Регистрация: May 2010
Адрес: Novosibirsk
Сообщения: 761
Благодарил(а): 1 раз(а)
Поблагодарили:
10 раз(а) в 10 сообщениях
|
Ответ: Функционал
Цитата:
И сделать свой опрос. Поднять службу, настроить systemd, определить какой нужен и проверить джиттинг. Решить что делать если цикл сместился - задержать все последующие, начать следующий раньше, пропустить. Решить синхронизировать ли приход всех параметров со всех модулей или запустить в параллель. Нас не устроил OPC Сервер от ICPCON мы сделали свой опрос MODBUS TCP. Сложная, трудоемкая задача. Но у нас не было выхода. Было несколько сбоев обмена в сутки. Задача должна решаться на уровне Сегнетикс. Цитата:
Хотел бы показать на картинке образец, да у меня закончился лимит. Как говорят наши коллеги "Все, что хотел сказать я все сказал а все что хотел промолчать я все промолчал." Цитата:
Цитата:
У меня дальше было 2 варианта MS Office или самодельный trend viewer. И в том и другом случае меньше затрат и на код и на чтение с таким как у меня подходом. А когда я пробовал передать данные на WEB страницу по методу ATS, то лучше паковать в JSON, тогда уж и хранить лучше timestamp + поле типа JSON (в Postgres). Это не пробовал и это как бы ручная настройка. Если производитель выберет способ уже можно смотреть и приспосабливаться. Напоследок пример web интерфейса. Издевательство над моим мозгом. Предел около 10000 параметров в секунду: https://ni.github.io/webvi-examples/..._Web%20Server/ Доказывает реализуемость web интерфейса, если сделать попроще. __________________ В жизни 2 правила успеха: 1 Не говори всего что знаешь 2 ... |
||||
30.10.2019, 09:39 | #98 | ||
Senior Member
Регистрация: Nov 2017
Сообщения: 561
Благодарил(а): 3 раз(а)
Поблагодарили:
38 раз(а) в 30 сообщениях
|
Ответ: Функционал
Цитата:
Цитата:
|
||
30.10.2019, 14:59 | #99 | |||||
Senior Member
Регистрация: Aug 2013
Сообщения: 3 784
Благодарил(а): 12 раз(а)
Поблагодарили:
194 раз(а) в 190 сообщениях
|
Ответ: Функционал
Цитата:
Вот порты при этом уже используются монопольно. Да и синхронизации там нет. Цитата:
Цитата:
Цитата:
Цитата:
Сделано аналогично. А вот визуализацию в Смарте на основе FBD считаю точно тупиковой. Последний раз редактировалось ATS, 30.10.2019 в 15:11 |
|||||
30.10.2019, 15:53 | #100 |
Новичок
Регистрация: Nov 2009
Сообщения: 22
Благодарил(а): 0 раз(а)
Поблагодарили:
0 раз(а) в 0 сообщениях
|
Ответ: Функционал
Прошу прощения за простой вопрос: я правильно понимаю, что в новом контроллере будет тот же SMLogik в качестве среды программирования?
|
30.10.2019, 16:20 | #101 |
Senior Member
Регистрация: May 2010
Адрес: Novosibirsk
Сообщения: 761
Благодарил(а): 1 раз(а)
Поблагодарили:
10 раз(а) в 10 сообщениях
|
Ответ: Функционал
Для меня была сложность в распараллеливании обмена и соблюдении точного такта. Зачем соблюдение точного такта неочевидно, следовательно можно не рассматривать.
Распараллеливание обмена понятно для большей скорости и снижения нагрузки на основной цикл. Модулей ввода вывода постепенно становится более 60. Количество нефиксированное, может меняться в процессе работы, необходимо менять на ходу. У модуля может измениться IP так же на ходу. Модуль может быть выведен из обмена, так же на ходу. У модуля может поменяться таблица переменных так же на ходу (можем поменять тип). Возникает необходимость смены переменных как входных так и выходных так же на ходу. Единственно на что я не решился менять полный список параметров без остановки программы. Перевыделение массивов может привести к приостановке основного цикла. В общем небольшие объекты в более крупной установке останавливать можно, целиком установку реже, весь объект еще реже. Зачем - у нас на доске написана сумма простоя за один час работы. Цикл опроса модуля: соединение - запись, ожидание ответа, запись в общий массив(далее по циклу) - разрыв связи только при останове обмена или завершении программы. Соединение держим. Для того, чтобы ожидание ответа из TCP стека не тормозило все остальное, необходимо обмен с одним модулем вывести в отдельный поток. Составить таблицу потоков, контролировать, что живые, синхронизировать начало обмена, остановить по завершении. Каждый поток записывает запрос в стек (50 микросекунд) не зная про другие потоки. Сетевая карта и драйвер сами разруливают очередь. Далее сетевая карта с максимально возможной скоростью передает пакеты в switch. Switch раздает запросы по адресам. Модуля параллельно отвечают. Switch заталкивает назад в сетевую карту, она раздает по соединениям. Блоки TCP чтения в потоках дождавшись необходимого количества данных передают дальше, чуть обработки и в общий массив. Для меня было сложно. Если все остальные оценивают это как легко, значит для Сегнетикса тоже легко. Преимущества: Cкорости бешеные. Провод - восемь дешевых проволочек свитых попарно, разъемы копеечные. Свичи промышленные 8 канальные работают и работают ай-ай-ай за 126 баксов. __________________ В жизни 2 правила успеха: 1 Не говори всего что знаешь 2 ... |
30.10.2019, 17:13 | #102 |
Сотрудник Сегнетикс
Регистрация: Mar 2016
Адрес: SPb
Сообщения: 4 331
Благодарил(а): 0 раз(а)
Поблагодарили:
255 раз(а) в 251 сообщениях
|
Ответ: Функционал
Понимаете правильно, обновленная версия SmLogix, она уже доступна покупателям матрикса и позже выйдет в релиз.
__________________ Если ничто другое не помогает, прочтите, наконец, инструкцию |
30.10.2019, 17:33 | #103 | ||
Senior Member
Регистрация: Nov 2017
Сообщения: 561
Благодарил(а): 3 раз(а)
Поблагодарили:
38 раз(а) в 30 сообщениях
|
Ответ: Функционал
Цитата:
Цитата:
|
||
30.10.2019, 18:58 | #104 | |||
Senior Member
Регистрация: Aug 2013
Сообщения: 3 784
Благодарил(а): 12 раз(а)
Поблагодарили:
194 раз(а) в 190 сообщениях
|
Ответ: Функционал
Цитата:
Цитата:
Цитата:
Реально с модуля получаете 40 байт и гоняете по сетке пустые пакеты. Да и провода-то у Вас лишние для сотки... |
|||
30.10.2019, 20:09 | #105 | |
Senior Member
Регистрация: May 2010
Адрес: Novosibirsk
Сообщения: 761
Благодарил(а): 1 раз(а)
Поблагодарили:
10 раз(а) в 10 сообщениях
|
Ответ: Функционал
Я про возможности.
Я использую. Так процесс понятнее, что данные на всех этапах движутся как бы параллельно. Цитата:
3 одновременных MODBUS TCP соединения на нем я точно пробовал. Всем мене чем за 1 мс отвечает с тактом 100 мс. Данные обновляет согласно внутреннему такту, как приходят со входов. Wireshark же знаете. Весь обмен четко видно. При этом время цикла контроллера тоже видно. Все работает как часы. Я поэтому удивляюсь зачем что-то еще придумывать. Провода не лишние. Запасные. Добавлено через 23 минуты Не агитируйте. Нет возможности изучать. Верю, что круто, легко. В графических языках свои плюсы. Если допилить лоджик ...чик допилить лоджик ... чик допилить лоджик ... чик (заело пластинку). Добавлено через 50 минут Если Вы имеете в виду конкретные модули серии ET7000, в них добавлена сетевая карта. Процессор не грузит. Данные так же обновляются с заявленной производителем периодичностью. Сомнения если есть, могу тест на видео снять. __________________ В жизни 2 правила успеха: 1 Не говори всего что знаешь 2 ... |
|
31.10.2019, 11:10 | #106 | |||
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 085
Благодарил(а): 15 раз(а)
Поблагодарили:
660 раз(а) в 604 сообщениях
|
Ответ: Функционал
Цитата:
Цитата:
Добавлено через 8 минут Цитата:
__________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
|||
31.10.2019, 11:25 | #107 | |
Senior Member
Регистрация: May 2010
Адрес: Novosibirsk
Сообщения: 761
Благодарил(а): 1 раз(а)
Поблагодарили:
10 раз(а) в 10 сообщениях
|
Ответ: Функционал
Все по памяти.
Цитата:
Далее посчитать индекс переменной - номер модуля, номер канала. После обработки регистры передаются в массив с вещественными числами. Выбор из массива можно по переменной типа Enum сразу с названием. С этим уже можно вполне комфортно жить. Попробуйте. Радикальное сокращение усилий программиста и времени разработки. __________________ В жизни 2 правила успеха: 1 Не говори всего что знаешь 2 ... |
|
31.10.2019, 11:32 | #108 | |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 085
Благодарил(а): 15 раз(а)
Поблагодарили:
660 раз(а) в 604 сообщениях
|
Ответ: Функционал
Установить 100 переменных помогает банальный ctrl+v. 1000 переменных - это плюс 4 копипаста.
FBD - это язык визуального программирования. Т.е. в любом случае на каком-либо этапе создания проекта будет протяжка десятков атомарных связей. Не к переменным, так к массиву. Не к массиву, так от входов. От этого никуда не уйти. Иначе он из понятного визуального языка превратится непонятного мутанта. Цитата:
__________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
|
31.10.2019, 11:37 | #109 |
Senior Member
Регистрация: May 2010
Адрес: Novosibirsk
Сообщения: 761
Благодарил(а): 1 раз(а)
Поблагодарили:
10 раз(а) в 10 сообщениях
|
Ответ: Функционал
Не все рассказал.
В параллельном обмене было еще несколько тонкостей. Выявлены на практике и устранены. Сервер MODBUS установил ТСP соединение передает запрос в TCP стек. TCP пытается доcтавить пакет по назначению. Есть промежуточное устройство SWITCH Сетевая карта передала пакет свичу и ждет ответа. свич не смог отдать дальше. Например устройство не отвечает или физически отвалилось. Превысился таймаут, возникла ошибка. Сервер MODBUS передает новый запрос в ТСЗ стек. TCP пытается доcтавить пакет по назначению. Сетевая карта передала пакет свичу и ждет ответа. свич отдал дальше. ждет 2 ответа ... ждет много ответов. Пакеты постепенно отмирают, но их не становится меньше для этого соединения. Канал забит. Сам освободится только через время TTL если не прессовать новые запросы. Решение: При ошибке превышение таймаута разрывать соединение. В этот момент свитч сбрасывает все пакеты для этого соединения. Решение похуже. Коннект, отправка и прием одного запроса, дисконнект. Увеличивает время на один запрос. Дополнительно нагружает сетевые карты сервера и модулей постоянным обновлением таблицы соединений. 2 Сервер MODBUS передает запрос в TCP стек. TCP пытается доcтавить пакет по назначению. Есть промежуточное устройство SWITCH Сетевая карта передала пакет свичу и ждет ответа. свич отдал дальше. ждет ответа Например устройство не отвечает. Превысился таймаут, возникла ошибка. Сервер MODBUS передает новый запрос в ТСЗ стек. TCP пытается доcтавить пакет по назначению. Сетевая карта передала пакет свичу и ждет ответа. свич отдал дальше. ждет 2 ответа. В этот момент кончилась помеха, ответ на первый запрос вернулся в свич. Свич отдал в сетевую карту. Modbus сервер получил пакет с данными 1 запроса (температуру и давление), а ждал уровень и расход. Данные перепутались. Реконнект не помогает. Данные все равно доходят. Или хвост от старого пакета другой длины в буфере TCP сокета остается. Решение: Использовать штатные возможности MODBUS ТСP протокола. Нумеруем Transaction ID в сервере MODBUS, если пришел пакет не с этим Transaction ID реконнект. Из штатных полей Transaction ID, Protocol ID, Length, Unit ID почему-то не все использует Transaction ID, используется только Length. А модули ввода вывода и контроллеры Сегнетикс Transaction ID в ответе возвращают как в запросе. Нумеруем Transaction ID в сервере MODBUS, если пришел пакет не с этим Transaction ID считаем плохой и откидываем. Далее реконнект. После этого более проблем не выявлено. На этом передача вести с полей заканчивается. Спасибо за критику и предложения. Надеюсь данная информация кому-нибудь пригодится. __________________ В жизни 2 правила успеха: 1 Не говори всего что знаешь 2 ... |
31.10.2019, 11:55 | #110 | |
Senior Member
Регистрация: Nov 2017
Сообщения: 561
Благодарил(а): 3 раз(а)
Поблагодарили:
38 раз(а) в 30 сообщениях
|
Ответ: Функционал
Цитата:
Я удивляюсь, как вы с таким "знанием" работы сети и TCP/IP умудрились вообще хоть что-то сделать. |
|
31.10.2019, 12:24 | #111 | ||
Senior Member
Регистрация: May 2010
Адрес: Novosibirsk
Сообщения: 761
Благодарил(а): 1 раз(а)
Поблагодарили:
10 раз(а) в 10 сообщениях
|
Ответ: Функционал
Цитата:
И это еще не самый плохой случай. Добавлено через 10 минут Цитата:
https://www.youtube.com/watch?v=LpmG6b4uzmg Почти как у Вас только немного более логично. И кажется, что чуть допилить... Я Ваш флаг повешу у нас в кабинете и не дам никому трогать. Отсылка, что это мегапакет не подходит. Это было в самой первой версии. Ссылку я уже приводил. И с другой стороны брать лучше лучшее у лучших. __________________ В жизни 2 правила успеха: 1 Не говори всего что знаешь 2 ... |
||
31.10.2019, 12:45 | #112 | |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 085
Благодарил(а): 15 раз(а)
Поблагодарили:
660 раз(а) в 604 сообщениях
|
Ответ: Функционал
Цитата:
Данную концепцию я прорабатывал году в 2008, только не в виде массивов - это не удобно, а в виде типа Record. Это структура, а не массив. Структура допускает объединение разнородных данных, что более актуально для PLC. Отказались от подобного усложнения. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
|
31.10.2019, 13:11 | #113 | ||
Senior Member
Регистрация: May 2010
Адрес: Novosibirsk
Сообщения: 761
Благодарил(а): 1 раз(а)
Поблагодарили:
10 раз(а) в 10 сообщениях
|
Ответ: Функционал
Цитата:
Посмотрите второй пример. Тот же массив заходит в цикл одной линией, автоматически индексируется. Переменная используется, результат далее автоматически индексируется. Структура тоже есть, называется кластер. Есть массивы структур, есть структура из массивов - это лишнее. https://www.youtube.com/watch?v=9zKpOP78DXM. Опять же не смотрите на переднюю панель (слева) смотрите на поляну. Отказались от структур в 2008 году. Прошло уже 11 лет. Железо уже позволяет. Добавлено через 34 минуты Цитата:
Добавлено через 1 час 13 минут Арсений, Вы поняли про что я говорил? А то я выявил в процессе этой долгой беседы, что как минимум не умею объяснять. __________________ В жизни 2 правила успеха: 1 Не говори всего что знаешь 2 ... |
||
31.10.2019, 15:11 | #114 |
Senior Member
Регистрация: Aug 2013
Сообщения: 3 784
Благодарил(а): 12 раз(а)
Поблагодарили:
194 раз(а) в 190 сообщениях
|
Ответ: Функционал
|
31.10.2019, 15:17 | #115 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 085
Благодарил(а): 15 раз(а)
Поблагодарили:
660 раз(а) в 604 сообщениях
|
Ответ: Функционал
Думаю, для вас не станет откровением, что картинки Автоскады первоначально нарисованы в векторе, а для анимации нарезаны слайды) Иначе мастерскада и не могла.
Вы лучше посмотрите на эти изломы векторов вдоль надписей на детализации __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
31.10.2019, 16:03 | #116 | |
Senior Member
Регистрация: Aug 2013
Сообщения: 3 784
Благодарил(а): 12 раз(а)
Поблагодарили:
194 раз(а) в 190 сообщениях
|
Ответ: Функционал
Цитата:
Но здесь именно объекты с векторной графикой фильтрами и анимацией. А управление через css и js. Передача данных - json. Дело не в Инсате. Просто пример построения HMI на основе WEB интерфейса. Причем реализация именно в четвертой мастерскаде мне не очень нравится. |
|
31.10.2019, 17:20 | #117 | |
Senior Member
Регистрация: May 2010
Адрес: Novosibirsk
Сообщения: 761
Благодарил(а): 1 раз(а)
Поблагодарили:
10 раз(а) в 10 сообщениях
|
Ответ: Функционал
Цитата:
Методы коррекции ошибок в вычислительных сетях основаны на повторной передаче кадра данных. Чтобы убедиться в необходимости повторной передачи данных, • отправитель нумерует отправляемые кадры и для каждого кадра ожидает от приемника квитанции — служебного кадра, извещающего о том, что исходный кадр был получен и данные в нем оказались корректными. • время этого ожидания ограничено — при отправке каждого кадра передатчик запускает таймер, и, если по его истечении положительная квитанция на получена, кадр считается утерянным. • приемник в случае получения кадра с искаженными данными может отправить отрицательную квитанцию — явное указание на то, что данный кадр нужно передать повторно. Метод с простоями требует, чтобы источник, пославший кадр, ожидал получения квитанции (положительной или отрицательной) от приемника и только после этого посылал следующий кадр (или повторял искаженный). Если же квитанция не приходит в течение тайм-аута, то кадр (или квитанция) считается утерянным и его передача повторяется. На рис. сверху видно, что в этом случае производительность обмена данными существенно снижается, — хотя передатчик и мог бы послать следующий кадр сразу же после отправки предыдущего, он обязан ждать прихода квитанции. Я считал, что дробление пакета на кадры, метод «скользящего окна» и тд. относится ко 2 уровню. Опять же у каждого свича есть параметр - размер входного буфера. Если это не так и дробление пакета, перестановки производится сетевыми картами, значит я однозначно ошибался, наделив свитч несвойственными ему функциями. Поможете разобраться буду искренне благодарен. __________________ В жизни 2 правила успеха: 1 Не говори всего что знаешь 2 ... |
|
31.10.2019, 17:43 | #118 | |
Senior Member
Регистрация: Nov 2017
Сообщения: 561
Благодарил(а): 3 раз(а)
Поблагодарили:
38 раз(а) в 30 сообщениях
|
Ответ: Функционал
Цитата:
Цитата: ...Механизм TCP предоставляет поток данных с предварительной установкой соединения, осуществляет повторный запрос данных в случае потери данных и устраняет дублирование при получении двух копий одного пакета, гарантируя тем самым, в отличие от UDP, целостность передаваемых данных и уведомление отправителя о результатах передачи... Если, используя TCP, на уровень приложения вышла ошибка, значит все применяемые методы уже не сработали и произошло что-то плохое. Дублировать этот штатный функционал не нужно. Никакие квитанции учитывать не нужно. Исключением является закрытие порта оппонентом, когда возникнет ошибка при отправке/получении данных и нужно просто переоткрыть соединение и повторить отправку. Алгоритмически это выглядит так: Код:
func (c *SimpleTCPClient) exchangeAppData(in TCPAppDataUnit, out *TCPAppDataUnit) error { retry := c.conn != nil for { if err := c.sendAppData(in); err != nil { c.resetConnect() if retry { retry = false continue } else { return err } } if err := c.recvAppData(out); err != nil { c.resetConnect() if retry { retry = false continue } else { return err } } return nil } } |
|
31.10.2019, 18:48 | #119 | |
Senior Member
Регистрация: Aug 2013
Сообщения: 3 784
Благодарил(а): 12 раз(а)
Поблагодарили:
194 раз(а) в 190 сообщениях
|
Ответ: Функционал
Цитата:
Там и ещё есть на что посмотреть. |
|
31.10.2019, 21:14 | #120 |
Senior Member
Регистрация: Nov 2017
Сообщения: 561
Благодарил(а): 3 раз(а)
Поблагодарили:
38 раз(а) в 30 сообщениях
|
Ответ: Функционал
Сегодня, вышла заметка на Хабре: Обзор современных протоколов в системах промавтоматики.
Вот там видно, что MODBUS/TCP относится к протоколам с низкой производительностью и не имеет (не задумывался, как...) поддержки реального времени. Поэтому, мучить MODBUS/TCP на предмет высокой производительности или для каких-то критичных по времени (скажем, <100 мс) задач можно только на свой страх и риск. |