PDA

Просмотр полной версии : ПЛК160 и тайм-ауты Modbus Slave TCP



gOsToFf
24.03.2020, 21:09
Добрый день.

Подскажите, может кто сталкивался с проблемой.
Есть ПЛК160М2, используется в качестве автоматизации небольшой электроники. Логики на нем не сильно много накручены, но используется RS-485 в качестве мастера, а так же Modbus(Slave) через TCP для ужаленного мониторинга и конфигурации параметров. Никаких специальных библиотек для этого не используется, только настройка через конфигуратор. Все регистры 2 бита, обевлпниетщнаяений раз в 20 секунд.

Проблема заключается в том, что при опросе внешнем, ПЛК часто не отвечает на запросы, соотвественно время ожидания даже в 2-3 секунды не достаточно, может ответить с 3-5-20го раза только. Кто-то сталкивался с этим? Как побороть может подскажете.

gOsToFf
24.03.2020, 21:53
Чего разбирать там, у меня этот клиент обрабатывает еще десяток других слейвов по TCP и все хорошо, проблема только с 3мя ПЛК.
Может для общения с ПЛК овен или вообще под управлением CoDeSys есть какие-то свои ньюансы?

gOsToFf
24.03.2020, 22:22
А у меня клиент может свободно и без единой ошибки опросить плк c tcp-слейвом 1000 раз в секунду. И что ?
Ньюансов нет. Копайте своего клиента.

Может поделитесь? Или подскажите на основе чего этот клиент.

manjey73
24.03.2020, 22:39
В этот момент CodeSys подключен ?

gOsToFf
24.03.2020, 22:41
В этот момент CodeSys подключен ?

Проблема проявляется и так и так. Как правило нет, клиент CoDeSys не подключен

gOsToFf
24.03.2020, 22:50
Сам работал с клиентом написанным на Go, как говорю проблемы только с ПЛК

Проверил базовым кодом на python, беда такая же

gOsToFf
24.03.2020, 23:07
c Go это раз в 30 секунд и повторение через 200мс если не успешно.

С python вообще руками запуск тыкал раз 10 по выпадении в ошибку(так что запрос в 5-8 секунд), разок-другой прошел запрос, остальные нет.

gOsToFf
24.03.2020, 23:53
как вариант это то что плк рвет соединение если его не опрашивают чаще чем 10 секунд

Так я же по идеи открываю каждый раз новое соединение, просто так открытым оно не держится.

Филоненко Владислав
25.03.2020, 07:58
Лог снифера обычно помогает решить проблему гораздо быстрее чем другие методы

gOsToFf
25.03.2020, 11:40
Лог снифера обычно помогает решить проблему гораздо быстрее чем другие методы

Сниффер чего? Сетевой, типа Wireshark?

gOsToFf
25.03.2020, 12:08
Возможно добавив логирование тоже можно чуть больше узнать о проблеме
import logging
from pymodbus.client.sync import ModbusTcpClient

logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)
...

ERROR:pymodbus.client.sync:Connection to (10.1.10.5, 502) failed: timed out


Все что падает в лог при этом.

WireShark говорит, что от контроллера приходит ответ на попытку установить соединение с кодом 4 и признаком Connection Reset

gOsToFf
25.03.2020, 14:30
На гуглите, как настраивается таймаут, точно помню что на стековерфлоу это было

проблемы нету, client.timeout ( ide сама подскажет, так же можно по пакету пошарить )

По умолчанию стоит
Timeout = 3

Проверил 1 и 10, разницы нету никакой.

Мне все же кажется, что косяк в контроллере, может что-то с чем-то конфликтовать или ресурсов не хватать?
Как я и говорил, для модбаса вообще не используется никаких библиотек, в целом в у меня кроме стандартных ничего нету в коде.

gOsToFf
25.03.2020, 15:49
а пинг сколько показывает когда Вы из сети 172.27.1.0 стучитесь в плк с адресом 10.1.10.5 ?

Из этой сети прям очень дофига на самом деле, потому что это через впн и очень далеко. Но проблема проявляется и с сервера, на котором крутится софт управляющий, а там меньше 1мс ( в основном )

e.filatov
25.03.2020, 16:39
Взял ПЛК160 М02 (свеженький), залил проект с 30 переменными, поставил опрос c паузой между пакетами 1 мс... всё пашет.
Может сама железка кривая пришла?

gOsToFf
25.03.2020, 17:12
Взял ПЛК160 М02 (свеженький), залил проект с 30 переменными, поставил опрос c паузой между пакетами 1 мс... всё пашет.
Может сама железка кривая пришла?


Может косяк именно когда используешь RS485 в мастере и TCP в слейве?
Косяк может и с железкой ( и мне так кажется ), но скорее не с ней, что мне пришло а просто какая-то бага.

e.filatov
25.03.2020, 17:49
Так легко проверить. Отключите мастер по RS, посмотрите как работает.
Чисто теоретически, вы можете уходить в блокирующее ожидание ответа по RS485 и в это время другие интерфейсы тормозят

gOsToFf
25.03.2020, 18:32
Так легко проверить. Отключите мастер по RS, посмотрите как работает.
Чисто теоретически, вы можете уходить в блокирующее ожидание ответа по RS485 и в это время другие интерфейсы тормозят

Да, вот тоже думаю, что надо это испробовать это. Правда это было бы тоже странно, как в случае со слейвом используется штатный метод и запись в него идет раз в 30 секунд только.

Филоненко Владислав
26.03.2020, 08:12
ERROR:pymodbus.client.sync:Connection to (10.1.10.5, 502) failed: timed out


Все что падает в лог при этом.

WireShark говорит, что от контроллера приходит ответ на попытку установить соединение с кодом 4 и признаком Connection Reset

Выложите ВЕСЬ лог, хотя бы за 2-3 минуты. То, что ПЛК возвращает Reset - означает что он не может принять входящее, к примеру к нему УЖЕ по этому порту подключились. И соединение не разорвано клиентом, а он открывает ещё одно. Типичное, кстати, поведение для библиотек на PC, они предполагают что число сокетов у сервера бесконечное, а разъединение соединения - дело ОС, а там таймаут 2 часа по умолчанию :D

gOsToFf
26.03.2020, 10:55
Ну вот. С 3-его раза дошло что нужно клиентов копать

Почему бы по человечески не написать, чего хочется сказать.


сожалею что сразу не написал свою стандартную фразу про чтение документации, но попробуйте в своем коде слегка изменить строчку на такую
result = client.read_coils(1,10, unit=0x01) ошибки исчезнут

К сожалению эффект тот же самый.

gOsToFf
26.03.2020, 13:14
Товарищи, далеко ушли.

Да соединения то есть то нет, какой-то конкретно закономерности нету. Даже когда всего один запрос в 30 секунд и один опрашивающий.
2 ПЛК с одним IP не может быть физически, они разные.
Чтобы отвечал "кто-то" другой... как? Это TCP Modbus напрямую на ПЛК. Да и еще правильные данные?

Что в моих словах смутило? Я сказал что этот же клиент опрашивает еще другие устройства по TCP Modbus, я что сказал, что они с один IP адресом или что? Есть еще отдельные сети rs485 физически никак не связанные с сетями используемыми для ПЛК, для получения данных из них я использую Moxa modbus gate, так вот с ними проблемы никакой нету.

gOsToFf
26.03.2020, 13:18
Скриншот конфигуратора, если это может помочь.
Они однотипны в той части, которую не видно на скриншотах.

gOsToFf
26.03.2020, 17:29
смутили не слова, а дела и поступки. Писали что на Го кодили, но ни чего не выложили, видимо не созрели для него, питоновский скрипт тоже написан новичком, не вникающим в детали, хотите чтоб поверил Вашим словам что с сетями у Вас все хорошо, фактов нет чтобы верить. Решили быкануть, варитесь сами в собственных проблемах

Что мне выкладывать? Весь проект, который есть или что? Сколько людей пишет на питоне, тем более которые есть тут в работе с ПЛК. Зато скриптики на питоне всем понятны, вот и взял БАЗОВЫЙ скрипт, как и писал в том сообщения где выкладывал и все. Какие дела? Мне рассказать как сеть устроена? Как траффик гуляет, где какие правила или что? Адреса разные, и находятся физически ПЛК в разных местах. Клиент на ГО я использую уже в более 20 разных проектах и везде все хорошо, а вот ПЛК и тем более ОВЕН сам использую в первый раз, потому и пришел за советом. У меня было скорее предположение, что косяк в либо в ПЛК, либо в ньюансах кодинга.

Я решил быкануть? Это вы делаете выводы, а не спрашиваете. Зачем убеждать человека ЗА меня, где есть косяк? Есть сомнение, можно спросить или подсказать.
Давайте подумаем, знаете ли вы, что если есть коллизия IP адресов в одном броадкаст домене, то роутеры блокируют такие пакеты на N секунд на момент перестроения arp таблиц, а следовательно будут потери пакетов, чуть выше я вам скинул скриншот с выборкой за 12 часов, где нету пропадания пакетов от слова совсем.

gOsToFf
26.03.2020, 17:31
Выдержка из кода на GO если это реально так может помочь...



const (
modbusPollingTimeout = 50 * time.Millisecond
modbusFailRetryCount = 20
modbusHandlerTimeout = 3 * time.Second
modbusHandlerIDLETimeout = 20 * time.Second
modbusPLCSlaveId = 5
)


func NewTCPModbusHandler(ipAddress string) *modbus.TCPClientHandler {
var modbusHandler *modbus.TCPClientHandler
modbusHandler = modbus.NewTCPClientHandler(ipAddress)

errConnect := modbusHandler.Connect()
if errConnect != nil {
//fmt.Println("ErrConnectModbusHandler to ", ipAddress, ": ", errConnect)
}
defer modbusHandler.Close()

return modbusHandler
}


func ReadPLCConfiguration(segmentId int) PLCConfiguration {
myHandler := NewTCPModbusHandler("10." + strconv.Itoa(segmentId) + ".10.5:502")
myHandler.SlaveId = modbusPLCSlaveId
myHandler.Timeout = modbusHandlerTimeout
myHandler.IdleTimeout = modbusHandlerIDLETimeout
client := modbus.NewClient(myHandler)

var err error
var readParam []byte
count := 1

readParam, err = client.ReadInputRegisters(19, 15)
for i := 0; i <= modbusFailRetryCount; i++ {
if err != nil {
count++
time.Sleep(modbusPollingTimeout)
readParam, err = client.ReadInputRegisters(19, 15)
}
}

fmt.Println("PLCConfig requests after ", count, " retries.")

myHandler.Close()

plcConf := PLCConfig[segmentId-1]

if err == nil {
s := reflect.ValueOf(&plcConf).Elem()

for i := 0; i < s.NumField()-1; i++ {
f := s.Field(i)
var temp_byte []byte

startIndex := 0
if i > 0 {
startIndex = i * 2
}
endIndex := startIndex + 1
temp_byte = append(temp_byte, readParam[startIndex])
temp_byte = append(temp_byte, readParam[endIndex])
temp_value := binary.BigEndian.Uint16(temp_byte)
f.SetUint(uint64(temp_value))
}
plcConf.LastUpdated = time.Now()
}

return plcConf
}

gOsToFf
26.03.2020, 19:41
то что я удаляю посты, не значит что я не спрашивал Вас ни о чем.
Меня заинтересовало стойкое желание Валенка обвинить клиента в проблемах, я поменял его точку зрения, крайний раз он начал придерживаться термина верхний уровень, не конкретизируя что клиент. Когда я предложил в питоне добавлять всё же адрес слейва, в Вашем коде на Го почему SlaveId равен пяти а не единице?

Когда проверка была на Python, была залита урезанная версия софта для на ПЛК для проверки если вдруг не хватает ресурсов. Там был slave1 в продуктиве 5. Проблема в том, что косяк соединения с ПЛК и тут не совсем это важно какой адрес слейва указан. Разница будет только в ответе. в одном случае придут данные, в другом будет ошибка некорректного пакета.
И всегда в обоих случаях сыпятся таймауты так же. Предложение добавить адрес было логичным, я проверил и его на всякий случай, хотя мало верил в успех.
В целом если уже говорить о моих ошибках, то там есть еще одна ошибка, а именно я пытался читать койлы с кодом 01, когда как мне нужны входные регистры. Опять же, ошибка будет в ответе, то есть я увижу ошибки протокола, а не таймаут.



По сетям я тоже задавал вопросы, получил от Вас какой то скрин, какого то пакета, где там написано что это 12 часов работы не разбираюсь видимо, да был еще вырезка пинга из 48 посылок. То что я в одном из постов решил что адрес контроллера начинается с 10, а ПК со 172, это мне пришло в голову потому что по умолчанию овеновские контроллеры с 10-ти идут. Но по дампу получается что источником отправки пакетав таком случае является плк а приемником ПК

Я же приложил скриншот с заббикса где проходит пинг до ПЛК. Сеть большая и контроллеры правда находятся в сегменте с 10м адресом не стандартным.
Если честно про дамп не совсем понял. Там есть первый пакет
ПК с которого я веду тест отправляет запрос SYN на открытие TCP сессию на ПЛК Овен, в ответ получает пакет RST, соотвественно стандартная настройка стека TCP пытается сделать повтор еще 2 раза, но так же получает RST после чего вываливается ошибка.



Я задал вопрос и про сам плк, не пойму зачем тогда раззоряться что Вы хотите помощи если выкладываете какие то миниатюрные вырезки ни на что не влияющие, понимаю впервые сталкиваетесь с овеном, поэтому эти скрины не нужны, либо сделайте скрин полного экрана и в режиме онлайн, чтоб было видно что не в эмуляции и что действительно на то время в конфигурации именно то что в проекте. Напомню что залитая программа держиться в ОЗУ и при выключении питания стирается, если не сделать загрузочный проект. Дополнительно, не плохо бы зайти в ПЛК-браузер и выложить вывод команды PLCInfo


Сделать скриншот, что это реально ПЛК не проблема. Во вложении. Я вообще изначально хотел выложить целиком скриншот, но форум сказал, что я пытаюсь вложить слишком большой файл, вот и приходится их подрезать.

gOsToFf
26.03.2020, 19:43
За совет кстати про RAM и загрузочный проект спасибо, правда мне бы его 2 недели назад, когда я не мог понять, что за фигня происходит. Сам случайно натыкал, разобрался с этим делом.

