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

Работа с панелями оператора Weintek - подключение, программирование, совмещение с ПЛК

Модераторы: kiv, 8bit, VanMo

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

Сообщение IBAH » 24 авг 2024, 00:14

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

Чтобы снять пустые вопросы. У меня медленный и нестабильный модбас (9600). Запрос данных из ПЛК тормозит макрос.
IBAH
 
Сообщения: 54
Зарегистрирован: 08 апр 2022, 14:14

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

Сообщение dimensy » 24 авг 2024, 22:37

Нет, данные будут равны 0 или значению, которое вы поставили при инициализации макроса.
Макрос - это функция, а не функциональный блок, поэтому не хранит результаты работы в предыдущих вызовах
dimensy
 
Сообщения: 207
Зарегистрирован: 14 мар 2018, 17:54

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

Сообщение dimensy » 24 авг 2024, 22:41

если Модбас медленный - оптимизируйте запросы или поставьте скорость побольше
dimensy
 
Сообщения: 207
Зарегистрирован: 14 мар 2018, 17:54

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

Сообщение IBAH » 26 авг 2024, 15:36

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?
IBAH
 
Сообщения: 54
Зарегистрирован: 08 апр 2022, 14:14

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

Сообщение dimensy » 26 авг 2024, 16:27

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

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

Сообщение VanMo » 26 авг 2024, 16:49

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

Если запрос прошел успешно, GetData(Ex) запишет результат в переменную, иначе в переменной останется предыдущее значение.
VanMo
 
Сообщения: 378
Зарегистрирован: 16 авг 2011, 09:31

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

Сообщение IBAH » 26 авг 2024, 17:07

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.

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

IBAH
 
Сообщения: 54
Зарегистрирован: 08 апр 2022, 14:14

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

Сообщение dimensy » 26 авг 2024, 21:03

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

Ну тогда все это начинает играть новыми красками. И теперь понятно куда можно воткнуть функцию GetError
dimensy
 
Сообщения: 207
Зарегистрирован: 14 мар 2018, 17:54

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

Сообщение 8bit » 27 авг 2024, 10:31

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


RTFM и тогда вообще всё шикарно с цветовой палитрой
GetError_RTFM.png
GetError_RTFM.png (52.82 КБ) Просмотров: 1819
Хороший вопрос содержит половину ответа - A good question contains half the answer
Аватара пользователя
8bit
 
Сообщения: 1180
Зарегистрирован: 20 апр 2020, 19:07


Вернуться в Weintek

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12