Цитата Сообщение от Евгений Кислов Посмотреть сообщение
Помню, что Cs-Cs делал такое в своих проектах на базе очереди сообщений.
Возможно, он поделится примером кода или опишет алгоритм в общем виде.
Да, делал! Где-то даже на форуме описывал. Найти не могу, форум не ищет слова короче трёх букв, а 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, которая уже делает что-то в ПЛК.