PDA

Просмотр полной версии : Проблема с ПМ01 М02-24.АВ



grayeddy
26.12.2013, 13:44
Работал с 2 присланными недавно модемами.

При попытке установить настройки путем ввода AT-команд возникли проблемы:

1. При подключении к модему путем RS-485 (переключатель 1 - Off, переключатель 2 - Off)
- в терминале при нажатии на любую клавишу вспыхивает индикатор RXD.
- Индикатор TXD вообще не работает.
- Ввод визуально команд ATE1, АT не работает - никакого отклика, курсор в терминале не меняет положения.
- Команды АТ вводились как в верхнем, так и в нижнем регистрах.
- На команду GETTM таймера нет никакой реакции.

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

2. Подключаемся через RS-232 (переключатель 1 - On, переключатель 2 - Off).
- Ничего не работает.

В 2009-2010 работал с моделями ПМ01-24АВ, всего их было 44, все настраивалось без проблем.
Пару недель назад настраивал модем 2010 г, аналогично, проблем не было.

Видел, что положение контактов A и B (В на 4 контакте, A - на 5) в модеме выпуска 2013 (М02) по сравнению с 2009-2010 (B на 4 контакте, A - на 8) изменилось, это было учтено.

Какие варианты решения?

grayeddy
26.12.2013, 22:10
Наткнулся на аналогичную проблему http://www.owen.ru/forum/showthread.php?t=9989&page=2&p=77133&viewfull=1#post77133

Насторожило
ПМ01 [m02] - был продан ошибочно.
Их нельзя было продавать, но в Харькове несколько штук ушли клиентам.

Как узнать, какой сборки у меня модемы?

grayeddy
20.01.2014, 17:00
Перечитал инструкцию.
Как оказалось, модем был поставлен с автоматической перезагрузкой через 24 часа.
1. Вытащил картоприемник, командой SETTM 0 отключил автотаймер, GETTM убедил окончательно. Проверял неоднократно.

2. Вставил картоприемник с симкой.
Теперь другая беда - на AT команды нет никакого ответа (что в нижнем, что в верхнем регистрах). Проверял тоже не раз.

Прошу помощи - как активировать AT-команды? По сути, остался лишь один шаг.

ЗЫ: Для пояснения. AT-командами надо настроить скорость обмена + отключить эхо. Модем работает в связке с контроллером.

Пантелеев Дмитрий
20.01.2014, 17:17
Выставите дип переключатели следующим образом: 2 и 1 в положение ON.

grayeddy
21.01.2014, 10:37
Дмитрий, большое спасибо, действительно помогло!
У меня вопрос, чтобы прояснить ситуацию
Дипы 1 и 2 не перепутаны местами, ON и OFF?
Не понимаю, почему на старом модеме AT команды работают при дипах 1 и 2 в OFF, а на новом - все наоборот
.
ЗЫ: У меня более 40 старых модемов крутятся на дипах 1 и 2 в OFF, связь по RS-485.

Пантелеев Дмитрий
21.01.2014, 10:56
Модемы модификации М02 работают одновременно по двум интерфейсам, поэтому DIp переключатель интерфейсов изменили на настройку таймера перезагрузки.

grayeddy
21.01.2014, 11:09
Не знал насчет этой фичи, еще раз спасибо за ценную информацию.

grayeddy
30.01.2014, 14:25
Прошу снова помочь с модемами

Вкратце, есть работающий проект на ПЛК-100, работает уже почти 4 года

В программе пошагово инициализируется и запускается модем
1. at+creg?
2. at+cgatt=1
3. at+ciphead=1
4. at+cipsgp=1, "internet.mts.ru", "mts", "mts"
5. at+cdnsorip=0 <------ первая проблема
6. at+cipstart="txp", "xxx.xxx.xxx.xxx", "xxx"

далее идет первичное посылка серверу сообщения от клиента (ПЛК)
7.at+ cipsend<...>

8. И наконец, начинается крутится псевдоцикл, в котором принимаю/отправляю сообщения с (от) модема от(к) серверу(а)

Первая неожиданность, с которой столкнулся - модем модификации М02 не понимает команды at+cdnsorip - пишет error
Опрос командой at+cdnsorip? подтвердил проблему, вернул тоже error.

В модеме 2009 года at+cdnsorip проходит успешно
at+cdnsorip? возвращает 0

