Скриншот конфигуратора, если это может помочь.
Они однотипны в той части, которую не видно на скриншотах.
Скриншот конфигуратора, если это может помочь.
Они однотипны в той части, которую не видно на скриншотах.
Что мне выкладывать? Весь проект, который есть или что? Сколько людей пишет на питоне, тем более которые есть тут в работе с ПЛК. Зато скриптики на питоне всем понятны, вот и взял БАЗОВЫЙ скрипт, как и писал в том сообщения где выкладывал и все. Какие дела? Мне рассказать как сеть устроена? Как траффик гуляет, где какие правила или что? Адреса разные, и находятся физически ПЛК в разных местах. Клиент на ГО я использую уже в более 20 разных проектах и везде все хорошо, а вот ПЛК и тем более ОВЕН сам использую в первый раз, потому и пришел за советом. У меня было скорее предположение, что косяк в либо в ПЛК, либо в ньюансах кодинга.
Я решил быкануть? Это вы делаете выводы, а не спрашиваете. Зачем убеждать человека ЗА меня, где есть косяк? Есть сомнение, можно спросить или подсказать.
Давайте подумаем, знаете ли вы, что если есть коллизия IP адресов в одном броадкаст домене, то роутеры блокируют такие пакеты на N секунд на момент перестроения arp таблиц, а следовательно будут потери пакетов, чуть выше я вам скинул скриншот с выборкой за 12 часов, где нету пропадания пакетов от слова совсем.
Выдержка из кода на 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 }
Когда проверка была на Python, была залита урезанная версия софта для на ПЛК для проверки если вдруг не хватает ресурсов. Там был slave1 в продуктиве 5. Проблема в том, что косяк соединения с ПЛК и тут не совсем это важно какой адрес слейва указан. Разница будет только в ответе. в одном случае придут данные, в другом будет ошибка некорректного пакета.
И всегда в обоих случаях сыпятся таймауты так же. Предложение добавить адрес было логичным, я проверил и его на всякий случай, хотя мало верил в успех.
В целом если уже говорить о моих ошибках, то там есть еще одна ошибка, а именно я пытался читать койлы с кодом 01, когда как мне нужны входные регистры. Опять же, ошибка будет в ответе, то есть я увижу ошибки протокола, а не таймаут.
Я же приложил скриншот с заббикса где проходит пинг до ПЛК. Сеть большая и контроллеры правда находятся в сегменте с 10м адресом не стандартным.
Если честно про дамп не совсем понял. Там есть первый пакет
ПК с которого я веду тест отправляет запрос SYN на открытие TCP сессию на ПЛК Овен, в ответ получает пакет RST, соотвественно стандартная настройка стека TCP пытается сделать повтор еще 2 раза, но так же получает RST после чего вываливается ошибка.
Сделать скриншот, что это реально ПЛК не проблема. Во вложении. Я вообще изначально хотел выложить целиком скриншот, но форум сказал, что я пытаюсь вложить слишком большой файл, вот и приходится их подрезать.
За совет кстати про 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
Последний раз редактировалось gOsToFf; 26.03.2020 в 19:49.
ну как не важен, вот два скрина с указанием ID и безПроблема в том, что косяк соединения с ПЛК и тут не совсем это важно какой адрес слейва указан
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Человек косяк нажывается, выкладывал быстро, забыл нажать кнопку 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 адресу.
Жалусюь на оба, к сожалению косяк на обоих. Очень не хватает низкоуровнего дебага на ПЛК, чтобы разобрать проблему.
Кстати, банальный telnet на 502 порт так же не всегда отрабатывает ( просто зависает на соединении ), а иногда отрабатывает очеень долго и реже моментально. Именно просто на коннект. Так что не думаю, что есть смысл разбирать софт, который его опрашивает. Есть смысл разбираться в софте ПЛК наверно.
в сети плк есть кому показать таблицу маршрутов, роутер точно по первому адресу и всё такое
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран