PDA

Просмотр полной версии : Обмен информацией. Приём данных формата ASCII.



Всеволод К
01.11.2025, 19:59
Доброго времени суток, коллеги!
Опыта не так много, как хотелось бы, так что если задача простая - не кидайтесь томатами :)
Первый раз работаю с ASCII в целом, поэтому никак не могу его настроить под свою задачу.

Работаю вот с чем:
1)У меня есть программа Machine Vision Platform для камеры Irayple x86. Общаться с её программой можно по ASCII.
Реализовать обмен нужно именно по Ethernet-порту (rs232, rs 485 камера не поддерживает). Modbus TCP/IP также нет.
2)Мой контроллер - СПК107. Его единственный порт Ethernet уже задействован под Modbus TCP/IP Master (связь с роботом и блоками дискретного ввода/вывода)

Что имею сейчас:
Успешно открываю сокет внутри программы для камеры (параметры указаны на 3 фото), затем успешно подключаюсь с использованием Hercules (конфигурация клиента и успешный обмен показаны на фото 1,2).

При попытке сделать тоже самое через CoDeSys получается, что используя формат подключения, показанный на фото (4,5,6,7,8,9), удаётся подключиться к камере (также и к Hercules), но не передать данные. Для попытки передачи данных использую STRING, фото 10 (находил в руководствах, что именно он имеет кодировку ASCII). Результат который выдаёт при обмене на фото 11 (т.е. подключение к порту есть, а результата нет).

Очень нужна помощь. Возможно делаю не так вообще всё, но без вас не справлюсь :(

P.S. я пытался найти информацию. Видел, что везде указывается обмен по ASCII через COM порты (подразумевается именно RS485, RS232, да?). Но мне нужно связаться именно как Hercules - камера (либо как-то ещё, но не по RS, а по Ethernet).

melky
01.11.2025, 20:04
снифер на порт и смотреть разницу обмена между геркулесом и между спк. может запрсто посылать завершающие символы или перевода строки...
наверное это первое, что надо посмотреть.

а че, камера понимает modbus ?

Всеволод К
01.11.2025, 20:33
Спасибо за ответ, но я не совсем понял касательно "снифер на порт" - я не подключаюсь через порты (или оно и не надо?). Всё крутится на ноутбуке. CoDeSys тоже на нём запускаю (не через эмуляцию, а именно запуск виртуального контроллера).

"камера понимает modbus ?" - Камера Modbus не понимает (хоть в документах и заявлено).
Я просто даже близко не понимаю как настроить СПК под эту задачу - о том и вопрос. (т.е. фактически СПК должен воспринимать и отправлять информацию также, как и hercules)

P.s. Снифферами не пользовался, но почитаю и попробую проверить.

Cs-Cs
01.11.2025, 20:40
НЕТ! Ты не так делаешь всё, если я по скринам понял!
То, что ты добавил порт через конфигурацию и привязал туда STRING - это НЕ ТО!
Это означает совсем другое: что ПЛК через протокол Modbus TCP будет пытаться передавать байты!
НЕ строку, а прям протокол!

Тебе надо смотреть в другую сторону.
На форуме была тема (ща напишу - и потом поищу ссылку) про НЕСТАНДАРТНЫЕ протоколы для CodeSys
Вот тебе нужна именно она.

И там надо будет писать всё самому:
* Открыть сокет
* Установить соединение
* Послать БАЙТЫ

Cs-Cs
01.11.2025, 20:44
Вот! Нужно копать в сторону этой темы и библиотеки: https://owen.ru/forum/showthread.php?t=31816
Вот что тебе надо оттуда:

функциональные блоки для реализации нестандартных протоколов (UNM_SerialRequest, UNM_TcpRequest, UNM_UdpRequest)

И вот из документации на неё:

Функциональный блок UNM_TcpRequest используется для реализации нестандартного протокола поверх протокола TCP. По переднему фронту на входе xExecute происходит отправка содержимого буфера запроса, расположенного по указателю pRequest, размером szRequest байт через соединение, определяемое дескриптором hConnection, полученным от ФБ TCP_Client. Ответ от slave-устройства ожидается в течение времени tTimeout.

Вот буфер - это будет твоя строка!

Всеволод К
01.11.2025, 20:52
Благодарю! Буду пробовать-проверять в понедельник. Если всё получится, то выгружу код сюда для будущих поколений:)

*Я так понял, что OwenCommunication упрощённый и облегченный вариант библиотеки CAA Net Base Services?

Cs-Cs
01.11.2025, 21:02
Да там надо будет с нуля всё писать прям.
Прочитать документацию, найти пример (если он есть), попробовать его адаптировать под себя.

Вот про CAA не скажу - не знаю про неё, честно. OCL удобнее, и я другие не использовал.

Всеволод К
03.11.2025, 13:12
Спасибо большое ещё раз - пришло и ушло.
Теперь нужно предстоит разобраться с очисткой буфера и обрабатывать входящие данные, но это уже совсем другое приключение :)


*Ссылка на видео, в котором объясняется как построить сеть обмен. Вдруг кого-то спасёт потом:
https://rutube.ru/video/954e8ad8930187577572afc30d1dcbf7/?utm_source=embed&utm_medium=referral&utm_campaign=logo&utm_content=954e8ad8930187577572afc30d1dcbf7&utm_term=yastatic.net&t=0

Cs-Cs
03.11.2025, 15:29
Ура ура!
1. Про очистку буфера посмотри про функцию MemSet
И вообще, вот у меня тут пост был про всякое такое: https://cs-cs.net/codesys-kultura-koda-peremenniye-granicy-massivov#5
Тебе нужен заголовок 5.

2. В будущем будь внимателен в том, что String хорошо работает как буфер, если в данных все знаки читаемые
А если данные будут двоичные - то его будет глючить

3. У тебя у блока ставится xDone, когда обмен завершился.
Вот по нему надо будет:
* Забрать данные и окучить их
* Скинуть xExecute (у тебя через Try)

...и потом повторяь это снова периодически, когда надо данными обменяться

Всеволод К
05.11.2025, 23:29
1. С буфером удалось все
2. Учту. А что тогда лучше применять?
3. В целом, так и сделал. Работает как надо)
Еще раз спасибо)

Cs-Cs
06.11.2025, 10:35
Если данные двоичные - то сделай массив байтов и передавай ADR() и SIZEOF() от него.
Иногда, если данные (например от Modbus) в виде WORD - можно и массив WORD давать.
Главное вместо STRLEN SIZEOF использовать. Вообще SISEOF всегда правильнее.

karenalex
20.04.2026, 14:50
Здравствуйте! Столкнулся с проблемой отправки 0х00. Использую $00, он воспринимает как NUL и посылки нет. Если конвертировать в BUFFER_TO_STRING из массива ARRAY OF BYTE, то доходит до 16#00 и дальше не конвертит
Т. е в массиве barrRequest: ARRAY [0..2] OF BYTE :=[16#FF, 16#00, 16#FF ]; конвертится как FF и все. Как собрать такую посылку? Посылаю в COM через UNM_SerialRequest.

Cs-Cs
20.04.2026, 15:09
Правильно! Потому что STRING определяет свой конец именно по символу 16#00.
Так тебе надо сразу посылать массив свой. А не строку из него. Зачем ты его в строку конвертируешь?

capzap
20.04.2026, 15:30
Правильно! Потому что STRING определяет свой конец именно по символу 16#00.
Так тебе надо сразу посылать массив свой. А не строку из него. Зачем ты его в строку конвертируешь?

как интересно Вам доверили модерировать библиотеку если Вы не знаете как работать c unm )

capzap
20.04.2026, 15:32
Т. е в массиве barrRequest: ARRAY [0..2] OF BYTE :=[16#FF, 16#00, 16#FF ]; конвертится как FF и все. Как собрать такую посылку? Посылаю в COM через UNM_SerialRequest.

через указатель массив байт превращаете в строку и отправляете не глядя

Cs-Cs
20.04.2026, 16:27
как интересно Вам доверили модерировать библиотеку если Вы не знаете как работать c unm )Я так смотрю, ты прям ревунешь и никак не отпустишь ситуацию того, что ты её писал, а я её поправил. Потому что я сделал и забыл - а ты, как меня видишь, так постоянно припоминаешь.
Шо сказать? Изначально писать надо было лучше. И буферы и счётчики не забывать обнулять. И переменные называть не "Раз", "Два", "Три" на Итальянском, а как-то попонятнее. Тогда тебя бы и не рвало.
Пока что научиться от тебя нечему, уж извини.

А что я не так пишу? То же самое, что и ты: зачем превращать в строку, если можно сунуть указатель на адрес байтового массива?

capzap
20.04.2026, 18:20
Я так смотрю, ты прям ревунешь и никак не отпустишь ситуацию того, что ты её писал, а я её поправил. Потому что я сделал и забыл - а ты, как меня видишь, так постоянно припоминаешь.
Шо сказать? Изначально писать надо было лучше. И буферы и счётчики не забывать обнулять. И переменные называть не "Раз", "Два", "Три" на Итальянском, а как-то попонятнее. Тогда тебя бы и не рвало.
Пока что научиться от тебя нечему, уж извини.

А что я не так пишу? То же самое, что и ты: зачем превращать в строку, если можно сунуть указатель на адрес байтового массива?

как насчет бравады что Вы связаны NDA и тут открыто выносите некоторые сведенья, что типично для тех, у кого память как у рыбки, забыли видимо.
И это не ревность, может я что то просмотрел, но тот счетчик что как то связан с обработкой входящего сообщения инициализируется в стартовом кейсе и нулить его в последнем кейсе особого смысла нет, так что для меня это не аргумент.Только одна мысли про рыбью память, что пролистав несколько строк вниз уже забылось что было выше. Буферы обнулять это что то новое, Вы утверждали что требуется увеличить размер буферов и это не смотра на то что массив байт в PDU для одного SMS‑сообщения имеет фиксированный максимум — 140 байт + служебные поля 20 байт, поэтому и буферы увеличивать вопрос спорный, ну а писать что итальянский как то мешает программе нормально работать показывает кого тут поравло на самом деле

Cs-Cs
20.04.2026, 19:24
capzap Эх! Я бы рекомендовал тебе обратиться к психологу про ЧСВ и Хамство. Или к психиатру. Тут уже как пойдёт.
Причина: если бы три года назад ты написал бы мне в личку вежливо и корректно о том, что ты разработчик этой библиотеки, то мы бы всё с тобой обсудили бы.
НО ты этого не сделал, и для меня это критерий того, что я не обязан проявлять приветливость, вежливость и уважение. И помнить, что где говорил. Хах.

capzap
20.04.2026, 20:12
для меня это критерий того, что я не обязан проявлять приветливость, вежливость и уважение.

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

karenalex
21.04.2026, 08:06
Спасибо всем за ответ!

Cs-Cs
21.04.2026, 16:33
Спасибо всем за ответ! Так ты скажи самое главное: получилось?