Библиотека прикрепленная к первому сообщению системы работает нормально. У меня все получилось.
При работе с модемом ПМ01 на скорости 9600 (я думаю с любым модемом и на всех скоростях, ситуация примерно совпадает) наблюдается следующий эффект.
Я попробовал отправлять сообщения каждую секунду, т.е. подавать передний фронт на вход SendSms функционального блока FB_SMS_SR раз в секунду.
Получателю приходило только каждое восьмое сообщение.
В моем проекте, события о которых нужно уведомлять по СМС могут происходить и чаще раза в 8 секунд, а допустить потерю данных нельзя.
Я разработал функциональный блок QUEUE_STRING, реализующий очередь строк.
Прикрепляю экспорт-файл с ФБ и выкладываю код функционального блока. Если кто-то заинтересуется, посмотрите, может найдутся ошибки которые я упустил.
Код:
FUNCTION_BLOCK QUEUE_STRING
VAR_INPUT
ITEM_IN : STRING; (*Item that you need to enqueue*)
ENQUEUE : BOOL; (*On this front ITEM_IN will be enqueued*)
DEQUEUE : BOOL; (*On this front next item will be dequeued to ITEM_OUT*)
SIZE : BYTE := 10; (*Size of queue*)
RESET : BOOL;
END_VAR
VAR_OUTPUT
ITEM_OUT : STRING;
ERROR_CODE : WORD; (*0 - OK, 1 - overflow, 2 - queue is empty*)
END_VAR
VAR
data : ARRAY[0..255] OF STRING;
head : BYTE;
tail : BYTE;
count : BYTE;
R_TRIG_ENQUEUE : R_TRIG;
R_TRIG_DEQUEUE : R_TRIG;
R_TRIG_RESET : R_TRIG;
END_VAR
Код:
R_TRIG_ENQUEUE(CLK := ENQUEUE);
R_TRIG_DEQUEUE(CLK := DEQUEUE);
R_TRIG_RESET(CLK := RESET);
IF R_TRIG_ENQUEUE.Q THEN
IF count < SIZE - 1 THEN
data[head] := ITEM_IN;
head := head + 1;
IF head = SIZE THEN
head := 0;
END_IF
count := count + 1;
ERROR_CODE := 0;
ELSE
ERROR_CODE := 1;
END_IF
END_IF
IF R_TRIG_DEQUEUE.Q THEN
IF count > 0 THEN
ITEM_OUT := data[tail];
tail := tail + 1;
IF tail = SIZE THEN
tail := 0;
END_IF
count := count - 1;
ERROR_CODE := 0;
ELSE
ERROR_CODE := 2;
END_IF
END_IF
IF R_TRIG_RESET.Q THEN
head := 0;
tail := 0;
count := 0;
ERROR_CODE := 0;
END_IF