Пришлось закоммитить 5 шаг

Вторая проблема - после 7 шага модем отсылает первое сообщение (успешное), переходит на 8 шаг и там не принимает сообщений (как и отправку) от сервера и к серверу.

Что я сделал в настройках модема новой модели?
- скинул настройки atz
- at+ipr=9600 настроил скорость
- ate0 запретил эхо
- at&w записал изменения

Как видите, изменений немного, но почему железо ведет себя неадекватно?
Проверял неоднократно, на ПЛК со старым модемом все работает, стоит новый поставить (с измененной программой на ПЛК - убранным 5 шагом) - работает не так, как ожидалось (или вообще не работает по факту, что более справедливо) - отправит всего лишь одно сообщение и затыкивается.
Просто достало это вконец борьба с железом, опять сроки ввода в эксплуатацию полетели.

Командой at&v снял настройки с двух модемов - старой и последней модели, и они весьма меня озадачили, особенно от новой модели.
Прилагаю скриншот настроек нового модема.

Что не так, как перенести настройки от старой модели в новую модель?

Дмитрий Артюховский
30.01.2014, 17:21
модем М02 выполнен на другом чипсете, поэтому сравните их команды. Ну и при обмене проверяйте состояние gprs стека, многие команды доступны в определенном контексте и возвращают ошибку в случае если модем еще не вошел в требуемое состояние. А связь устанавливается и первое сообщение точно доходит?

grayeddy
31.01.2014, 09:09
По поводу связи - да, первое сообщение точно доходит до сервера.
Позже обнаружил, что сообщения доходят от сервера к модему (но все ли?), но я их не вижу под отладчиком в кодесис, надо разобраться и вспомнить, прошло 3 года с момента последней модификации проекта.
Буду благодарен за любые наводки, подсказки.

grayeddy
31.01.2014, 12:49
Поможет ли мне обновление прошивки ПЛК с 2.10 до 2.14?

grayeddy
01.02.2014, 19:09
Так, заработало, но не так как ожидалось

Принимает нормально, в ответ подготавливаю на отправку байтовый массив

Вот кусок кода, ответственного за отправку

str := 'AT+CIPSEND=';
str := CONCAT(str, INT_TO_STRING(fulllength));
str := CONCAT(str, '$R');
cnt := SysComWrite(aPort, ADR(str), LEN(str), 0);
g_sends_1 := cnt;
cnt := SysComWrite(aPort, ADR(outbuf), fulllength, 0);
g_sends_2 := cnt;
str := '$R';

cnt := SysComWrite(aPort, ADR(str), LEN(str), 0);
g_sends_3 := cnt;

g_send_bytes_to_pc := g_sends_1 + g_sends_2 + g_sends_3; <-- для отладки


На сервере в ответ вместо ожидаемого байтового массива (как отправил в таком виде, так и должен получить)
получаю в ответ посылку другого содержания (раскодированного), она ниже

AT+CIPS

Что за фигня?
Короче, проблема с отправкой.

Еще раз подчеркну - этот код корректно работает для модема старой модификации, почему не работает для новой модели ПМ-02?

grayeddy
01.02.2014, 20:22
Переделал на

str := 'AT+CIPSEND$R';
cnt := SysComWrite(aPort, ADR(str), LEN(str), 0);

cnt := SysComWrite(aPort, ADR(outbuf), fulllength, 0);
str := '$1A$R';

cnt := SysComWrite(aPort, ADR(str), LEN(str), 0);

В ответ на сервере появляется

65
84
43
67
73
80
83
84
65
84
85
83
13
65
84
43
67
73
80
83
69
78
68
13
255 <-- Нужный мне пакет, начинающийся с 255
120
1
18
18
157

с начала полученного пакета (65) и до 255, если перевести в байты в ASCII - получится типа "AT+CIPSTUS AT+CIPS;ND"

Первое слово очень похоже на команду AT+CIPSTATUS, второе - AT+CIPSEND
Как же все таки убрать этих паразитов?

capzap
01.02.2014, 20:55
либо не весь код выкладываете, но если все так как описано, то не ждете ответов на посланные команды, возможно поэтому все в одну строку лепится

grayeddy
02.02.2014, 13:00
> capzap
>... то не ждете ответов на посланные команды, возможно поэтому все в одну строку лепится

Нет, не думаю.

Сегодня однозначно локализовал проблему

