Показано с 1 по 10 из 1642

Тема: CODESYS V3.5. Настройка обмена с другими устройствами (Modbus, ОВЕН, OPC и др.)

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,595

    По умолчанию

    Цитата Сообщение от Aleksey1408 Посмотреть сообщение
    При попытке записи ЦЕЛЫХ значений данных в ТРМ251 для Максимальной и минимальной мощности происходит ошибка №5, при этом значения с точкой записываются нормально. Проект и скриншот с ошибкой прикрепляю.
    Проблема воспроизвелась.
    К сожалению, оперативно устранить ее не получится.
    Насколько критична для вас невозможность записи значения этих параметров без дробной части?
    Уточните, пожалуйста, какие параметры (кроме 'p.min') вынуждают вас использовать протокол ОВЕН вместо Modbus.

  2. #2
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,574

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Проблема воспроизвелась.
    К сожалению, оперативно устранить ее не получится.
    Насколько критична для вас невозможность записи значения этих параметров без дробной части?
    Уточните, пожалуйста, какие параметры (кроме 'p.min') вынуждают вас использовать протокол ОВЕН вместо Modbus.
    не думаю что это на уровне протокола происходит, в трм202 нельзя записать целочисленные в уставку меньше 10, тоже необходим хотя бы один знак после запятой по протоколу модбас
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  3. #3
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,595

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    не думаю что это на уровне протокола происходит, в трм202 нельзя записать целочисленные в уставку меньше 10, тоже необходим хотя бы один знак после запятой по протоколу модбас
    Отладочной утилитой для протокола ОВЕН у нас это получилось.

  4. #4
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,574

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Отладочной утилитой для протокола ОВЕН у нас это получилось.
    ну, всмысле, по модбасу занесение целочисленных записываются?
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  5. #5
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,595

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    ну, всмысле, по модбасу занесение целочисленных записываются?
    Нет, по протоколу ОВЕН. Параметр 'p.min' в принципе не доступен по Modbus.

  6. #6
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,574

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Нет, по протоколу ОВЕН. Параметр 'p.min' в принципе не доступен по Modbus.
    хорошо, а если в трм251 записать в 258 регистр 0, а после в 257 например четыре, то именно эта уставка и будет на первом шаге?
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  7. #7
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,595

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    хорошо, а если в трм251 записать в 258 регистр 0, а после в 257 например четыре, то именно эта уставка и будет на первом шаге?
    Не могу прокомментировать, и у меня в данный момент нет цели тестировать этот функционал.
    Вы можете задать этот вопрос в разделе ТРМ или написать запрос на support@owen.ru

  8. #8
    Пользователь
    Регистрация
    31.10.2020
    Адрес
    МО, пгт. Менделеево
    Сообщений
    14

    По умолчанию Решение проблемы записи целых чисел P.min, P.max, P.nom, i.upr, i.min

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Проблема воспроизвелась.
    К сожалению, оперативно устранить ее не получится.
    Насколько критична для вас невозможность записи значения этих параметров без дробной части?
    Уточните, пожалуйста, какие параметры (кроме 'p.min') вынуждают вас использовать протокол ОВЕН вместо Modbus.
    Для параметров P.min, P.max, P.nom, i.upr, i.min чтение можно осуществлять через формат с фиксированной точкой REAL_FRM.FIX_BIN, а вот запись необходимо осуществлять используя формат для целых чисел INT_FRM.UINT_FRM.
    Структура формата REAL_FRM.FIX_BIN 16 битная:
    0-11 - значение без точки.
    12-14 бит - десятичный сдвиг точки
    15 бит - знак, если 0 - то плюс, 1 - значит минуc
    Примеры:
    3.1=2#0001_0000_0001_1111
    -3.1=2#1001_0000_0001_1111
    0,300=2#0011_0001_0010_1100
    Проблема крылась в том, что при записи целых положительных чисел биты 12-14 равны 0, тогда в битах 0-11 храниться целое значение. Но алгоритм работает с ошибкой, а при записи с десятичной точкой в битах 12-14 есть значения, т.е. все свелось к принудительной установке хотя бы одной точки после запятой.
    Соответственно, для параметров P.min, P.max, P.nom, i.upr, i.min достаточно одной цифры после запятой, и необходимо знать знак числа.
    Всем успехов
    Код проверен на ТРМ251 v1.10.
    Мой пример реализации ниже.
    Код:
    GetReal:OWEN_GET_REAL;
    SetDint:OWEN_SET_DINT;
    
    i_min: // Огр. мин. интеграла
    	IF pribor^[prib_name].oper.StateTask[state].isRead THEN
    		GetReal(
    			Enable:= com_active, 
    			Addr:= com_prib.addr[prib_name], 
    			AddrLen:=com_prib.addrlen, 
    			Name:='i.min' , 
    			Index:= 16#FFFF, 
    			RealType:= REAL_FRM.FIX_BIN, 
    			ComHandle:= hComTrm, 
    			TimeOut:=com_prib.TimeOut*T#1MS , 
    			Complete=>, 
    			Value=> , 
    			wTime=> , 
    			Error=> );
    		IF GetReal.Complete OR GetReal.Error<>0 THEN
    			pribor^[prib_name].oper.StateTask[state].error:=SetReal.Error;
    			CASE GetReal.Error OF
    				NoError: 
    					pribor^[prib_name].pid.i_min:=GetReal.Value;
    					pribor^[prib_name].oper.StateTask[state].ValReal:=GetReal.Value;
    					state:=StateNoError(state:=state,StateTaskPt:=ADR(pribor^[prib_name].oper.StateTask));
    				NACK: 
    					state:=end_pooling;
    				ELSE
    					state:=StateNoError(state:=state,StateTaskPt:=ADR(pribor^[prib_name].oper.StateTask));
    			END_CASE
    			GetReal(Enable:=FALSE);
    		END_IF
    	ELSE
    		IF pribor^[prib_name].pid.i_min >-0.001 THEN
    			SetDint.Value:=2#0001_0000_0000_0000; // Положительное число, одна цифра после запятой
    			ELSE
    			SetDint.Value:=2#1001_0000_0000_0000;	// Отрицательное число, одна цифра после запятой
    		END_IF
    		SetDint(
    			Enable:= com_active, 
    			Addr:= com_prib.addr[prib_name], 
    			AddrLen:= com_prib.addrlen, 
    			Name:= 'i.min', 
    			Index:= 16#FFFF, 
    			IntType:=INT_FRM.UINT_FRM, 
    			Value:=REAL_TO_DINT(ABS(pribor^[prib_name].pid.i_min*10)) + SetDint.Value, // Сдвиг запятой на 1 знак в право.
    			ComHandle:= hComTrm, 
    			TimeOut:= com_prib.TimeOut*T#1MS, 
    			Complete=> , 
    			Error=> );
    		IF SetDint.Complete OR SetDint.Error<>0 THEN
    			pribor^[prib_name].oper.StateTask[state].error:=GetDint.Error;
    			CASE SetReal.Error OF
    				NoError: 
    					state:=StateNoError(state:=state,StateTaskPt:=ADR(pribor^[prib_name].oper.StateTask));
    				NACK: 
    					state:=end_pooling;
    				ELSE
    					state:=StateNoError(state:=state,StateTaskPt:=ADR(pribor^[prib_name].oper.StateTask));
    			END_CASE
    			SetDint(Enable:=FALSE);
    		END_IF	
    	END_IF

Похожие темы

  1. Настройка ПР200, управление 3-мя устройствами через RS-485
    от Orbes в разделе Среда программирования OWEN Logic
    Ответов: 20
    Последнее сообщение: 15.05.2017, 16:45
  2. СП3ХХ Пример настройка обмена с ПЛК на CODESYS 2.3
    от Denis_Kay в разделе Панели оператора (HMI)
    Ответов: 6
    Последнее сообщение: 02.03.2017, 15:12
  3. Ответов: 43
    Последнее сообщение: 13.04.2015, 14:05
  4. Универсальная функция для обмена с устройствами OwenIO и всеми любимый LabView.
    от Алексей Крагель в разделе Помощь Разработчикам
    Ответов: 0
    Последнее сообщение: 30.05.2014, 13:38

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •