Вы подключали модем так как в моём проекте, 485-2?
Вид для печати
Вы подключали модем так как в моём проекте, 485-2?
Это не так.Цитата:
Настройка скорости модема с СПК производиться? В документации написано, что да.
Покажите, пожалуйста, скриншотом, где вы это прочитали.
Переключателя чего?Цитата:
Оба переключателя на модеме должны быть включены?
У меня RS-485-2 занят - так что я подключал на RS-485-1.
Извините не в ту сторону посмотрел.Цитата:
Это не так.
Покажите, пожалуйста, скриншотом, где вы это прочитали.
у модема на лицевой стороне.Цитата:
Переключателя чего?
Спасибо. Скорость изменил, в лёгком проекте всё заработало, а в основном нет. Чудеса.
Здравствуйте. Подскажите по моему проекту, модем опрашивается ровно до того момента когда подаётся команда отправки СМС. а потом связь СПК и модема восстанавливается только перезагрузкой обоих устройств.
В основном проекте, в лёгком нагружал СМСки текстом и номерами телефона и всё отлично. В проекте примера тоже всё хорошо. В лёгком проекте и проекте примера опрос идёт постоянно, а в основном примере с перерывами и отваливается как только проходит команда отправки СМС.
Тогда я рекомендую приступить к вам отладке вашего основного проекта.
Начните с примера или легкого проекта, и постепенно переносите в него функционал вашего основного проекта, после каждого шага проверяя работу модема.
Когда начнутся проблемы - приступайте к изучению фрагмента кода, который вы добавили в проект прямо перед этим шагом.
Добрый день!
Вопрос. Одновременно иметь включенный интернет канал и при этом можно отправлять СМС-ки?
У меня IRZ RU21.
Добрый день.
В реализации нашего компонента Modem - нет; для передачи SMS нужно будет разорвать GPRS-соединение.
После беглого изучения документации у меня сложилось впечатление, что IRZ RU21 - это не модем, а шлюз из GPRS в Ethernet и RS-485/RS-232.
Т.е. использовать компонент Modem для работы с ним, вероятно, не получится в принципе.
В описании к 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-командами - т.е. для вашего устройства он не подойдет.
Приветствую!
Подскажите, есть ли возможность перезапускать компонент? Или каким-то образом пытаться повторно опросить модем?
Загвоздка такая: питание модема подключено через DO, при запуске модем включается и через две секунды проходит команда 'AT$0d'.
Похоже, модем к этому времени ещё не запустился - и не отвечает на команду. Если после этого сделать Сброс через Codesys, команда AT проходит и начинают сыпаться другие команды.
Если сброс не делать - далее ничего не происходит, даже после запуска модема.
В проекте можно отправить АТ команды и СМС, не получается принять СМС и не появляется флаг Application.Modem.xIsRegistration.
Вложение 64589
Здравствуйте. Подскажите, в групповой отправке смс нормально работают только два номера, если добавляю третий номер то отправка смс не происходит, что-то где-то теряется.
Почему при отключении модема от питания его статус (уровень сигнала и т.п.) не сбрасывается в СПК? И если подать питание на модем позже чем на СПК он не обновляет статус.
Добрый день, подскажите пожалуйста есть ли примеры отправки нескольких СМС подряд?
К примеру при информировании о неисправностях, аварийные сигналы могут приходить по несколько штук одновременно и по каждому нужно отправить СМС с описанием аварии.
Да, делал! Где-то даже на форуме описывал. Найти не могу, форум не ищет слова короче трёх букв, а SMS под них попадает.
Короче. Описываю алгоритм ещё раз.
1. Сделал структуру одного элемента очереди. Она состояла из строки-текста СМСки, номера абонента и булевого флага "Активно", который означал что данные в структуре есть и ещё НЕ обработаны.
Пусть будет так (пишу на псевдокоде):
STRUCT SMSQueueItem
Message : STRING;
Number : STRING;
Active : BOOL := FALSE;
END_STRUCT
2. Сделал два массива очередей: на входящие СМСки и на исходящие СМСки.
Границы описал константами, чтобы в циклах не накосячить и чтобы легко менять размер очередей.
VAR_CONSTANT
SMSMaxQueueSize : WORD := 30;
END_VAR
SMSQueueIn : ARRAY [1..SMSMaxQueueSize] OF SMSQueueItem;
SMSQueueOut : ARRAY [1..SMSMaxQueueSize] OF SMSQueueItem;
3. Сделал функцию AddNew**** которая принимает номер и текст и делает следующее:
* В цикле перебирает массив SMSQueueOut и ищет первый элемент с Active = FALSE.
* Запихивает туда переданные данные
* Помечает элемент Active = TRUE
4. Сделал программу, которая делает следующее:
* По таймеру BLINK раз в 3-5 сек (задаётся константой) ищет в массиве SMSQueueOut первый элемент с Active = TRUE, запихиает данные из него в модем и помечает этот элемент как Active = FALSE
* По флагу от Модема о том, что пришла СМСка, ищет первый элемент массива SMSQueueIn с Active = FALSE, пихает туда данные из СМСки и помечает его как Active = TRUE
* Отдельным куском кода крутится по массиву SMSQueueIn, ищет первый элемент с Active = TRUE, извлекает оттуда данные СМСки и что-то с ними делает.
Конкретно у меня - проверяет входящий номер по списку разрешённых и проверяет PIN-код (выдумал формат СМСки "PIN Команда" с разделением пробелом).
Если номер в списке разрешённых и если PIN-код верный - то Команда из СМСки кидается в функцию ProcessSMSCommand, которая уже делает что-то в ПЛК.
Cs-Cs Огромное спасибо за разъяснения, примерно так себе это и представлял, буду пробовать, но с массивами я пока на вы.
Хорошая тема для видео на канале CodesysOneLove, в продолжении цикла видео о сортировке насосов...
Да, без проблем!
Про видео... ну, если Евгений Кислов сделает про очередь на массивах - будет круто (это его канал).
Доброго времени суток. Возникла необходимость проверки баланса, будут сим-карты случайного оператора. Соответственно и номера запроса баланса тоже будут разные. В компоненте реализована жесткая привязка номера проверки баланса к оператору. Пробовал сделать сам, через АТ-команды, не получилось. Как решить эту задачу? Или подскажите, как в компоненте реализован механизм получения баланса?
Добрый день.
AT+CUSD=1, <str> (<str> – номер проверки баланса, без угловых скобочек)
Но с этим могут быть проблемы, потому что ответ приходит через неизвестный промежуток времени, а время ожидания ответа на пользовательскую AT-команду - 10 секунд.
В следующей версии компонента планируем сделать возможность задания номера получения баланса через переменную - такое пожелание зафиксировано.
С наступившим! Решил проблему запроса баланса через AT команды. Если кому интересно, распишу что и как, сейчас лень:rolleyes:. Просто выложу часть кода.
Функция UTF16_TO_WSTRINGКод:IF T_500ms.Q AND TargetVars.xIsRegistration THEN
CASE TargetVars.startBalance OF
0:
TargetVars.sAtCommandText:='AT+CSCS="GSM"';
TargetVars.xSendAtCommand:=TRUE;
IF TargetVars.sAtCommandAnswer='$R$NOK$R$N' THEN
TargetVars.xSendAtCommand:=FALSE;
TargetVars.xConfirmAtAnswer:=TRUE;
TargetVars.startBalance:=1;
END_IF
1:
IF TargetVars.xConfirmAtAnswer THEN
TargetVars.xConfirmAtAnswer:=FALSE;
END_IF
IF TargetVars.askBalance THEN
TargetVars.sAtCommandText:='ATV0';
TargetVars.xSendAtCommand:=TRUE;
TargetVars.wsUTF16:="Отправка запроса баланса оператору...";
IF TargetVars.sAtCommandAnswer='0$R$N' THEN
TargetVars.xSendAtCommand:=FALSE;
TargetVars.startBalance:=2;
END_IF
END_IF
2:
IF TargetVars.askBalance THEN
TargetVars.sAtCommandText:=TargetVars.sATBalanceAsk; // здесь сформированный AT запрос (например: AT+CUSD=1,"*165#")
TargetVars.xSendAtCommand:=TRUE;
TargetVars.wsUTF16:=UTF16_TO_WSTRING(TargetVars.sAtCommandAnswer);
ELSE
TargetVars.xSendAtCommand:=FALSE;
END_IF
3:
TargetVars.sAtCommandText:='ATV1';
TargetVars.xSendAtCommand:=TRUE;
IF TargetVars.sAtCommandAnswer='$R$NOK$R$N' THEN
TargetVars.xSendAtCommand:=FALSE;
TargetVars.xConfirmAtAnswer:=TRUE;
TargetVars.startBalance:=1;
END_IF
END_CASE
END_IF
Код:IF FIND(UTF16,'0$R$N+CUSD: 0, "')<>0 THEN
stemp:=OSU.ReplaceSubstring(UTF16,'0$R$N+CUSD: 0, "','');
FOR i:=1 TO LEN(stemp)-4 BY 4 DO
theChar[0]:=WSTRING_TO_WORD(WCONCAT("16#",WMID(OSU.CP1251_TO_UNICODE(stemp),4,i)));
UTF16_TO_WSTRING:=WCONCAT(UTF16_TO_WSTRING,theChar);
END_FOR
TargetVars.xSendAtCommand:=TargetVars.askBalance:=FALSE;
TargetVars.startBalance:=3;
ELSE
UTF16_TO_WSTRING:="Пожалуйста подождите...";
END_IF
Здравствуйте, возможно одновременно подключить модем ПМ01 к GPRS и принимать входящие СМС.