Вы пишите не в тот раздел, здесь ПЛК (среда CoDeSys V2.3), а вам нужно в Программируемые реле.
По теме, сделайте инициализацию при включении, из энергонезависимой переменной. Вложение 81575
Вид для печати
Вы пишите не в тот раздел, здесь ПЛК (среда CoDeSys V2.3), а вам нужно в Программируемые реле.
По теме, сделайте инициализацию при включении, из энергонезависимой переменной. Вложение 81575
Я правильно понял, что в моем случае, когда 4 ВУ, я должен в программе на каждом цикле анализировать эти переменны (Last address и Last error). Там постоянно (!) меняются адреса внешних устройств и ошибки по этим адресам? И ничего там не сохраняется на долго. Значения меняются с частотой опроса внешних устройств? Я нашел всего два кода ошибок для RS-485 интерфейса: 0 (ошибки нет) или 81 (превышен таймаут ожидания ответа).
Если у меня 4 ВУ, то я должен по каждому устройству отработать Ваш фрагмент программы. Например:
Так?Код:IF Last_Adres=3 AND Last_Error<>0 THEN
Avar1:=TRUE; ELSE Avar1:=FALSE;
END_IF
IF Last_Adres=4 AND Last_Error<>0 THEN
Avar2:=TRUE; ELSE Avar2:=FALSE;
END_IF
IF Last_Adres=5 AND Last_Error<>0 THEN
Avar3:=TRUE; ELSE Avar3:=FALSE;
END_IF
IF Last_Adres=6 AND Last_Error<>0 THEN
Avar4:=TRUE; ELSE Avar4:=FALSE;
END_IF
В моем проекте требуется на ВУ по RS-485(Modbus) в три регистра передать значения. Но передавать необходимо строго в определенной последовательности. Как я могу просто проверять корректность передачи данных по Modbus? Или придется после каждой записи данных в регистр опять читать этот регистр и смотреть, что записалось?
ну так записывайте в эти переменные СТРОГО В ОПРЕДЕЛЁННОЙ последовательности, и сами в программе своей контролируйте эту записьЦитата:
Но передавать необходимо строго в определенной последовательности.
в чём проблема прикрутить дополнительное условие для записи переменной?
Можно упростить код. Только надо понимать, что так аварии будут постоянно мигать (работа в динамике)
Если же надо включить аварию, лучше использовать вариант 1exan с CASE. В шагах можно дописать включение других переменных.Код:Avar3:=Last_Adres=3 AND Last_Error<>0 ;
Avar4:=Last_Adres=4 AND Last_Error<>0 ;
Avar5:=Last_Adres=5 AND Last_Error<>0 ;
Avar6:=Last_Adres=6 AND Last_Error<>0 ;
Код:CASE Last_Adres OF
3: Err3 := Last_Error<>0;
4: Err4 := Last_Error<>0;
5: Err5 := Last_Error<>0;
6: Err6 := Last_Error<>0;
END_CASE;
Наверно я не корректно поставил задачу. Представьте, необходимо записать по Modbus под адресом 3 в регистр 101, например, значение 100. После это, в регистр 103 значение 127 и только после этого в регистр 107 значение 3.
Хотите сказать, что если я запишу :
...
Reg101 := 100;
Reg103 := 127;
Reg107 := 3;
...
Это все пройдет корректно? Если да, то это отлично!
Просто, я раньше много лет работал с контроллерами Шнайдерэлектрик M221, то там нужно дождаться пока пройдет первая пересылка данных, а уж потом заталкиваем следующие данные. И там постоянно контролирую передачю данных.
ну формально, строки обрабатываются по порядку
и присвоение значения переменной идёт по порядку строк в программе
поэтому всё это будет работать "как есть"
если же вам необходимо Reg103 присвоить 127 только после записи числа 100 в слейв 3 и вы без этого спать не сможете спокойно, то добавьте Условие к присвоению Reg103
прочтите из слейва состояние регистра 101, и если он равен ранее введённому числу 100, то Reg103:=127
если нет, то другое действие или значение какое необходимо
то же самое делаете для Reg107