Еще вывод с другого PLCInfo со второго контроллера ( именно его IP я использовал для тестов тут



PLCInfo
PLC model MODEL PLC 160
Binary VERSION 1.0.11
Need Target version >= 3.12
Compiled: 10:25:23 Nov 5 2019
STM32 binary version 114
MAC E4:1E:0A:00:5A:DF
IP 10.2.10.5
GATE 10.2.10.1
MASK 255.255.255.0

capzap
26.03.2020, 19:50
Проблема в том, что косяк соединения с ПЛК и тут не совсем это важно какой адрес слейва указанну как не важен, вот два скрина с указанием ID и без

gOsToFf
26.03.2020, 20:25
не кажется ли что это уже второй плк с таким же адресом?

Человек косяк нажывается, выкладывал быстро, забыл нажать кнопку Enter поесле переподключения.


PLCInfo
PLC model MODEL PLC 160
Binary VERSION 1.0.11
Need Target version >= 3.12
Compiled: 10:25:23 Nov 5 2019
STM32 binary version 114
MAC E4:1E:0A:00:54:11
IP 10.1.10.5
GATE 10.1.10.1
MASK 255.255.255.0



Если бы он был с таким же адресом, у меня бы ничего не работало на нем. Там совсем другая подсеть, совсем на другом маршрутизаторе. Именно по этой причине, я писал о невозможности.
А косяк, того что это один и тот же ПЛК, можно просмотреть по MAC адресу.

gOsToFf
26.03.2020, 21:28
откуда это понятно? Если в 31 посте скрины с другого плк и на него не жалуются, то я не вижу что за прога в данный момент в плк с адресом 10.1.10.5 и говорить что он не виноват не стал бы. Пинг говорит что до него можно достучаться, это ни как не объясняет наличие сервера модбас или какой то другой проблемы

Жалусюь на оба, к сожалению косяк на обоих. Очень не хватает низкоуровнего дебага на ПЛК, чтобы разобрать проблему.
Кстати, банальный telnet на 502 порт так же не всегда отрабатывает ( просто зависает на соединении ), а иногда отрабатывает очеень долго и реже моментально. Именно просто на коннект. Так что не думаю, что есть смысл разбирать софт, который его опрашивает. Есть смысл разбираться в софте ПЛК наверно.

capzap
26.03.2020, 21:30
в сети плк есть кому показать таблицу маршрутов, роутер точно по первому адресу и всё такое

gOsToFf
26.03.2020, 21:30
принес на стол, подключился через КДС, соответственно залил программу, проверил обмен есть, отнес обратно прогу не залил обмена нет, разве такое не может быть?

ЗЫ и вообще я бы не с катушек начал, а с регистров хранения

Очень логично. Если это замечение по поводу загрузочного проекта, то оно логично. Но я сейчас не ношу никуда ПЛК, он стоит на своем месте постоянно.

gOsToFf
26.03.2020, 21:47
Я бы сказал (и говорил) наоборот.

Сислибсокет решит проблему 1-ого конекта на сокет

И кстати, какой минцикл ? 1 ведь ?

Сислибсокет это если переделать на TCP?

Про минцикл о чем речь, я этого не понимаю?

gOsToFf
26.03.2020, 22:05
syslibsocket.lib - руками слепить что угодно
минимальный цикл (в конфигурации). Нормально - 1.

Стандартные, 1 мс на минимальный, 1000 на максимальный.

Я думал, что использование штатного метода должно быть стабильнее. Переписываться на syslibsocket наверно можно, но это скорее акт отчаяния, а не решения.

gOsToFf
26.03.2020, 22:42
Это что ? Вариантов кроме таймаута - нет. Или не модбас.

К тому, что если коннект установлен, и ответ пришел не корректный, то это не косяк. Все хорошо. Но если есть таймаут, значит соединение не установлено.
Тем более я же говорю, даже банально telnet 10.1.10.5 502 не подключается зачастую.

gOsToFf
26.03.2020, 22:59
изучите два моих скрина (https://owen.ru/forum/showthread.php?t=32998&p=329204&viewfull=1#post329204)
слейв, приняв любой запрос и идентифицировав как не подходящий не шлет ответа, но соединение то установлено. Мастер после таймаута принимает решение что слейв не ответил
Так же и с телнетом, по нему можно судить есть или нет соединения, если его нет будет ошибка, если есть будет пустой экран пока Вы не наберете руками нужный запрос

ЗЫ если в телнете Вы видите какой нибудь набор символов при правильном коннекте, значит возможно у Вас работают два мастера, об этом Вам и говорила техподдержка аж в самом начале темы

Я изучил скринты, а теперь закройте монитор и выполните оба скрина, будет ошибка таймаута. вот именно ее я и вижу.
Я умею отличать правильное подключение в телнет, а точнее его наличие, от вообще его отсуствия.

Если я вижу такое ( и только это в течении например 10 секунд), думаю что это как раз и есть ошибка


% telnet 10.1.10.5 502
Trying 10.1.10.5...



Но когда я вижу это, знаю, что подключение прошло успешно. И тут если отправлю верную команду, то ответ получают корректный.



% telnet 10.1.10.5 502
Trying 10.1.10.5...
Connected to 10.1.10.5.
Escape character is '^]'.


Может и правда косяк в том, что клиент не закрывает соединения. Хотя везде в коде, после использования я всегда его закрываю. Да и нестат не показывает висящего постоянно соединения.

gOsToFf
26.03.2020, 23:10
модбас-tcp слейв на МО2 - стабильный. Библиотека дает большую гибкость. Например управляемое время жизни и кол-во открытых сокетов

Может есть пример простого TCP сервера для 160го? Попробую реализовать

gOsToFf
26.03.2020, 23:12
без слейва будет так pymodbus.exceptions.ConnectionException: Modbus Error: [Connection] Failed to connect[ModbusTcpClient(localhost:502)]
а без монитора будет все по прежнему

а вот мой вывод телнета

Так вот я и вижу эту ошибку. Все таки мне кажется косяк, что сессия не закрывается на стороне ПЛК и висит до таймаута.

gOsToFf
27.03.2020, 11:31
Во первых это явно не таймаут в понимании протокола, а отсутствие связи

Ну раз у Вас заббикс, может Вы делали попытку собирать с плк данные и так всё это и осталось, он установил соединение и по этому не даёт другим мастерам подключаться
Заббикс да, но он не лезет никак в ПЛК. ПЛК опрашивает только софт на Go причём по шедулеру и пишет в раму, а заббикс уже берет данные с него по апи.

gOsToFf
27.03.2020, 13:37
ну так в итоге то что, два мастера? На го и попытки на питоне. В овеновских плк один сокет только для одного соединения

Питон использовался только для показать сюда, так как Питон для "Народа" нынче ближе к жизни чем ГО. Да и проще быстро и наглядно посмотреть.
Мастер один, на ГО. запросы по шедулеру, так что никаких параллельных открытий соединения нету. И как вы могли заметить, везде есть команды на закрытие соединение, чтобы оно не висело почем зря.

gOsToFf
31.03.2020, 17:27
В общем ясно, всем спасибо за участие.
Переехал на SysLibSocket и все зашибись.