Проблема в отправке командой AT+CIPSEND= (передаю бинарные данные)
Общий синтаксис AT+CIPSEND=<Длина данных><Данные>

Поправил от лишнего код, в программе сделал только один ответ (квитирую подтверждение полученных данных с сервера).
Единственная команда, которая отправляется серверу.

cnt: DWORD;
_index: BYTE;
outbuf: ARRAY[0..254] OF BYTE;
....
str := 'AT+CIPSEND=6$R';
cnt := SysComWrite(0, ADR(str), LEN(str), 0);
outbuf[0] := 255;
outbuf[1] := 0;
outbuf[2] := 120;
outbuf[3] := 0;
outbuf[4] := _index;
outbuf[5] := outbuf[2] + outbuf[4];
cnt := SysComWrite(0, ADR(outbuf), 6, 0);

_index например 25

Все просто. В посылке явно задаем дину передаваемого массива данных, в нашем случае 6, затем отправляем сами данные.
Ставлю модем старой модели.
На сервере принимаю

255
0
120
0
25
145

То что нужно!

Меняю на модем ПМ-02
В ответ получаю

65
84
43
67
73
80 (AT+CIP)

Ну как же так?

Один и тот же код, один и тот же контроллер.

ЧЯДНТ?????? :mad:

capzap
02.02.2014, 13:31
ни чего такого, на что я намекал, Вы не сделали, отправляете одну команду SysComWrite, и не дождавшись ответа Ok или ERROR посылаете вторую, вот возможно и выталкиваете в инет весь накопленный буффер модема, а то что на старом модеме получается, так вроде не секрет что чипсеты разные и значит имеется какое то отличие, уж не знаю в размере буффера или во временных задержках

grayeddy
02.02.2014, 16:21
Как сделать паузу, чтобы программа начала выполнение с того места, где остановилась?
Аналог Delay?

Решил поставить паузу в 200 мс между AT+CIPSEND и отправкой данных

Сделал так
VAR
...
timerTP: TP;
...

str := 'AT+CIPSEND=6$R';
cnt := SysComWrite(0, ADR(str), LEN(str), 0);
(* ставим паузу *)
timerTP(IN := TRUE, PT := T#200ms);
IF timerTP.Q THEN
timerTP(IN := FALSE):

outbuf[0] := 255;
outbuf[1] := 0;
outbuf[2] := 120;
outbuf[3] := 0;
outbuf[4] := _index;
outbuf[5] := outbuf[2] + outbuf[4];
cnt := SysComWrite(0, ADR(outbuf), 6, 0);
END_IF

Похоже не работает.
3а 4 года забыл про таймеры на ST

capzap
02.02.2014, 17:29
Кстати при первой записи проконтролируйте, сколько байт записалось,конечно не факт что это значение ушло в порт и всё же, может обнаружится какой прогресс почему слипаются команды

grayeddy
02.02.2014, 17:41
Уже прогресс. Когда ставлю брейк (breakpont) на местоположение таймера или выходного буфера (скажем на outbuf[0]) внутри END_IF , то все начинает работать как надо.

Просто жму далее F5 - и опа. все идет как надо.
Стоит снять брейк - не идет.

capzap
02.02.2014, 17:54
Третий раз тогда повторю, добавляйте в свой код прием ответа от модема и только после отправляйте следующую команду

grayeddy
05.02.2014, 19:13
Заработало. Да, внедрил в код проверку на ">" Пришлось рефакторить код, ранее я вызывал функцию из главного цикла, которая в свою очередь вызывала функцию отправки сообщений. На это ушло прилично времени.

Теперь другая проблема, надеюсь, последняя. Модем работает, принимает раздает, но иногда напрочь отказывается принимать входящие сообщения. Я это вижу из под отладчика (смотрю буфер) + сужу по индикации приема-передачи на самом модеме.
В коде постоянно опрашиваю статус AT+IPSTATUS модема + ведется время. Если лимит вышел или AT+IPSTATUS вернул отличное от "CONNECT OK" - выключаю, перезагружаю модем. Все это работает.

Проблема в том, что модем чаще в глухой отключке, чем на приеме. Почему?

Если что - могу выложить приватно код.

grayeddy
06.02.2014, 15:38
SysComRead(...). Длина запрашиваемых для чтения байтов больше чем размер буфера.
Поправил.
Все работает. Вопрос закрыт.