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 всегда правильнее.