Просмотр полной версии : модем пм-01 иногда не отвечает
grayeddy
05.07.2010, 14:52
Здраствуйте!
Использую 25 контроллеров ПЛК-100-24 PL + модемов ПМ-01-24.АВ.
В программе в контроллере используется вот такой псевдоцикл:
1. AT+CREG?
2. AT+CGATT=1
3. AT+CIPHEAD=1
4. AT+CIPCSGP=1. "you_apn", "you_login", "you_password"
5. AT+CDNSORIP=0
6. AT+CIPSTART="TCP", "you_ip", "you_port"
7. Основной цикл, в котором все крутится.
Режим эха отключен, скорость 9600, RS-485
Для некоторых модемов (2 или 3) замечено следйщее.
При включении питания контроллера (когда обрабатываем метку 1) или при выходе из освновоно цикла на метку 1 модем:
- в ответ на команду AT+CREG? честно видит отправленное количество байтов (9 с учетом $R)
- при считывании из буфера - ничего не происходит, возвращает 0. Задавал паузу аж до 10 секунд
- при использовании AT+CIPSHUT правильно отправляется 11 байтов (с учетом $R)
- в ответ же пустота.
И вот получается, что контролер стучит модему команды без отановки, команды уходят - и ничего не приходит.
Что делать, какие идеи?
ЗЫ: Открытие порта происходит нормально, если бы не работал - ничего не было бы отправлено.
+ на остальных (работающих) контроллерах модемах работает один и то же программый код.
grayeddy
05.07.2010, 16:07
Кусок кода, на всяки случай добавил SysComClose(0) - порт по любому откроется.
По метке 1 в str_1 Ничего нет.
Могло ли повлиять отстутствие SysComClose(0) - пока не понял, не могу проверить, нет под рукой оборудования.
PS. Если руками стучать в гипертерминале AT+CREG?, предварительно связашись с модемом - то все ОК.
-----------------------------------------------------
FUNCTION ReadFromBuf : STRING
VAR_INPUT
END_VAR
VAR
buf: ARRAY[0..255] OF BYTE;
i, count: DWORD;
a_char: POINTER TO STRING;
str: STRING(255);
END_VAR
str := '';
count := SysComRead(0, ADR(buf), 256, 0);
IF count > 0 THEN
FOR i := 0 TO count - 1 DO
a_char := ADR(buf[i]);
str := CONCAT(str, LEFT(a_char^, 1));
END_FOR
END_IF
ReadFromBuf := str;
-----------------------------------------
CASE init_stage OF
0:
str_1 := '';
str_2 := '';
str_3 := '';
str_4 := '';
str_5 := '';
str_6 := '';
rcvStrTest := '';
FirstInit();
CheckTabel();
CheckStatus(FALSE);
CheckLight();
g_source := 1;
port_opened := FALSE;
port_init := FALSE;
SysComClose(0); (* 05.07.2010 <------ добавил, пока не проверил*)
IF NOT port_opened THEN
com_handle := SysComOpen(0);
IF com_handle <> 16#FFFFFFFF THEN
port_init := TRUE;
ELSE
SysComClose(0);
com_handle := SysComOpen(0);
port_init := TRUE;
END_IF
IF port_init THEN
com_set.Port := 0;
com_set.dwBaudRate := 9600;
com_set.byParity := 0;
com_set.dwTimeout := 0;
com_set.byStopBits := 0;
com_set.dwBufferSize := 0;
com_set.dwScan := 0;
res := SysComSetSettings(0, ADR(com_set));
(* успешно открыли *)
IF NOT res THEN
port_opened := TRUE;
(* Регистрация в сети *)
str := 'AT+CREG?$R';
i := SysComWrite(0, ADR(str), LEN(str), 0);
timer(IN := TRUE, PT := t#5s);
init_stage := 1;
END_IF
END_IF
END_IF
1: (* подключение модема к сервису GPRS *)
CheckLight();
timer(IN := TRUE);
IF NOT timer.Q THEN
timer(IN := FALSE);
str_1 := ReadFromBuf();
IF str_1 <> '' THEN
IF FIND(str_1, '+CREG: 0,1') <> 0 THEN
str := 'AT+CGATT=1$R';
i := SysComWrite(0, ADR(str), LEN(str), 0);
timer(IN := TRUE, PT := t#5s);
init_stage := 2;
ELSE
init_stage := 0;
END_IF
ELSE
init_stage := 0;
END_IF
END_IF
grayeddy
12.07.2010, 07:48
Проблема остается. 5 модемов из 25 регулярно сваливаются, остальные работают.
Замечено, что не работает TxD - индикатор на панели модема, показывающий передачу от модема (тут прямая связь с первым постом, это означает что на модем приходят команды, видно но RxD, в ответ же ничего. Странно, модем всегда должен отвечать).
Лечится радикальным способом - выключить и включить питание модема.
Такой вопрос - это не может обусловлено помехами? В качестве связи по RS-485 используется витая пара.
Илья Кареткин
12.07.2010, 08:56
после того как вы выкл-вкл питание до какого момента модемы работают нормально?
во избежание помех: соберите схемку с проблемными модемами на столе и сравните.
grayeddy
12.07.2010, 09:25
> после того как вы выкл-вкл питание до какого момента модемы работают нормально?
не могу однозначно сказать.бывает, что час, день, два дня или неделю. закономерности не выявил.
тест связи идет две недели.
> во избежание помех: соберите схемку с проблемными модемами на столе и сравните.
у нас уже собраны в ящики, расстояние между модемом и контроллером - около 10 см. сами ящики стоят на трансформаторных подстанциях. это может повлять?
grayeddy
13.07.2010, 08:36
Сами ящики заземлены.
Тогда вопрос - в каких случаях возможно "затыкание" TxD (или) RxD?
Какие могут варианты?
grayeddy
15.07.2010, 12:26
вскрыл корпус модема, нашел Sim300dz S2-10119b-f00d
на Sim300 помимо этого указаны S/n + IMEI.
последний номер продублирован на корпусе модема?
можно ли узнать номер версии прошивки SIM-300, указав IMEI?
grayeddy
15.07.2010, 13:14
про версию прошивки затем и спрашиваю, что, как насколько мне известно, если использовались старые версии прошивики Sim300 - модули иногда зависали, что только снятием и включением питания можно было вернуть их к работе.
проблема в том, что дергание питания было не предусмотрено изначально. да, это ошибка, но хотелось бы обойтись на данный момент малой кровью.
Илья Кареткин
15.07.2010, 15:16
Здравствуйте. Безусловно помехи влиять могут, но ответ в виде Error еще никто не отменял.
Свободных реле для перезапуска по питанию у вас нет? или щиты уже эксплуатируются?
grayeddy
16.07.2010, 11:55
решили, что будем перезапускать питание модема по команде контроллера (и програмной логики).
хотелось бы узнать, как реализовано у других - тоже дергают питание модема через контроллер или все таки полагаются целиком на модем?
щиты тестируются пока. все упирается в надежность связи.
и все же, можно узнать номер прошивки у сима в модеме? я навел справки - до 12 версии был такой косяк у сим300 - потеря связи и зависания.
и получится ли прошить (чисто гипотетически) при наличии соотвествующего оборудования?
grayeddy
16.07.2010, 13:36
Smh, спасибо за ответ!
по счастью, у меня 3 дискретных выхода свободно, заюзал 1, все работает.
а вот про зависания модемов не знал, это у меня первый полноценный опыт работы с ними. Взял на заметку.
Илья Кареткин
19.07.2010, 15:21
есть модемы, которые сами себя перегружают. но они заметно дороже.
например, овен пм01-220.х перезагрузка по встроенному таймеру - дискретность час. в ближайшее время начнется производство 24вольтовых модемов с подобной функцией)))
по теме: следите за зависанием в своей программе, запитав модем через реле.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot