PDA

Просмотр полной версии : СП307+МВ210-101+NTC Помогите пожалуйста



Gi0
11.05.2020, 10:15
Доброго времени суток.

Стоит задача измерять температуру на шинах электрической подстанции. В качестве датчиков выбрали термисторы NTC 10К, выбор был обусловлен ценой самих датчиков, доступностью и диапазоном контролируемой температуры. Затем эти датчики опрашивают модули аналоговых входов МВ210-101 в режиме опроса резистивных датчиков 5 кОм, контролируемая температура 45-155 *С (при температуре 45 *С сопротивление термистора 4,102 кОм ). Задача стоит вывести на панель оператора температуру на шинах в *С, в случае <45 *C и >155 *C вывести сообщения "Менее 45 *С" и "Более 155 *С" соответственно.

В качестве руководства к действию использовал документ "Mx210 Примеры настройки обмена". Сконфигурировал панель и модуль, собрал макет проекта, на панель вывел окошки "Цифровой дисплей" и опросил модуль, значения сопротивлений отображаются и изменяются при нагреве.

Далее стоит задача перенести значения сопротивлений из регистров модулей в регистры панели. Для этого использовал глобальный макрос:
Read(NET_0, 1, MODBUS_TCP_REG_4X, 4000, 0, TYPE_DWORD, &PSW[300]);

Использовал помощник встроенный в конфигуратор панели(т.е. Read( а затем указал регистры внутренней памяти в которые хочу записать данные &PSW[300]). Повторно вывел "Цифровой дисплей" с параметрами регистр PSW[300], значение Dword, дисплей/формат float. В итоге ничего не получилось: в цифровом дисплее для отображения регистров панели значение 0, при этом в цифровом дисплее для отображения регистров модуля по прежнему нормальные значения сопротивлений.

Подскажите пожалуйста в чем может быть проблема?

Далее планирую использовать формулу =(1/((1/298,5)+(1/4300)*LN(R/10000))-273,15), для пересчета сопротивлений в градусы Цельсия, где R значения сопротивления из внутренних регистров PSW[300]...

Результаты пересчета записать в новые регистры панели, например PSW[400]... Затем планирую вывести 16 элементов "Цифровой дисплей", которые отображают температуры.
Как на графическом дисплее реализовать вывод сообщений "Менее 45 *С" и "Более 155 *С" и при этом не отображать или зафиксировать"Цифровой дисплей" на значениях "45" и "155"?
Может быть есть более изящные решения?

ASo
11.05.2020, 10:55
Вы точно уверенны, что очень высокоомный датчик будет корректно работать в ТП, при больших наводках на соединительные линии и 2-х проводном подключении даже экранированным проводом?

Gi0
11.05.2020, 11:03
нет не уверен,
В моём представлении наводки не влияют на сопротивление. А скомпенсировать длину кабеля, сопротивление втычного разъёма, и сопротивление проходных клемм можно 3х проводной системой подключения термисторов. Точность не критична +/- 5 градусов допустимо.

melky
11.05.2020, 11:23
double Scaler (double input, double in_min, double in_max, double out_min, double out_max)

{
double out1 = 0;
double out2 = 0;
double output = 0;
double diff = in_max - in_min;

if (diff != 0)
{
if (input > in_max) out1 = in_max;
else out1 = input;
if (in_min > out1) out2 = in_min;
else out2 = out1;
output = (out_max - out_min) / diff * (out2 - in_min) + out_min;
}
return output;
}

Это переделанный код из LINTRAFO, по идее в CodeSys найдите этот блок, он как раз и фиксирует мин и макс если они выходят за пределы. (точно не помню уже, но если что переделаете из этого кода, если в CodeSys как то иначе.)

ASo
11.05.2020, 11:40
нет не уверен,
В моём представлении наводки не влияют на сопротивление. Безусловно! Но сопротивление измеряется электрическими методами - скажем, подаем стабилизированный ток, измеряем падение напряжения.
Я не энергетик, но всех встречаемых мной сухих трансформаторах для измерения температуры обмоток используется Pt100. И не так дорого (относительно много чего в ТП) они стОят, что бы искать приключения.

Gi0
11.05.2020, 11:47
Безусловно! Но сопротивление измеряется электрическими методами - скажем, подаем стабилизированный ток, измеряем падение напряжения.
Я не энергетик, но всех встречаемых мной сухих трансформаторах для измерения температуры обмоток используется Pt100.

Спасибо, Вы правы. Результаты с переходными сопротивлениями и наводками смогу проконтролировать только на следующей неделе. Поэтому сейчас и не уверен в результате.
Pt100 более чем в 15 раз дороже, NTC стоит менее 50 центов.

melky, спасибо, попробую разобраться в этом коде. К сожалению макросы тут не на привычном мне языке программирования и могу путаться в синтаксисе.

ASo
11.05.2020, 11:55
Да причем тут 15раз!!!!!
Вы же не просто так этот проект реализуете. Значит есть опасность перегрева шин. Которая может закончиться как прямыми (повреждения элементов ТП) так и косвенными (убытки, повреждения оборудования за ТП) потерями. Поэтому экономить неск. тыс. руб. - просто глупо! Это не запредельные суммы, вместо того, чтобы установить - и забыть.

melky
11.05.2020, 12:04
capzap я вообще написал с чего код делал собственно. никто не мешает взять оригинал и использовать, вместо придумывания или переписывания. А так да, это банальный LIN_TRAFO который при выходе за диапазоны оставляет минимальные и максимальные значения. не более того.

melky
11.05.2020, 12:50
Вы только одну задачу написали, вторая у автора звучит так, что на индикации должны остаться минимальные или максимальные значения


при этом не отображать или зафиксировать"Цифровой дисплей" на значениях "45" и "155"?

з.ы. а вообще делал в Scada и подобную задачу, когда отображалось значение и в случае выхода за пределы была надпись > X или < X

но тот код автору не поможет, даже переделать, так как там связано со свойствами отображения на мнемосхеме самой Scada.

Gi0
11.05.2020, 13:01
capzap, да вижу я что этот код "не совсем то"
Я вообще не понял зачем мне кодесисовый код приводят. Скрипты согласно руководству пишутся на Си. И моя задача будет реализована скорее всего через if / else с операторами сравнения...
У меня основная проблема -- не могу записать данные из модуля в панель и вообще не понимаю почему так происходит. Глобальный макрос должен ведь постоянно выполняться т.е. постоянный опрос датчиков.
Вторая задача уже пересчет, тут тоже есть вопросы.

Есть еще идея попробовать реализовать "таблицу событий реального времени" и температуру показывать как события, например сопротивление в диапазоне >5к Ом выводим сообщение"менее 45 *С", при R в диапазоне 4102-3336 Ом --температура "45-50 *С".

melky
11.05.2020, 13:01
capzap ну я возможно ошибся в названиях FB, так если поправите, на какие блоки в CodeSys посмотреть автору, он найдет быстрее. Я же написал, что код делал именно из кода CodeSys а не придумывал его из головы. Просто переписал на C# для использования в Scada.

Gi0 просто в CodeSys есть различный функционал, который уже давно и кем то реализован, просто код ST нужно адаптировать под тот язык, который вы используете. Так несколько сокращается время вместо изобретения велосипедов.... :)

