Страница 96 из 97 ПерваяПервая ... 468694959697 ПоследняяПоследняя
Показано с 951 по 960 из 964

Тема: Библиотека SmsOwenLib для работы с SMS в CODESYS v2.3

  1. #951

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    по хорошему надо бы поставить счетчик на ErrCode больше нуля, там ошибки на один цикл только появляются, поэтому просто взглядом можно не увидеть, но раз зависает на установке ATE0 может как то связано с новыми чипами. Уберите это ФБ вообще из программы, он по сути только для изменения настроек модема, их можно и через гипертерминал один раз поставить и запомнить, основное это убрать эхо, чтоб не мешало обмену
    Без FB_SMS_CFG все то же самое, в блоке SR бегает До ATE0 и сбрасывается, смс не уходит, иногда ловил ошибку 99. хз что делать)
    Дело в том что, у меня на руках 2 модема, один 2016 второй 24 года. Оба рабочие через терминал. 16 года стоял на производстве, посылал аварии от АВРки, но после 21 года(может и в 22, точно не знаю) перестал отсылать. Местные думали что антена, и забили, а сейчас решили восстановить. и вот ни один ни второй модем не пашет на рабочей старой программе, и так же не пашет на простой проге(примера с сайта овен) которую я присылал. полный п(

  2. #952
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,591

    По умолчанию

    что то Вы путаете в SR нет кода 99, он только в CFG встречается. Библиотека рабочая, не знаю под какой чип выложена в шапке темы, но проблем не должно быть, возможно связано с подключением, вернее с не выключением соединения от гипертерминала. Оставте только 485 подключенный к модему, выключите - включите оба устройства и попробуйте еще раз, пауза по питанию, вероятно надо паузы побольше сделать без питания, потому что от батареек проект еще "крутится" какое то время. Можно еще создать пустой проект, добавить UNM и smsowenlib, но не пример брать, а открыть порт и использовать ФБ reqat, по переходу RST в FALSE должна отправляться любая АТ-команда, ответ будет в строке из 40 символов
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  3. #953

    По умолчанию

    В Sr есть ErrCode, он на функциональном блоке под Busy, ну и в переменных можно конечно же посмотреть(ErrCode BYTE код ошибки).UNDEFINED 99 Неопознанная ошибка. Но похоже да, пробовать остается через reqat.

  4. #954

    По умолчанию Код Модема

    Вот мой код для модема. Актуальность - 2024 год, Март.
    Выложил основное тело. Всякие очереди и методы СМСок не будут компилироваться.
    Мой код отличается от твоего тем, что у меня в конфигурации заданы параметры порта.

    Код:
    PROGRAM TaskSMS
    (* Управление модемом ПМ-01 для приёма и отправки СМСок *)
    VAR
    	(* Внешние переменные для задачи архивации *)
    	bExtCfgError		: BOOL;		(* Внешний флаг ошибки *)
    	bExtCfgErrorCode	: WORD;		(* Внешний код ошибки *)
    
    	(* Конфигурация модема и объекты работы с СМСками *)
    	fbSMSPort		: OpenPort;		(* Порт модема *)
    	fbSMSConfig		: FB_SMS_CFG;	(* Настройки модема *)
    	fbSMSObject		: FB_SMS_SR;	(* Объект приёма и отправки СМСок *)
    	bCfgOK			: BOOL := FALSE;	(* Флаг того, что модем успешно настроен и готов к работе *)
    	bCfgError		: BOOL := FALSE;	(* Флаг того, что при настройке модема была ошибка *)
    	wCfgErrCode		: WORD := 0;	(* Код ошибки модема *)
    	fbCfgErrorPulse	: TP;			(* Таймер выдержки ошибки настроек модема *)
    	fbCfgErrorExt	: TOF;			(* Таймер выдержки ошибки настроек модема для задачи Архиваии *)
    
    	(* Переменные для приёма и отправки СМСок *)
    	fbSMSInbound	: R_TRIG;		(* Отслеживание фронта новых СМСок *)
    	bReadyToSend	: BOOL;			(* Флаг того, что мы посылаем СМСку *)
    	bInSendMode		: BOOL;			(* Флаг того, что мы ждём конца отправки СМСки *)
    END_VAR
    VAR_TEMP
    	iPosRcv			: WORD := 0;	(* Счётчик очереди приёма СМСок *)
    	iPosSnd			: WORD := 0;	(* Счётчик очереди отправки СМСок *)
    END_VAR
    VAR CONSTANT
    	UNMDevNumber	: WORD := 0;		(* Номер UNM-устройства (с нуля) для порта модема *)
    	CFGErrorDelay	: TIME := t#60s;	(* Время выдержки ошибки настроек модема *)
    	CFGErrorExtTime	: TIME := t#120s;	(* Время выдержки ошибки настроек модема для задачи архивации *)
    END_VAR
    Код:
    (***************************************************************************************)
    (* Для начала смотрим на то, включено ли питание модема вообще. Если включено - пробуем его настроить. *)
    IF (hwCtlPowerPM = TRUE) THEN
    	fbSMSPort(Enable:= TRUE, DeviceNumber:= UNMDevNumber);
    
    	fbSMSConfig(Enable:= (fbSMSPort.OUT AND NOT bCfgError),
    				Handle:= UNMDevNumber,
    				PortCfg:= TRUE,
    				SaveCfg:= FALSE,
    				ModemART:= FALSE,
    				PortBaudrate:= '9600',
    				PortParity:= 0,
    				PortStopBits:= 1,
    				PortByteSize:= 8,
    				PortFlowCtrl:= 0
    			);
    
    	(* Забираем код ошибки и выставляем флаг ошибки или успеха *)
    	fbCfgErrorPulse(IN:= (fbSMSConfig.ErrCode <> 0), PT:= CFGErrorDelay);
    	IF (fbCfgErrorPulse.IN) THEN	(* Сохраняем код последней ошибки *)
    		wCfgErrCode := fbSMSConfig.ErrCode;
    		bExtCfgErrorCode := wCfgErrCode;
    	END_IF
    
    	bCfgError := fbCfgErrorPulse.Q;
    	bCfgOK := fbSMSConfig.Done AND NOT bCfgError;
    
    	(* Передаём значения ошибок на внешнюю задачу Архивации *)
    	fbCfgErrorExt(IN := bCfgError, PT := CFGErrorExtTime);
    	bExtCfgError := fbCfgErrorExt.Q;
    ELSE
    	(* Если модем выключен - закрываем порт и выключаем его, сбрасываем ошибки *)
    	fbSMSPort(Enable:= FALSE, DeviceNumber:= UNMDevNumber);
    	fbSMSConfig(Enable:= FALSE);
    
    	fbCfgErrorPulse(IN := FALSE, PT := t#0ms);
    	fbCfgErrorExt(IN := FALSE, PT := t#0ms);
    
    	bCfgOK := FALSE;
    	bCfgError := FALSE;
    	wCfgErrCode := 0;
    END_IF
    
    (* Сброс сигналов ошибок, если модем прошёл конфигурацию *)
    IF (bCfgOK = TRUE) THEN
    	bExtCfgError := FALSE;
    	bExtCfgErrorCode := 0;
    END_IF
    
    (***************************************************************************************)
    (* РАБОТА С МОДЕМОМ, ЕСЛИ ОН УСПЕШНО НАСТРОЕН *)
    fbSMSObject(
    	Enable			:= bCfgOK,
    	Handle			:= UNMDevNumber,
    	CsdClose		:= TRUE,		(* Запрет входящих звонков; модем всегда вешает трубку *)
    
    	CheckNum		:= SMSSettingsSequreInbound,	(* Проверять номер входящих СМСок по списку разрешённых? *)
    	CheckNumList	:= SMSSettingsSequreNumbers,	(* Список разрешённых номеров через ; без + и скобок: 71231234567 *)
    
    	(* Следующием переменные рапсисаны для наглядности и справки по их назначениям в дальнейшем коде программы *)
    	Busy			=> ,			(* Блок занят и что-то делает *)
    	ErrCode			=> ,			(* Код ошибки *)
    	SmsSend			=> ,			(* СМСка успешно отослана (можно дёргать следующее из очереди) *)
    
    	SendSms			:= ,			(* Команда запуска отправки СМСки (TRUE) *)
    	SendSmsText		:= ,			(* Текст СМСки, которую надо отсылать *)
    	SendSmsNum		:= ,			(* Номер, куда её надо отсылать *)
    
    	NewInSms		=> ,			(* Найдено новое входящее СМС - его надо обработать *)
    	NewInRing		=> ,			(* Есть входящий звонок (плевать на него =)) *)
    	NewInSmsText	=> ,			(* Текст новой входящей СМСки *)
    	NewInSmsTime	=> ,			(* Время новой входящей СМСки *)
    	NewInSmsNum		=>				(* Номер, с которого отправили входящую СМСку *)
    	);
    
    (***************************************************************************************)
    (* Этому блоку нужна обёртка из двух фич:
    а) Очередь исходящих СМСок: массив данных (структур), куда мы пихаем новую СМСку и забываем про неё.
    Когда блок свободен (.Busy = FALSE) и нет новых входящих СМСок (.NewInSms = FALSE), то мы извлекаем
    СМСки из очереди по одной и отсылаем их блоку, ожидая его готовности по .SmsSend.
    б) Очередь входящих СМСок: тоже массив данных (можно тех же структур). Работает по тому же принципу:
    Как только пришла входящая СМСка, читаенм её из FB и пихаем в эту очередь.
    Дальше, если очередь не пуста - извлекаем из неё СМСку и обрабатываем её. *)
    
    (***************************************************************************************)
    (* ОБРАБОТКА: Очередь Исходящих СМСок *)
    IF (fbSMSObject.Busy = FALSE) THEN	(* Работаем только если блок НЕ занят операциями *)
    	IF (bReadyToSend = FALSE) THEN
    		fbSMSObject.SendSms := FALSE;	(* Скидываем команду отправки СМСки *)
    		SMSOpDoSend();	(* Подготовка первой СМСки в отправке. Если она готова - выставится флаг bReadyToSend *)
    	ELSE	(* Работа по отправке СМСки и ожиданию успеха в этом *)
    		(* Здесь логика пизданутая: надо выставить флаг "SendSms" на некоторое время,
    		а потом дожидаться флага SmsSend, после чего выходить из этого блока.
    		Прям просится конечный автомат, но так как тут всего два состояния - делаем на IFах. *)
    
    		IF (bInSendMode = FALSE) THEN	(* Если мы не в режиме отправки СМСки, то входим в него *)
    			bInSendMode := TRUE;	(* Входим в режим отправки СМСок *)
    		ELSE	(* Мы в режиме отправки СМСки. Выставляем флаг отправки и ждём, когда всё будет ОК *)
    			fbSMSObject.SendSms := TRUE;	(* Выставляем флаг отправки СМСки *)
    
    			IF (fbSMSObject.SmsSend = TRUE) THEN (* Если СМСка отправлена успешно - выходим из режима отправки *)
    				fbSMSObject.SendSms := FALSE;	(* Скидываем команду отправки СМСки *)
    
    				(* Скидываем все флаги отправки СМСок *)
    				bReadyToSend := FALSE;
    				bInSendMode := FALSE;
    			END_IF
    		END_IF
    	END_IF
    END_IF
    
    (* Дополнительная заглушка: если СМСка отправилась в любом режиме (даже если блок Busy) - выходим из режима отправки *)
    IF (fbSMSObject.SmsSend = TRUE) THEN
    	fbSMSObject.SendSms := FALSE;	(* Скидываем команду отправки СМСки *)
    
    	(* Скидываем все флаги отправки СМСок *)
    	bReadyToSend := FALSE;
    	bInSendMode := FALSE;
    END_IF
    
    
    (***************************************************************************************)
    (* ОБРАБОТКА: Очередь Входящих СМСок *)
    fbSMSInbound(CLK := fbSMSObject.NewInSms);	(* Отслеживаем фронт новой СМСки *)
    IF (fbSMSInbound.Q = TRUE) THEN	(* Получили СМСку. Пихнём её в очередь *)
    	SMSOpDoRecieve();		(* Обработка приёма новой СМСки (ставим в очередь) *)
    ELSE
    	SMSProcessInbound();	(* Обрабатываем очередь входящих СМСок *)
    END_IF
    
    (* Всё *)
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

  5. #955
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,591

    По умолчанию

    При чем тут использование эстетично написанной программы? Если модем не отвечает ОКеем на ATE0, велика вероятность что на разных скоростях работают оба устройства, это можно выяснить только логом с самого плк, который может дать указанный выше ФБ, потому как в гипертерминале видно что ответ ОК
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  6. #956
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,591

    По умолчанию

    Цитата Сообщение от Неловкий Конь Посмотреть сообщение
    поочередно меняйте скорости, пока интерфейс 485 не начнет давать отклик
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  7. #957
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,070

    По умолчанию

    Накой? Модемы разучились автоопределять скорость?
    Посылки просто AT, с паузами ессно. До первого OK

  8. #958
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,591

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Накой? Модемы разучились автоопределять скорость?
    Посылки просто AT, с паузами ессно. До первого OK
    в какой нибудь теме, про условный ТРМ202, Вы так же будете задавать вопрос, зачем вы в плк со скоростью "играетесь" ведь существует автоопределение. Ни чего что я про RS-485 пишу?
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  9. #959

    По умолчанию

    capzap У меня там в FBшки настроек явно задана скорость.
    Я скинул в режиме "Вот моё работает".
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

  10. #960
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,591

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    capzap У меня там в FBшки настроек явно задана скорость.
    Я скинул в режиме "Вот моё работает".
    ну раз Вы имеете исходники на руках, ну удосужитесь посмотреть когда ATE0 посылается и когда настройки явной скорости модема задаются, смените скорость соединения по RS485 на другую, не ту которая сохранена в ПМ-01 и будет приходить мусор вместо OK и программа будет топтаться на месте на этом же третьем state
    Последний раз редактировалось capzap; Вчера в 13:41.
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

Страница 96 из 97 ПерваяПервая ... 468694959697 ПоследняяПоследняя

Похожие темы

  1. Библиотека ModemOwenLib [ver. 3.5.2.7] для работы с модемом в CODESYS v3.5
    от Трофимов Артем в разделе ПЛК3xx (архив)
    Ответов: 140
    Последнее сообщение: 06.06.2018, 13:38
  2. Полноценная библиотека для работы модема ПМ01 с SMS
    от Алексей Сорокин в разделе Помощь Разработчикам
    Ответов: 8
    Последнее сообщение: 06.03.2015, 12:36
  3. Библиотека для работы с gprs
    от alexsaska в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 27.02.2015, 13:01
  4. Ответов: 2
    Последнее сообщение: 21.11.2014, 21:53
  5. Необходима библиотека работы с модемом в CoDeSyS v3
    от Александр123456 в разделе ПЛК3xx (архив)
    Ответов: 2
    Последнее сообщение: 22.01.2012, 13:16

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •