PDA

Просмотр полной версии : Перезапись энергонезависимой переменной по сети



anthrwpos
28.12.2017, 06:32
Есть энергонезависимая переменная, хранящая некий параметр.
Есть дублирующая её сетевая переменная, которая может быть прочитана и записана из скады.
Вопрос - существует ли способ перезаписи энергонезависимой переменной по изменению сетевой, более простой, чем следующий?
34854

Сергей0308
28.12.2017, 10:00
Есть энергонезависимая переменная, хранящая некий параметр.
Есть дублирующая её сетевая переменная, которая может быть прочитана и записана из скады.
Вопрос - существует ли способ перезаписи энергонезависимой переменной по изменению сетевой, более простой, чем следующий?
34854

Я предпочитаю сравнивать в целочисленном виде, можно получить из переменных с плавающей запятой через х 10 в энной степени, где n - количество знаков после запятой! Для экономии ресурса энергонезависимой памяти, наверно лучше с гистерезисом(зоной нечувствительности)!

petera
28.12.2017, 10:35
Есть энергонезависимая переменная, хранящая некий параметр.
Есть дублирующая её сетевая переменная, которая может быть прочитана и записана из скады.
Вопрос - существует ли способ перезаписи энергонезависимой переменной по изменению сетевой, более простой, чем следующий?
34854

А зачем такие сложности?
Сетевая переменная и так энергонезависимая. Зачем ее дублировать в еще в одной энергонезависимой переменной?

Серёга Букашкин
28.12.2017, 11:02
Для экономии ресурса энергонезависимой памяти, наверно лучше с гистерезисом(зоной нечувствительности)!
Уже сообщали что у энергонезависимой памяти можно не думать о ресурсе, она сохраняется только при выключении питания. Так что можно менять ее хоть 100 раз в секунду.

Сергей0308
28.12.2017, 11:24
Уже сообщали что у энергонезависимой памяти можно не думать о ресурсе, она сохраняется только при выключении питания. Так что можно менять ее хоть 100 раз в секунду.

Не всё так радужно, совсем недавно писали что например уставка в ТРМ212 сразу пишется в энергонезависимую память!
http://www.owen.ru/forum/showthread.php?t=27944

Серёга Букашкин
28.12.2017, 12:10
совсем недавно писали что например уставка в ТРМ212 сразу пишется в энергонезависимую память!
ТРМ212 это вообще нечто, к тому же имеет ряд необъявленных сюрпризов. Автор же не на него пишет уставку, а у ПР200 можно про ресурс не думать.

Серёга Букашкин
28.12.2017, 12:28
можно получить из переменных с плавающей запятой через х 10 в энной степени
Было бы здорово если бы еще была переменная float половинного формата, она дает меньшую точность в мантиссе, но занимает 16 бит. А для подавляющего большинства приложений эта точность более чем достаточна. Для сетевых обменов тогда занимала бы один регистр, а то места в обменном массиве и так мало, всего 128 байт. Или дали бы ФБ перевода в половинный формат и обратно. Это на заметку разработчикам ОЛ. Или увеличьте объем обменного массива, 128 байт это мало!

Сергей0308
28.12.2017, 12:30
ТРМ212 это вообще нечто, к тому же имеет ряд необъявленных сюрпризов. Автор же не на него пишет уставку, а у ПР200 можно про ресурс не думать.

У овена все приборы, с какими сталкивался, например СИ8, УТ24 с "изюминкой" и если в них вникать, возникает вопрос о душевном здоровье конструкторов, лучше этим не заниматься, а принимать как есть! А ПР, по моему, одна из самых удачных и адекватных творений овена!

Серёга Букашкин
28.12.2017, 12:39
возникает вопрос о душевном здоровье конструкторов, лучше этим не заниматься, а принимать как есть!
Вот и приходится принимать радикально, то есть искать меры замены на что-то иное, натолкнувшись на неприемленные эффекты. Особенно это касается регуляторов. Убежден, что разработчики их никогда не видели в реальной работе и не налаживали. Формула ПИД-регулятора это еще не регулятор, а только принцип.

Сергей0308
28.12.2017, 12:54
Было бы здорово если бы еще была переменная float половинного формата, она дает меньшую точность в мантиссе, но занимает 16 бит. А для подавляющего большинства приложений эта точность более чем достаточна. Для сетевых обменов тогда занимала бы один регистр, а то места в обменном массиве и так мало, всего 128 байт. Или дали бы ФБ перевода в половинный формат и обратно. Это на заметку разработчикам ОЛ. Или увеличьте объем обменного массива, 128 байт это мало!

Так если связь между несколькими ПР, то можно придумать и свой, какой захочется, тип данных и даже всё это оформить в виде макросов, если вам инта не хватает!
И овена тут ждать не надо!

Серёга Букашкин
28.12.2017, 13:05
можно придумать и свой, какой захочется, тип данных и даже всё это оформить в виде макросов!
Так и делаю, просто домножаю на нужную степень, добавляю в INT шифр степени и знака, и обратное восстановление в ОЛ возможно - все это занимает ценное машинное время. И ещё нужно чтобы ФБ работы с регистром, в том числе сдвиги, работали и для float, тогда всё проще. Например для выявления знака просто смотреть 31-й бит регистра. Сейчас приходится много действий совершать чтобы достигнуть результата. Вспомните историю с fSEL.

Сергей0308
28.12.2017, 13:41
Так и делаю, просто домножаю на нужную степень, добавляю в INT шифр степени и знака, и обратное восстановление в ОЛ возможно - все это занимает ценное машинное время. И ещё нужно чтобы ФБ работы с регистром, в том числе сдвиги, работали и для float, тогда всё проще. Например для выявления знака просто смотреть 31-й бит регистра. Сейчас приходится много действий совершать чтобы достигнуть результата. Вспомните историю с fSEL.

С наличием FSel в ОЛ лично я ускорения не почувствовал, ну и в инте можно несколько бит отвести на значение степени, а знак я бы оставил как есть, без изменений, 15-й бит, затем 3-4 бита степень(код степени), затем число 11-12 бит!

Серёга Букашкин
28.12.2017, 13:55
С наличием FSel в ОЛ лично я ускорения не почувствовал
Конечно, если их в программе несколько, то трудно почувствовать, но когда их десятки - очень заметно. И вообще заставлять умножать float на 0 и на 1 безнравственно. Это в прошлом, хотя... для flоat еще не все инструменты есть, например обработка как регистра.

anthrwpos
28.12.2017, 16:51
А зачем такие сложности?
Сетевая переменная и так энергонезависимая. Зачем ее дублировать в еще в одной энергонезависимой переменной?
Таки вы правы.
Но пришлось приделать программную инициализацию значения по умолчанию при заливке программы.
поле для такого значение вроде есть, но не активно.

anthrwpos
28.12.2017, 18:27
Было бы здорово если бы еще была переменная float половинного формата, она дает меньшую точность в мантиссе, но занимает 16 бит. А для подавляющего большинства приложений эта точность более чем достаточна. Для сетевых обменов тогда занимала бы один регистр, а то места в обменном массиве и так мало, всего 128 байт. Или дали бы ФБ перевода в половинный формат и обратно. Это на заметку разработчикам ОЛ. Или увеличьте объем обменного массива, 128 байт это мало!

Если данные для передачи схожи, лучше засунуть их в некое подобие массива, откуда доставать и передавать по сети по одному. Так можно сэкономить не только байты обменного массива, но и сигналы скада-систем, которые стоят не дешево.

petera
28.12.2017, 20:58
Таки вы правы.
Но пришлось приделать программную инициализацию значения по умолчанию при заливке программы.
поле для такого значение вроде есть, но не активно.

Да, так и есть, инициализация пока только программная
Например
34876
Здесь инициализация
- принудительная при первом включении после загрузки
- в процессе работы по требованию (SetDefaulf)
Макрос инициализации
34877

anthrwpos
29.12.2017, 05:42
Не совсем понятно, В чем разница между init и set default, зачем там R-trig и зачем делать макрос из одного sel-элемента и последовательно инициализировать.
34887

ДмитрийК
11.09.2018, 09:43
Очень важный момент. А не может ли получиться так, что переменная записана в сеть, раньше чем считана с сети, а следовательно - стёрта? Или всегда происходит сначала прием данных из сети, а потом туда запись?

petera
11.09.2018, 10:15
Очень важный момент. А не может ли получиться так, что переменная записана в сеть, раньше чем считана с сети, а следовательно - стёрта? Или всегда происходит сначала прием данных из сети, а потом туда запись?

Думаю, что нет.
Классический ПЛК работает так.
Каждый цикл выполнения программы:
1. Запоминание физических входных переменных в буфере ввода.
2. выполнение кода программы с использованием переменных из буфера ввода
3. результаты выходных переменных запоминаются в буфере вывода
4. содержимое буфера вывода записывается в физические выходы.
скорей всего это справедливо и для сетевых переменных.