код, который я привел на C#, он как раз делает масштабирование сигнала с одновременным отсеканием значения выхода за диапазоны для индикации значений.
Вывести надпись больше, меньше либо отдельно, либо там же, если панель позволяет.

Ну и на Си, я не работал в Овеновскими панелями, если там есть возможность выводить текст на экран, то скриптом вы можете преобразовывать значения в текст и выводить как текст и в случае выхода за диапазон не фиксировать значения а как раз написать нужное вам БОЛЬШЕ или МЕНЬШЕ....

capzap
11.05.2020, 13:39
я не специализируюсь на СП3хх, на других панелях еще меньше работы, но я бы написал такие функции мне бы хватило

ЗЫ
не могу записать данные из модуля в панель в справке есть работа с флоат, может поможет

Gi0
11.05.2020, 15:39
я не специализируюсь на СП3хх, на других панелях еще меньше работы, но я бы написал такие функции мне бы хватило

ЗЫв справке есть работа с флоат, может поможет

спасибо большое

capzap
11.05.2020, 15:48
чтоб не связываться с флоатами, где многое зависит от последовательности байт, я бы читал целочисленные регистры начиная с 4064, кажется. насчет вычислений разницы не будет с чем работать с интом или флоатом

petera
11.05.2020, 19:23
Далее стоит задача перенести значения сопротивлений из регистров модулей в регистры панели. Для этого использовал глобальный макрос:
Read(NET_0, 1, MODBUS_TCP_REG_4X, 4000, 0, TYPE_DWORD, &PSW[300]);

