А при чём тут Modbus вообще?
Вид для печати
А при чём тут Modbus вообще?
imaex,
Modbus здесь ни причем, но как то нужно обозначить порт RS232 и к нему обратиться, я так понимаю, я жеж учусь...
Все...разобрался, "покурил" литературу. Печатает, как нужно... Не туда копал, пардоньте
Спасибо
Доброй ночи!
Подскажите, пожалуйста, настроил печать принтера через OwenCommunication, все хорошо печатает, но только одну строку (команду на принтер).
Пишу в ST.
Пробовал через несколько экземпляров обращаться к функции (пардоньте, если некорректно выражаюсь) OCL.UNM_SerialRequest и в этом случае можно отправить много данных (строк), либо через буфер - отправляю много строк, однако, когда все напечатается, я не могу повторно запустить функции с именами, которые выполнились ранее, т.е. к примеру:
Каждый экземпляр запускается один раз и перезапустить его условной кнопкой не получается.Код:VAR
fbUS01: OCL.UNM_SerialRequest;
....
fbUS09: OCL.UNM_SerialRequest;
snd_str01: STRING := 'Привет мир 01! $0D';
..
snd_str09: STRING := 'Привет мир 09! $0D';
END_VAR
fbUS01 (xExecute:=TRUE, hCom:=fbComControl.hCom, pRequest:=ADR(snd_str01), szRequest:=SIZEOF(snd_str01));
..
fbUS09 (xExecute:=TRUE, hCom:=fbComControl.hCom, pRequest:=ADR(snd_str09), szRequest:=SIZEOF(snd_str09));
Может быть как то что-то сбросить (обнулить) нужно?
Спасибо
Добрый день.
Вам достаточно одного экземпляра UNM_SerialRequest.
При вызове передавайте на вход xExecute единичный импульс (например, выход R_TRIG), а на pRequest / szRequest указатель и размер буфера нужной в данный момент команды.
Евгений Кислов,
Спасибо,
Попробовал несколько вариантов:
1. Без триггера, xExecute:=TRUE
При таком варианте строка данные отправляются на принтер, строка печатается, xExecute переходит в FALSE, но fbUS.xBusy после этого всегда остается TRUE, т.е. в порт (на печать) я отправить больше ничего не могу.Код:snd_str:= BufToPrint[10];
fbUS(hCom:=fbComControl.hCom, pRequest:=ADR(snd_str),szRequest:=TO_UDINT(LEN(snd_str)));
fbUS.xExecute:=TRUE; fbUS();
fbUS(xExecute:=FALSE, hCom:=0, pRequest:=CAA.Constants.gc_hINVALID,szRequest:=CAA.Constants.gc_szZERO);
2. с другой стороны попробовал печатать несколько строк и несколько разных вариантов все сделал внутри CASE:
вне (после) CASE стоит:Код:CASE Sabstage OF
0: IF fbComControl.xActive THEN
IF NOT TmrPrint1.Q AND //таймер задержки не запущен
NOT TIME_TO_BOOL(TmrPrint1.ET)
THEN
snd_str:= BufToPrint[Iterator];
fbUS(hCom:=fbComControl.hCom, pRequest:=ADR(snd_str),szRequest:=TO_UDINT(LEN(snd_str)));
fbUS.xExecute:=TRUE; fbUS(); // отправить данные в COM
TmrPrint1.IN:= TRUE; TmrPrint1(); //запуск таймера
ELSIF TmrPrint1.Q THEN //таймер задержки прошел
TmrPrint1(IN := FALSE, RS:=TRUE); // сброс таймера задержки
SabstageNN:=1;
END_IF
END_IF
1: Iterator:=Iterator+1;
SabstageNN:=0;
END_CASE
В таком случае все отрабатывает и в конце fbUS.xBusy переходит в FALSE, т.е. разрешает отправлять новые данные в порт.Код:fbUS(xExecute:=FALSE, hCom:=0, pRequest:=CAA.Constants.gc_hINVALID,szRequest:=CAA.Constants.gc_szZERO);
Вопрос, почему в первом случае не работает.
Технически меня устраивает второй вариант, т.к. он мне сколько угодно строк и разными пачками напечатает, но хочется короче.
Кроме прочего, если убираю строку:
,Код:fbUS(xExecute:=FALSE, hCom:=0, pRequest:=CAA.Constants.gc_hINVALID,szRequest:=CAA.Constants.gc_szZERO);
то уже ничего не работает.
Если, что либо или полностью перенести в ФБ или функцию - не работает, т.е. структура работает только в основной программе или объекте Actoin
Спасибо,
Потому что ФБ UNM_SerialRequest выполняется асинхронно (в течение нескольких циклов задачи), и вы не даете ему отработать.Цитата:
Вопрос, почему в первом случае не работает.
Вызывать его экземпляр с xExecute:=FALSE нужно только после успешного завершения работы (fbUS.xDone) или завершения с ошибкой (fbUs.xError).
Код:IF fbUS.xDone THEN
// обработка ответа
fbUS(xExecute:=FALSE, hCom:=0, pRequest:=CAA.Constants.gc_hINVALID,szRequest:=CAA.Constants.gc_szZERO);
ELSIF fbUS.xError
// обработка ошибки
fbUS(xExecute:=FALSE, hCom:=0, pRequest:=CAA.Constants.gc_hINVALID,szRequest:=CAA.Constants.gc_szZERO);
END_IF
Блок запускается по переднему фронту входа xExecute - то есть перед новым запуском (c xExecute := TRUE) нужно хотя бы на цикл вызвать его с xExecute := FALSE.Цитата:
Кроме прочего, если убираю строку... то уже ничего не работает.
В функции действительно работать не будет - так как значения переменных функции не сохраняются между ее вызовами.Цитата:
Если, что либо или полностью перенести в ФБ или функцию - не работает, т.е. структура работает только в основной программе или объекте Actoin
В ФБ этот код перенести можно - но у вас, видимо, возникли с этим сложности.
Евгений Кислов,
Спасибо за комментарии
Добрый день!
Вернулся к работе с работой по RS232.
Как ранее писал в теме: Печатается/ одна строка, в связи с чем взял рабочий пример, с сайта, Реализация стандартных протоколов: Пример к документу «Реализация нестандартных протоколов» (DCON, Пульсар-М), указал параметры порта.
При работе отправляет несколько строк, но засчёт сброса ошибки и реинициализации, т.к. всегда идет ошибка TIMEOUT
в фб OCL.UNM_SerialRequest параметр таймаут устанавливал разные значения (от T#1ms до 1S).
При отправлении всегда ошибка TIMEOUT, xDone всегда FALSE
При параметре timeout:=0 отрабатывает 1 раз, xBusy после отправки - становится TRUE и больше ничего не работает, т.к. не сбрасывается
Порт открывается
Фб для оправки данных на устройство:Код:fbComControl
(
xEnable := TRUE,
udiComPort := 5,
udiBaudrate := 9600,
udiByteSize := 8,
eParity := OCL.COM_PARITY.NONE,
eStopBit := OCL.COM_STOPBIT.ONE
);
Ответ при отправлении на скрине (прикреплен)Код:fbUnmSerialRequest
(
xExecute := xExecute AND NOT(xWrongParameter),
tTimeout := tTimeout,
hCom := hCom,
pRequest := ADR(sRequest),
szRequest := TO_UDINT(LEN(sRequest) ),
pResponse := ADR(sResponse),
szResponse := SIZEOF(sResponse),
xBusy => xBusy
);
Так же из этого примера «Реализация нестандартных протоколов» (DCON, Пульсар-М) пробовал работать через библиотеку CAA. Результат работы с обеими библиотеками одинаков
Что может быть или как это можно побороть?
Спасибо,
Добрый день.
Свяжитесь со мной во вторник утром (контакты в подписи) и обеспечьте удаленный доступ.