PDA

Просмотр полной версии : CODESYS V3.5. Работа с модемами



Евгений Кислов
23.09.2021, 10:37
Начиная с версии прошивки 1.2.0623.xxxx контроллеры Овен поддерживают работу с компонентом Modem.
Компонент входит в пакет таргет-файлов и добавляется в дерево проекта как отдельное устройство.

Поддерживаемый функционал:


отправка и получение SMS (в т.ч. групповая рассылка - поддерживается до 5 номеров);
проверка баланса;
выполнение произвольных AT-команд;
сбор диагностической информации;
организация GPRS-подключения (поддерживается в прошивках с системой исполнения CODESYS V3.5 SP16 Patch 3 и выше).


Компонент протестирован и адаптирован для работы с модемами:


Овен ПМ01 (https://owen.ru/product/pm01) (GSM-модуль SIM800);
TELEOFIS RX608-R2 (GSM-модуль TELIT GL865-DUAL V3.1);
iRZ TG21.А (GSM-модуль Telit GL868-DUAL V3);
Moxa OnCell G2111-T (GSM-модуль Cinterion BG2-W 01.002).


57132 57133 57134

Также в прошивках с системой исполнения CODESYS V3.5 SP16 Patch 3 добавлена экспериментальная поддержка модемов с интерфейсом USB.

57135 57136

Известные ограничения:


не гарантируется поддержка всех существующих модемов;
поддерживается только протокол GPRS. Отправка/прием SMS не поддерживается;
в случае подключения USB-модема джиттер задач CODESYS может возрасти;
может потребоваться подлючение модема через USB-хаб с внешним питанием (в зависимости от потребляемой мощности).


Документация (https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modems_v2.2.pdf) / Пример проекта (https://ftp.owen.ru/CoDeSys3/21_Examples/01_3.5.11.5/11_Other/Example_OwenModem_3516v1.projectarchive)
Видео: работа с SMS (https://youtu.be/J8sBHHyE6vc) / работа с GPRS (https://youtu.be/pPrzdSb3Am4) / подключение USB-модема (https://youtu.be/nLVf228HX4M) / видео от клиента (Электрошамана) (https://youtu.be/S3Ca4W9Hars?t=380)

Эдуард_Н
02.03.2022, 11:06
Пример в ST хорошо, но хотелось бы увидеть в CFC.

Евгений Кислов
02.03.2022, 11:16
Пример в ST хорошо, но хотелось бы увидеть в CFC.

В видео по SMS используется CFC.
С учетом того, что пользователю достаточно привязать переменные к каналам компонента и вызывать в нужные моменты две функции - то язык, на котором он пишет программу, вообще не имеет значения.

Эдуард_Н
04.03.2022, 05:34
В видео по SMS используется CFC.
С учетом того, что пользователю достаточно привязать переменные к каналам компонента и вызывать в нужные моменты две функции - то язык, на котором он пишет программу, вообще не имеет значения.

Как понять, что СМС отправлена, как происходит конвертация wstring в string? И всё таки сделайте ещё один пример, но на CFC, Вам будет не трудно, а таким как я понятнее.

Евгений Кислов
04.03.2022, 06:22
Как понять, что СМС отправлена

По переднему фронту канала Отправить SMS выполняется попытка отправки sms.
Если все требуемые для отправки условия соблюдены (баланс положительный, модем зарегистрирован в сети, указан корректный номер получателя - первые два пункта можно проверить с помощью соответствующих каналов компонента) - то с подавляющей вероятностью эта попытка будет успешной.

Чтобы определить это абсолютно точно - требуется организовать отправку ответа от получателя.
Соответственно, получив на стороне контроллера эту SMS - вы можете быть уверены в том, что ваша sms была отправлена и - что обычно не менее важно - что получатель с ней ознакомился.


И всё таки сделайте ещё один пример, но на CFC, Вам будет не трудно, а таким как я понятнее.

Всё-таки, посмотрите, пожалуйста, видео:
https://youtu.be/J8sBHHyE6vc

Если вам в нем что-то непонятно - уточните, что именно. Пока что я не знаю, что вам непонятно - и, соотственно, не понимаю, как сделать понятный для вас пример.

Эдуард_Н
04.03.2022, 07:39
По переднему фронту канала Отправить SMS выполняется попытка отправки sms.
Если все требуемые для отправки условия соблюдены (баланс положительный, модем зарегистрирован в сети, указан корректный номер получателя - первые два пункта можно проверить с помощью соответствующих каналов компонента) - то с подавляющей вероятностью эта попытка будет успешной.

Чтобы определить это абсолютно точно - требуется организовать отправку ответа от получателя.
Соответственно, получив на стороне контроллера эту SMS - вы можете быть уверены в том, что ваша sms была отправлена и - что обычно не менее важно - что получатель с ней ознакомился.



Всё-таки, посмотрите, пожалуйста, видео:
https://youtu.be/J8sBHHyE6vc

Если вам в нем что-то непонятно - уточните, что именно. Пока что я не знаю, что вам непонятно - и, соотственно, не понимаю, как сделать понятный для вас пример.

В примере как не смотрел так и не понял как происходит конвертация текста отправляемой СМС wstring в string (только из-за этого и хочу увидеть в CFC)? Спасибо, что уделяете мне время.

Евгений Кислов
04.03.2022, 08:08
В примере как не смотрел так и не понял как происходит конвертация текста отправляемой СМС wstring в string (только из-за этого и хочу увидеть в CFC)? Спасибо, что уделяете мне время.

В видеопримере этой конвертации нет.
Если она необходима - можно использовать функции из библиотеке OwenStringUtils.
См. п. 2.3.1, 2.3.2:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_OwenStringUtils_v2.1.pdf

Там, кстати, примеры как раз на CFC.

Эдуард_Н
05.03.2022, 10:53
59551 правильно я понял как проверять баланс?

Евгений Кислов
05.03.2022, 11:04
59551 правильно я понял как проверять баланс?

Нет, вы поняли неправильно.
У вас переменная sBalanceMessage ничего не записывается.
Адрес этой переменной нужно передать на вход функции GetBalance.
Также нужно добавить этой функции вход EN и завести на него выход вашего триггера.
Т.е.

xNewBalance--------->R_TRIG-->EN
sBalanceMessage---->ADR------>pBalance

Эдуард_Н
05.03.2022, 11:30
Нет, вы поняли неправильно.
У вас переменная sBalanceMessage ничего не записывается.
Адрес этой переменной нужно передать на вход функции GetBalance.
Также нужно добавить этой функции вход EN и завести на него выход вашего триггера.
Т.е.

xNewBalance--------->R_TRIG-->EN
sBalanceMessage---->ADR------>pBalance

Спасибо, вроде понял.59553

Евгений Кислов
05.03.2022, 11:34
Да, так должно работать.
У CP1251_TO_UNICODE тоже можно добавить вход EN, чтобы не вызывать ее зря в каждом цикле.

Эдуард_Н
05.03.2022, 12:10
Да, так должно работать.
У CP1251_TO_UNICODE тоже можно добавить вход EN, чтобы не вызывать ее зря в каждом цикле.

Да, правильно. Но я так ине понял как это работает (выделенное)59554

Эдуард_Н
16.03.2022, 12:57
Подскажите, как вводить номера телефона не в одну строку, а разбить на 5 строк?

Евгений Кислов
16.03.2022, 12:58
Подскажите, как вводить номера телефона не в одну строку, а разбить на 5 строк?

Объявите 5 строковых переменных (вероятно, они будут использованы в визуализации), а потом объедините их с помощью функции CONCAT из библиотеки Standard в одну строку, которая будет привязана к каналу компонента.

Эдуард_Н
16.03.2022, 13:05
Объявите 5 строковых переменных (вероятно, они будут использованы в визуализации), а потом объедините их с помощью функции CONCAT из библиотеки Standard в одну строку, которая будет привязана к каналу компонента.

Спасибо, так и думал. Только придётся с ; разделителем плюсовать.

Эдуард_Н
16.03.2022, 15:05
Объявите 5 строковых переменных (вероятно, они будут использованы в визуализации), а потом объедините их с помощью функции CONCAT из библиотеки Standard в одну строку, которая будет привязана к каналу компонента.

59712 Так пойдёт?

Евгений Кислов
16.03.2022, 16:24
59712 Так пойдёт?

После последнего номера ';' можно не ставить.
Если вас это устраивает - то используйте, конечно.

Эдуард_Н
16.03.2022, 16:44
После последнего номера ';' можно не ставить.
Если вас это устраивает - то используйте, конечно. В CFC думаю лучше вряд ли придумать, или у вас есть предложения?

P.S. Ещё "+" пристегнуть надо будет, чтоб упростить ввод.

Евгений Кислов
16.03.2022, 16:56
В CFC думаю лучше вряд ли придумать, или у вас есть предложения?

Я не сторонник низкоуровневого кодирования на CFC, так что комментировать не буду.

Эдуард_Н
16.03.2022, 17:01
Я не сторонник низкоуровневого кодирования на CFC, так что комментировать не буду.

Предложите свой вариант, в ST. И для меня примером будет. Пробую в ST, но пока тяжело.

Эдуард_Н
16.03.2022, 17:43
Если не вводить ни одного номера, будет происходить отправка СМС?

Евгений Кислов
16.03.2022, 17:50
Если не вводить ни одного номера, будет происходить отправка СМС?

Нет, потому что непонятно, куда в таком случае ее отправлять.

Евгений Кислов
16.03.2022, 18:29
Предложите свой вариант, в ST. И для меня примером будет. Пробую в ST, но пока тяжело.

В качестве примера:



PROGRAM PLC_PRG
VAR
// задал 2 номера для теста
asPhoneNumbers: ARRAY [1..c_iPhoneNumberCount] OF STRING(16) := ['79101234567', '','79101234568', '', ''];
sModemPhoneNumbers: STRING;
i: INT;
xCreateString: BOOL;
END_VAR
VAR CONSTANT
c_iPhoneNumberCount: INT := 5;
END_VAR



IF xCreateString THEN

// очищаем строку
MEM.MemFill(ADR(sModemPhoneNumbers), SIZEOF(sModemPhoneNumbers), 0);

FOR i := 1 TO c_iPhoneNumberCount DO

// игнорируем незаданные номера
IF asPhoneNumbers[i] = '' THEN
CONTINUE;
ELSE
sModemPhoneNumbers := OSU.CONCAT4(sModemPhoneNumbers, '+', asPhoneNumbers[i], ';');
END_IF
END_FOR

// после последнего номера не должно быть разделителя
sModemPhoneNumbers[LEN(sModemPhoneNumbers) - 1] := 0;

xCreateString := FALSE;

END_IF

Эдуард_Н
16.03.2022, 20:35
В качестве примера:



PROGRAM PLC_PRG
VAR
// задал 2 номера для теста
asPhoneNumbers: ARRAY [1..c_iPhoneNumberCount] OF STRING(16) := ['79101234567', '','79101234568', '', ''];
sModemPhoneNumbers: STRING;
i: INT;
xCreateString: BOOL;
END_VAR
VAR CONSTANT
c_iPhoneNumberCount: INT := 5;
END_VAR



IF xCreateString THEN

// очищаем строку
MEM.MemFill(ADR(sModemPhoneNumbers), SIZEOF(sModemPhoneNumbers), 0);

FOR i := 1 TO c_iPhoneNumberCount DO

// игнорируем незаданные номера
IF asPhoneNumbers[i] = '' THEN
CONTINUE;
ELSE
sModemPhoneNumbers := OSU.CONCAT4(sModemPhoneNumbers, '+', asPhoneNumbers[i], ';');
END_IF
END_FOR

// после последнего номера не должно быть разделителя
sModemPhoneNumbers[LEN(sModemPhoneNumbers) - 1] := 0;

xCreateString := FALSE;

END_IF


Так понимаю, что в эмуляции не работает?

Евгений Кислов
16.03.2022, 20:37
Этот код сработает и в эмуляции.

Эдуард_Н
16.03.2022, 20:48
Этот код сработает и в эмуляции.

Но вроде не работает или там библиотека ещё нужна?59727


Всё, понял. Спасибо.

Эдуард_Н
17.03.2022, 11:52
Подскажите к какому порту лучше подключить модем к 232 или 485?

Евгений Кислов
17.03.2022, 11:58
Подскажите к какому порту лучше подключить модем к 232 или 485?

Зависит от того, какие интерфейсы есть у модема.
Если есть оба и для RS-232 не требуются дополнительные пины (RTS/CTS и т.д.) - то разницы нет.

Эдуард_Н
17.03.2022, 12:01
Зависит от того, какие интерфейсы есть у модема.
Если есть оба и для RS-232 не требуются дополнительные пины (RTS/CTS и т.д.) - то разницы нет.

Модем конечно ваш, зачем огород городить.

Эдуард_Н
30.03.2022, 06:27
Здравствуйте, подскажите компонент модем теперь сам конфигурирует модем? Какую лучше скорость обмена с портом ставить?

Евгений Кислов
30.03.2022, 06:32
Здравствуйте

Добрый день.


компонент модем теперь сам конфигурирует модем?

Нет.


Какую лучше скорость обмена с портом ставить?

Ту, которая задана в настройках модема.

Эдуард_Н
31.03.2022, 06:31
Добрый день. СМС отправить удалось, а получить сигналы статуса и уровня сигнала нет, что делать?

Евгений Кислов
31.03.2022, 06:33
Добрый день. СМС отправить удалось, а получить сигналы статуса и уровня сигнала нет, что делать?

Добрый день.
Какая версия прошивки у вашего контроллера?

Эдуард_Н
31.03.2022, 09:49
Добрый день.
Какая версия прошивки у вашего контроллера?

Версия 1.3.0620.0031

Евгений Кислов
31.03.2022, 10:12
Версия 1.3.0620.0031

Выложите ваш проект, пожалуйста - мы проверим у себя.

Эдуард_Н
31.03.2022, 11:54
Выложите ваш проект, пожалуйста - мы проверим у себя.

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

Евгений Кислов
31.03.2022, 12:18
Отправил Вам на почту. строго не судите.

У меня с вашим проектом диагностика работает без проблем.

60030

Рекомендую настроить модем на 115200.

Эдуард_Н
31.03.2022, 13:24
У меня с вашим проектом диагностика работает без проблем.

60030

Рекомендую настроить модем на 115200.

И СМС отправляется?

Евгений Кислов
31.03.2022, 13:27
Смс я не тестировал, потому что "Первый пример выполнен по вашему видео и он ещё как-то работает, отправляет СМС".
Т.е. очевидно, что на стороне контроллера и модема проблем в этом случае нет.

Эдуард_Н
31.03.2022, 13:28
Рекомендую настроить модем на 115200. Настройка скорости модема с СПК производиться? В документации написано, что да.
Оба переключателя на модеме должны быть включены?

Эдуард_Н
31.03.2022, 13:40
Вы подключали модем так как в моём проекте, 485-2?

Евгений Кислов
31.03.2022, 13:41
Настройка скорости модема с СПК производиться? В документации написано, что да.

Это не так.
Покажите, пожалуйста, скриншотом, где вы это прочитали.



Оба переключателя на модеме должны быть включены?


Переключателя чего?


Вы подключали модем так как в моём проекте, 485-2?

У меня RS-485-2 занят - так что я подключал на RS-485-1.

Эдуард_Н
31.03.2022, 14:22
Это не так.
Покажите, пожалуйста, скриншотом, где вы это прочитали. Извините не в ту сторону посмотрел.

Переключателя чего? у модема на лицевой стороне.

Евгений Кислов
31.03.2022, 14:37
Извините не в ту сторону посмотрел.
у модема на лицевой стороне.

В РЭ указано, для чего нужны переключатели.
Первый - терминирующей резистор (в вашем случае, на мой взгляд, не имеет смысла его включать)
Второй - режим работы модема (в вашем случае должен быть в положении On - прием и передача данных)

Эдуард_Н
31.03.2022, 15:07
Спасибо. Скорость изменил, в лёгком проекте всё заработало, а в основном нет. Чудеса.

Эдуард_Н
01.04.2022, 08:58
Здравствуйте. Подскажите по моему проекту, модем опрашивается ровно до того момента когда подаётся команда отправки СМС. а потом связь СПК и модема восстанавливается только перезагрузкой обоих устройств.

Евгений Кислов
01.04.2022, 09:03
Здравствуйте. Подскажите по моему проекту, модем опрашивается ровно до того момента когда подаётся команда отправки СМС. а потом связь СПК и модема восстанавливается только перезагрузкой обоих устройств.

Добрый день.
Это проявляется в "легком" или "основном" проекте?
Проявляется ли это в проекте примера, если не вносить в него изменений?

Эдуард_Н
01.04.2022, 09:38
Добрый день.
Это проявляется в "легком" или "основном" проекте?
Проявляется ли это в проекте примера, если не вносить в него изменений?

В основном проекте, в лёгком нагружал СМСки текстом и номерами телефона и всё отлично. В проекте примера тоже всё хорошо. В лёгком проекте и проекте примера опрос идёт постоянно, а в основном примере с перерывами и отваливается как только проходит команда отправки СМС.

Евгений Кислов
01.04.2022, 10:42
В основном проекте, в лёгком нагружал СМСки текстом и номерами телефона и всё отлично. В проекте примера тоже всё хорошо. В лёгком проекте и проекте примера опрос идёт постоянно, а в основном примере с перерывами и отваливается как только проходит команда отправки СМС.

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

Эдуард_Н
01.04.2022, 12:54
Тогда я рекомендую приступить к вам отладке вашего основного проекта.
Начните с примера или легкого проекта, и постепенно переносите в него функционал вашего основного проекта, после каждого шага проверяя работу модема.
Когда начнутся проблемы - приступайте к изучению фрагмента кода, который вы добавили в проект прямо перед этим шагом.

Вся проблема в не подключенных модулей расширения, СПК все силы отдаёт на опрос не подключенных модулей. Убрал их из проекта и отправка СМС и контроль уровня и регистрации в сети пошли нормально.

СергейНовосиб
16.09.2022, 05:12
Добрый день!

Вопрос. Одновременно иметь включенный интернет канал и при этом можно отправлять СМС-ки?

У меня IRZ RU21.

Евгений Кислов
16.09.2022, 06:19
Добрый день!

Вопрос. Одновременно иметь включенный интернет канал и при этом можно отправлять СМС-ки?

У меня IRZ RU21.

Добрый день.
В реализации нашего компонента Modem - нет; для передачи SMS нужно будет разорвать GPRS-соединение.

После беглого изучения документации у меня сложилось впечатление, что IRZ RU21 - это не модем, а шлюз из GPRS в Ethernet и RS-485/RS-232.
Т.е. использовать компонент Modem для работы с ним, вероятно, не получится в принципе.

СергейНовосиб
16.09.2022, 07:48
В описании к IRZ RU21 написано:

Дополнительные функции:
Проброс портов для доступа к ресурсам локальной сети
Клиент DynDNS для обновления информации о доменном имени при использовании динамического IP-адреса
Туннели GRE, IPsec и OpenVPN
Удалённый доступ к внешнему устройству через СОМ-порт по TCP/IP
Синхронизация внутренних часов с внешними источниками
Отправка SMS через Telnet и через Web-интерфейс
Резервная SIM-карта
Обслуживание, управление и мониторинг (OAM) через Web-интерфейс
DHСP Server
Firewall (iptables)
Аппаратный сторожевой таймер (Watchdog)

А как это можно использовать. Я понял, что любой модем не поддерживает такой режим работы :(

Евгений Кислов
16.09.2022, 08:06
В описании к IRZ RU21 написано:

Дополнительные функции:
Проброс портов для доступа к ресурсам локальной сети
Клиент DynDNS для обновления информации о доменном имени при использовании динамического IP-адреса
Туннели GRE, IPsec и OpenVPN
Удалённый доступ к внешнему устройству через СОМ-порт по TCP/IP
Синхронизация внутренних часов с внешними источниками
Отправка SMS через Telnet и через Web-интерфейс
Резервная SIM-карта
Обслуживание, управление и мониторинг (OAM) через Web-интерфейс
DHСP Server
Firewall (iptables)
Аппаратный сторожевой таймер (Watchdog)

А как это можно использовать. Я понял, что любой модем не поддерживает такой режим работы :(

Через web-интерфейс - очевидно, руками.
Через telnet - в наших контроллерах это можно реализовать через библиотеку CmpSysExec.
Конкретно такого примера у нас нет, но начать можно с этого видео: https://youtu.be/xFvN0BryJFk
Компонент Modem предназначен для работы с модемами, подключаемыми через RS-232/RS-485 и управляемыми AT-командами - т.е. для вашего устройства он не подойдет.

SCOwenUfa
16.12.2022, 13:49
Приветствую!

Подскажите, есть ли возможность перезапускать компонент? Или каким-то образом пытаться повторно опросить модем?

Загвоздка такая: питание модема подключено через DO, при запуске модем включается и через две секунды проходит команда 'AT$0d'.
Похоже, модем к этому времени ещё не запустился - и не отвечает на команду. Если после этого сделать Сброс через Codesys, команда AT проходит и начинают сыпаться другие команды.
Если сброс не делать - далее ничего не происходит, даже после запуска модема.

В проекте можно отправить АТ команды и СМС, не получается принять СМС и не появляется флаг Application.Modem.xIsRegistration.

64589

Евгений Кислов
16.12.2022, 13:53
Приветствую!

Подскажите, есть ли возможность перезапускать компонент? Или каким-то образом пытаться повторно опросить модем?

Загвоздка такая: питание модема подключено через DO, при запуске модем включается и через две секунды проходит команда 'AT$0d'.
Похоже, модем к этому времени ещё не запустился - и не отвечает на команду. Если после этого сделать Сброс через Codesys, команда AT проходит и начинают сыпаться другие команды. 64589

Добрый день.
В текущей версии компонента такой возможности нет.
Мы постараемся поддержать ее в следующей версии.

Эдуард_Н
30.01.2024, 07:02
Здравствуйте. Подскажите, в групповой отправке смс нормально работают только два номера, если добавляю третий номер то отправка смс не происходит, что-то где-то теряется.

Евгений Кислов
30.01.2024, 08:22
Здравствуйте. Подскажите, в групповой отправке смс нормально работают только два номера, если добавляю третий номер то отправка смс не происходит, что-то где-то теряется.

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

Эдуард_Н
31.01.2024, 09:22
Добрый день.
Проверили сейчас у себя - все работает корректно.
Проверяли с помощью тестового проекта, который выложен на нашем сайте.
Попробуйте провести эксперимент с ним - повторится ли ваша проблема в этом случае?

Почему то проблемы эти начинаются при опросе всех подключенных модулей, будем экспериментировать. Подскажите какую скорость опроса модулей оптимально установить?

Евгений Кислов
31.01.2024, 10:25
Почему то проблемы эти начинаются при опросе всех подключенных модулей, будем экспериментировать. Подскажите какую скорость опроса модулей оптимально установить?

Каковы критерии оптимальности?

Эдуард_Н
31.01.2024, 13:42
Каковы критерии оптимальности?

Сейчас они работают на скорости 19200, может перевести на 115200?

Евгений Кислов
31.01.2024, 13:57
Сейчас они работают на скорости 19200, может перевести на 115200?

Как считаете нужным.

Эдуард_Н
07.02.2024, 07:18
Почему при отключении модема от питания его статус (уровень сигнала и т.п.) не сбрасывается в СПК? И если подать питание на модем позже чем на СПК он не обновляет статус.

Евгений Кислов
07.02.2024, 08:43
И если подать питание на модем позже чем на СПК он не обновляет статус.

Мы планируем исправить это поведение в прошивке СПК210, дав возможность пользователю реанициализировать сеанс связи с модемом в любой момент времени.


Почему при отключении модема от питания его статус (уровень сигнала и т.п.) не сбрасывается в СПК?

Проверим этот момент. Если он проявится - то постараемся исправить.