Использовал помощник встроенный в конфигуратор панели(т.е. Read( а затем указал регистры внутренней памяти в которые хочу записать данные &PSW[300]). Повторно вывел "Цифровой дисплей" с параметрами регистр PSW[300], значение Dword, дисплей/формат float. В итоге ничего не получилось: в цифровом дисплее для отображения регистров панели значение 0, при этом в цифровом дисплее для отображения регистров модуля по прежнему нормальные значения сопротивлений.


1. Глобальный макрос не для этого!
В глобальном макросе Вы создаете свои функции в дополнение к стандартным
Например
48953 48954

Затем такие "свои" функции" можно использовать в любых своих макросах
Например
48955

2. Все свои функции типа
Read(NET_0, 1, MODBUS_TCP_REG_4X, 4000, 0, TYPE_DWORD, &PSW[300]);
вы должны писать в простых макросах

3. Чтобы результат работы макроса был виден на экране, сам макрос нужно вызывать функциональной областью или ф.кнопкой
48956

Gi0
12.05.2020, 11:14
1. Глобальный макрос не для этого!
В глобальном макросе Вы создаете свои функции в дополнение к стандартным
Например
48953 48954

Затем такие "свои" функции" можно использовать в любых своих макросах
Например
48955

2. Все свои функции типа
Read(NET_0, 1, MODBUS_TCP_REG_4X, 4000, 0, TYPE_DWORD, &PSW[300]);
вы должны писать в простых макросах

3. Чтобы результат работы макроса был виден на экране, сам макрос нужно вызывать функциональной областью или ф.кнопкой
48956

Спасибо, действительно помогло записать в свой макрос и запустить ф. областью.
Теперь могу считать и вывести в цифровом дисплее значение PSW[300].

Чтобы производить математические операции со значением сопротивления в регистре PSW[300] я так понимаю должен перевести в float? затем выполнить математические операции по моей формуле, а затем конвертировать снова в dword и записать в новый регистр, который и хочу вывести на дисплей?
Например вот так:

float fT1; // задаю переменные
float fT11;
Read(NET_0, 1, MODBUS_TCP_REG_4X, 4000, 0, TYPE_DWORD, &PSW[300]); // считываю дворд в 200 регистр внутренней памяти
fT1=(*(float*)&(PSW[300])); //конвертирую дворд в число с плавающей точкой
fT11=fT1+555; //математические вычисления с числами
PSW[400]=(*(DWORD*)&(fT11)); //обратно конвертирую число с плавающей точкой в дворд

На графическом дисплее создаю цифровой дисплей и вывожу PSW[400] с отображением значения в формате float.
В результате на цифровом дисплее "0".

petera
12.05.2020, 14:26
Спасибо, действительно помогло записать в свой макрос и запустить ф. областью.
Теперь могу считать и вывести в цифровом дисплее значение PSW[300].

Чтобы производить математические операции со значением сопротивления в регистре PSW[300] я так понимаю должен перевести в float? затем выполнить математические операции по моей формуле, а затем конвертировать снова в dword и записать в новый регистр, который и хочу вывести на дисплей?
Например вот так:

float fT1; // задаю переменные
float fT11;
Read(NET_0, 1, MODBUS_TCP_REG_4X, 4000, 0, TYPE_DWORD, &PSW[300]); // считываю дворд в 200 регистр внутренней памяти
fT1=(*(float*)&(PSW[300])); //конвертирую дворд в число с плавающей точкой
fT11=fT1+555; //математические вычисления с числами
PSW[400]=(*(DWORD*)&(fT11)); //обратно конвертирую число с плавающей точкой в дворд

На графическом дисплее создаю цифровой дисплей и вывожу PSW[400] с отображением значения в формате float.
В результате на цифровом дисплее "0".


float fT1, fT11;
Read(NET_0, 1, MODBUS_TCP_REG_4X, 4000, 0, TYPE_DWORD, &fT1); //Читаем сразу в переменную
//Уж если хочется увидить на экране
*(float*)(PSW+300) = fT1; //то делаем так
//естественно, что для дисплея в настройках Регистра нужен Dword PSW300
// 48988

//и формат данных - float
//48989

fT11=fT1+555; //математические вычисления с числами
*(float*)(PSW+400) = fT11; // результат на экран. НАСТРОЙКИ дисплея - аналогичные

Gi0
12.05.2020, 17:06
float fT1, fT11;
Read(NET_0, 1, MODBUS_TCP_REG_4X, 4000, 0, TYPE_DWORD, &fT1); //Читаем сразу в переменную
//Уж если хочется увидить на экране
*(float*)(PSW+300) = fT1; //то делаем так
//естественно, что для дисплея в настройках Регистра нужен Dword PSW300
// 48988

//и формат данных - float
//48989

fT11=fT1+555; //математические вычисления с числами
*(float*)(PSW+400) = fT11; // результат на экран. НАСТРОЙКИ дисплея - аналогичные

Спасибо огромное!
Ваши рекомендации помогли мне реализовать проект, всё работает и считает как надо.
У меня действительно в синтаксисе были ошибки и сразу в переменную тоже логично.