Страница 1 из 1

Неблокирующие GetDataEx(), SetDataEx()

СообщениеДобавлено: 24 авг 2024, 00:14
IBAH
с SetDataEx() понятно, данные будут поставлены в очередь и запишутся при первой возможности
а GetDataEx(), откуда возьмутся данные, от предыдущего вызова?
Какие данные будут при первом вызове?

Чтобы снять пустые вопросы. У меня медленный и нестабильный модбас (9600). Запрос данных из ПЛК тормозит макрос.

Re: Неблокирующие GetDataEx(), SetDataEx()

СообщениеДобавлено: 24 авг 2024, 22:37
dimensy
Нет, данные будут равны 0 или значению, которое вы поставили при инициализации макроса.
Макрос - это функция, а не функциональный блок, поэтому не хранит результаты работы в предыдущих вызовах

Re: Неблокирующие GetDataEx(), SetDataEx()

СообщениеДобавлено: 24 авг 2024, 22:41
dimensy
если Модбас медленный - оптимизируйте запросы или поставьте скорость побольше

Re: Неблокирующие GetDataEx(), SetDataEx()

СообщениеДобавлено: 26 авг 2024, 15:36
IBAH
dimensy писал(а):Нет, данные будут равны 0 или значению, которое вы поставили при инициализации макроса.
Макрос - это функция, а не функциональный блок, поэтому не хранит результаты работы в предыдущих вызовах


Я правильно понял?
Вот такой макрос, период выполнения 0.5 секунды

Код: Выделить всё
macro_command main()
unsigned short us0=0
bool b0=0
//Обработка ошибок
GetDataEx(us0, "MODBUS RTU (Zero-based Addressing)", "PA27", 1)
if us0<>0 then
  SetData(b0, "Local HMI", "StartStopWork", 1)
  SetData(b0, "Local HMI", "SostWork", 1)
  b0=not 0
end if
SetData(b0, "Local HMI", "SostErr", 1)
end macro_command


Первый вход в макрос. Вызов GetDataEx. Возвращаемое значение us0=0. При этом, модуль модбас посылает запрос ПЛК.
Последующие входы. Возвращаемое значение по результатам запроса от предыдущего вызова GetDataEx. Если запрос ошибочный или еще не прошел, то us0 по прежнему 0.

Короче.Всегда возвращается последнее успешно прочитанное значение или 0?

Re: Неблокирующие GetDataEx(), SetDataEx()

СообщениеДобавлено: 26 авг 2024, 16:27
dimensy
Макрос отправит запрос и не дожидаясь ответа сразу пойдет на следующую команду. Поэтому us0 у вас всегда будет равна нулю
1. Для чтения попробуйте использовать объект "передача данных". Там можно взводить триггер при успешной передаче, вот этот триггер и смотрите в макросе
2. Не читайте по одному параметру. Выбирайте соседние регистры и читайте их одним запросом. На скорости 9600 можно много чего передать, основной затык - это время ответа слейва.
3. Период опроса сделайте побольше.
4. И сделайте, что-нибудь, чтобы связь была стабильной

Re: Неблокирующие GetDataEx(), SetDataEx()

СообщениеДобавлено: 26 авг 2024, 16:49
VanMo
SetDataEX и GetDataEx отличаются от SetData/GetData только поведением после выполнения запроса.
SetData/GetData прекращают текущий вызов макроса при возникновении ошибки, а SetDataEx/GetDataEx продолжают выполнение. Ничего общего с асинхронным вызовом.
Любая из этих команд завершается только после выполнения ее запроса. То есть, запрос конечно ставится в общую очередь, но функция вернет управление только после выполнения запроса.
Так что, это неверно:
dimensy писал(а):Макрос отправит запрос и не дожидаясь ответа сразу пойдет на следующую команду. Поэтому us0 у вас всегда будет равна нулю

Если запрос прошел успешно, GetData(Ex) запишет результат в переменную, иначе в переменной останется предыдущее значение.

Re: Неблокирующие GetDataEx(), SetDataEx()

СообщениеДобавлено: 26 авг 2024, 17:07
IBAH
VanMo писал(а):SetDataEX и GetDataEx отличаются от SetData/GetData только поведением после выполнения запроса.
SetData/GetData прекращают текущий вызов макроса при возникновении ошибки, а SetDataEx/GetDataEx продолжают выполнение. Ничего общего с асинхронным вызовом.
Любая из этих команд завершается только после выполнения ее запроса. То есть, запрос конечно ставится в общую очередь, но функция вернет управление только после выполнения запроса.
Так что, это неверно:
dimensy писал(а):Макрос отправит запрос и не дожидаясь ответа сразу пойдет на следующую команду. Поэтому us0 у вас всегда будет равна нулю

Если запрос прошел успешно, GetData(Ex) запишет результат в переменную, иначе в переменной останется предыдущее значение.


Больше похоже на правду.
Где нибудь написано, что "SetData/GetData прекращают выполнение текущего макроса в случае ошибки"?



Зы. нашел в аглицком описалове, в русском такого нет.
When the data is not read successfully, the
function will not continue executing the next command.

Если данные не считаны успешно, функция не продолжит выполнение следующей команды


Re: Неблокирующие GetDataEx(), SetDataEx()

СообщениеДобавлено: 26 авг 2024, 21:03
dimensy
VanMo писал(а):SetDataEX и GetDataEx отличаются от SetData/GetData только поведением после выполнения запроса.
SetData/GetData прекращают текущий вызов макроса при возникновении ошибки, а SetDataEx/GetDataEx продолжают выполнение. Ничего общего с асинхронным вызовом.
Любая из этих команд завершается только после выполнения ее запроса. То есть, запрос конечно ставится в общую очередь, но функция вернет управление только после выполнения запроса.

Ну тогда все это начинает играть новыми красками. И теперь понятно куда можно воткнуть функцию GetError

Re: Неблокирующие GetDataEx(), SetDataEx()

СообщениеДобавлено: 27 авг 2024, 10:31
8bit
dimensy писал(а):Ну тогда все это начинает играть новыми красками. И теперь понятно куда можно воткнуть функцию GetError


RTFM и тогда вообще всё шикарно с цветовой палитрой
GetError_RTFM.png
GetError_RTFM.png (52.82 КБ) Просмотров: 311