А при чём тут Modbus вообще?
А при чём тут Modbus вообще?
imaex,
Modbus здесь ни причем, но как то нужно обозначить порт RS232 и к нему обратиться, я так понимаю, я жеж учусь...
Все...разобрался, "покурил" литературу. Печатает, как нужно... Не туда копал, пардоньте
Спасибо
Последний раз редактировалось ShikuS; 10.08.2023 в 15:59.
Доброй ночи!
Подскажите, пожалуйста, настроил печать принтера через 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 указатель и размер буфера нужной в данный момент команды.
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
Евгений Кислов,
Спасибо,
Попробовал несколько вариантов:
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
Спасибо,
Последний раз редактировалось ShikuS; 15.08.2023 в 00:27.
Потому что ФБ 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
В ФБ этот код перенести можно - но у вас, видимо, возникли с этим сложности.
Последний раз редактировалось Евгений Кислов; 15.08.2023 в 13:50.
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
Евгений Кислов,
Спасибо за комментарии
Добрый день!
Вернулся к работе с работой по 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. Результат работы с обеими библиотеками одинаков
Что может быть или как это можно побороть?
Спасибо,
Последний раз редактировалось ShikuS; 22.12.2023 в 09:41.
Добрый день.
Свяжитесь со мной во вторник утром (контакты в подписи) и обеспечьте удаленный доступ.
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk