PDA

Просмотр полной версии : потеря связи с ПР из-за макроса в СП307



delta8
10.04.2024, 15:52
добрый день. подскажите где копать?написал макрос для синхронизации времени с ПР. Но выдает флаг ошибки PSB51, хотя данные записываются, сделал функциональную область которая непрерывно выполняет данный макрос.

kondor3000
10.04.2024, 15:58
добрый день. подскажите где копать?написал макрос для синхронизации времени с ПР. Но выдает флаг ошибки PSB51, хотя данные записываются, сделал функциональную область которая непрерывно выполняет данный макрос.

Вообще макросы надо вызывать раз в секунду.

А без макросов никак? Их же проверить можно только в живой панели. Давал вам ссылку как сделать без макросов.
https://owen.ru/forum/showthread.php?t=39408

delta8
10.04.2024, 19:42
Вообще макросы надо вызывать раз в секунду.

А без макросов никак? Их же проверить можно только в живой панели. Давал вам ссылку как сделать без макросов.
https://owen.ru/forum/showthread.php?t=39408

Да, видел,спасибо, но просто хочется научиться самому писать макросы,вроде функцию свою выполняет, только смущает что появляется данная ошибка

delta8
12.04.2024, 07:59
Вообще макросы надо вызывать раз в секунду.

А без макросов никак? Их же проверить можно только в живой панели. Давал вам ссылку как сделать без макросов.
https://owen.ru/forum/showthread.php?t=39408

Так этот графический макрос для синхронизации времени панели с временем ПЛК(ПР), а мне нужно наоборот, чтобы время на ПР синхронизировалось с временем панели

EFrol
12.04.2024, 08:43
добрый день. подскажите где копать?написал макрос для синхронизации времени с ПР. Но выдает флаг ошибки PSB51, хотя данные записываются, сделал функциональную область которая непрерывно выполняет данный макрос.

Прошу прощения, но у меня несколько вопросов к ТС:
Судя по документации:
- системное время в панели храниться по адресам PSW[30] .. PSW[36]
- Функция Write имеет формат BOOL Write (PortName, SlaveID, DeviceTypeReg, AdrReg, AdrBit, 0, DataType, Var); т.е. 8 - параметров, а у Вас всего 7
- вызов функции происходит за пределами if, это значит, что системный день будет передаваться только в 16:55, а все остальное время он равен 0.

delta8
12.04.2024, 09:53
Прошу прощения, но у меня несколько вопросов к ТС:
Судя по документации:
- системное время в панели храниться по адресам PSW[30] .. PSW[36]
- Функция Write имеет формат BOOL Write (PortName, SlaveID, DeviceTypeReg, AdrReg, AdrBit, 0, DataType, Var); т.е. 8 - параметров, а у Вас всего 7
- вызов функции происходит за пределами if, это значит, что системный день будет передаваться только в 16:55, а все остальное время он равен 0.

1) Системное время можно экспортировать на другие регистры, в настройках проекта
2)Я взял пример из руководства, там 7.
75177
3) Ну мне и надо чтобы в заданное время он записал свои показания на ПР, а в остальное время ничего больше не делал

petera
12.04.2024, 10:14
Прошу прощения, но у меня несколько вопросов к ТС:

- Функция Write имеет формат BOOL Write (PortName, SlaveID, DeviceTypeReg, AdrReg, AdrBit, 0, DataType, Var); т.е. 8 - параметров, а у Вас всего 7


Перепроверьте по документации - Вы лишний "0" прилепили
должно быть (по документации) 7 параметров.

Если после ключевого слова Write набрать "(",то появится мастер ввода ВСЕХ параметров функции
тогда ошибиться просто невозможно.

75178 --> 75179

EFrol
12.04.2024, 10:23
Перепроверьте по документации - Вы лишний "0" прилепили
должно быть (по документации) 7 параметров.

Если после ключевого слова Write набрать "(",то появится мастер ввода ВСЕХ параметров функции
тогда ошибиться просто невозможно.

75178 --> 75179

Виноват я смотрел сюда:
75180

EFrol
12.04.2024, 10:26
1) Системное время можно экспортировать на другие регистры, в настройках проекта
2)Я взял пример из руководства, там 7.
75177
3) Ну мне и надо чтобы в заданное время он записал свои показания на ПР, а в остальное время ничего больше не делал

3) Тогда наверно правильнее:


if(...){
a = dec_dey;
Write(...);
}


Надо учесть, что это условие истинно целую минуту - за это время при "непрерывном вызове", макрос просто задолбит ПР-ку.
Правильнее в глобальном макросе объявить: BOOL isSend;
А в вызываемом:


if(...){
if(!isSend){
a = dec_dey;
Write(...);
isSend = TRUE;
}
}else isSend = FASLE;