Вы пишите не в тот раздел, здесь ПЛК (среда CoDeSys V2.3), а вам нужно в Программируемые реле.
По теме, сделайте инициализацию при включении, из энергонезависимой переменной. 1 Инициализация.jpg
Вы пишите не в тот раздел, здесь ПЛК (среда CoDeSys V2.3), а вам нужно в Программируемые реле.
По теме, сделайте инициализацию при включении, из энергонезависимой переменной. 1 Инициализация.jpg
Последний раз редактировалось kondor3000; 25.01.2025 в 14:07.
Я правильно понял, что в моем случае, когда 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;
Последний раз редактировалось kondor3000; 26.01.2025 в 12:21.
Наверно я не корректно поставил задачу. Представьте, необходимо записать по 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