Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › Ввод значений в различных форматах
Помечено: Modbus, real, преобразование, температура
- В этой теме 19 ответов, 5 участников, последнее обновление 1 год, 10 месяцев назад сделано Mikhail.
-
АвторСообщения
-
13.03.2016 в 18:57 #1668manjey73Участник
Есть команды телеуправления, необходимо вводить значения в различных форматах.
float, double, int (2 байта) и так далее.В форме только два варианта, строка и 16-чные данные.
Как реализовать ввод необходимых типов ?14.03.2016 в 11:15 #1671MikhailМодераторНа мой взгляд, нужно вводить в виде строки, а затем в формуле её преобразовывать.
Чтобы внутри формулы получить введенную оператором строку используйте:string s = Encoding.Default.GetString(CmdData);
14.03.2016 в 12:47 #1678manjey73УчастникВ формулах создал так, сервер при таком варианте загружается без ругани.
public short StringToInt16 (byte[] val)
{
string s = Encoding.Default.GetString(val);
short num;
Int16.TryParse(s, out num);
return num;
}В Администраторе на канале управления указываю использовать формулу и StringToInt16(CmdData) и получаю ошибку
2016-03-14 12:36:04 <VHPC><система><ERR> Ошибка при компилировании исходного кода формул:
Строка 457, колонка 101: error CS0029: Неявное преобразование типа «int» в «byte[]» невозможно
Для ознакомления с исходным кодом см. файл C:\SCADA\ScadaServer\Log\CalcEngine.cs14.03.2016 в 14:10 #1680manjey73УчастникВ общем я так понял, поле команды может быть либо double (CmdVal, Cmd), либо байтовый массив (CmdData). То есть Коммуникатор или кто должен получить данные для отправки в одном из двух видов ?
Заработала функция
public byte[] StringToInt (byte[] val)
{
string s = Encoding.Default.GetString(val);
short num;
short.TryParse(s, out num);
byte[] buf_out = BitConverter.GetBytes(num);
if (BitConverter.IsLittleEndian)
Array.Reverse(buf_out);
return buf_out;
}И формула в канале управления
StringToInt(CmdData)Одно непонятно, почему пришлось переворачивать младшим байтом вперед ?
Ввод соответственно в строковом виде.
- Этот ответ был изменен 8 лет назад от manjey73.
14.03.2016 в 14:13 #1681manjey73УчастникИ вопрос как защититься от неверно введенного значения ?
Try.Parse позволяет при неправильном значении выдать 0 на выход, а значение не должно быть нулевым, например если 0, то не менять ничего.14.03.2016 в 16:44 #1683MikhailМодераторДля стандартных команд формула должна возвращать double,
для бинарных — byte[]Вы можете использовать if (int.TryParse(…)) {…}
Если Вы вернёте double.NaN или вместо массива null, то команда не будет передана вообще — это ответ на вопрос о защите от неверного значения.14.03.2016 в 17:11 #1684manjey73УчастникC защитой понятно.
С командами с одной стороны вроде как тоже, только при выборе типа команды «Стандартная» как вводить значения ? такого функционала я так понял нет.Как вообще предполагался ввод значений, кроме Вкл/Выкл в том же Modbus ?
14.03.2016 в 18:30 #1685MikhailМодераторВариант 1. Указать номер канала управления для входного канала
Вариант 2. В Редакторе схем или таблиц указать канал управления.
Это позволит отправлять команды с помощью специальной формы отправки команд и вводить на ней значения. Значения могут быть как тестовыми, так и из списка.
Для ввода значения текстом не поле значений команды нужно оставить пустым.29.08.2016 в 13:24 #2955ds.zaycevУчастникОпрашиваю контроллер по modbus, мануал по устройству обещает Input Registers в ячейке A021 (это вроде как 40993+1) хранить температуру, в формате real с диапазоном -60 200 гр. Цельсия. Не понимаю:
1. как настроить шаблон modbus
2. как преобразовать эти чудовищные цифры в градусыСудя по тому, что адреса в описании modbus идут через 2, то тип должен быть 4 байта… Получил я нечто, а как его в градусы преобразовать? Получается что обычного деления и умножения недостаточно? Нужна какая-то особая формула?
- Этот ответ был изменен 7 лет, 7 месяцев назад от ds.zaycev.
29.08.2016 в 14:33 #2957manjey73Участникds.zaycev попробуйте переставить байты при обработке запроса.
2 регистра это 4 байта = float (real)29.08.2016 в 15:16 #2958djbond07УчастникЕсли он хранит в Real, то скорей всего это и есть температура. Если значения не сходятся с реальными, то нужно делать преобразование. Берём устройство для измерения температуры, делаем 2 замера с разными показаниями. Получаем 2 точки, по ним строим калибровочную прямую, получаем уравнение прямой и вбиваем его в дорасчётный канал. Так что формула обычная. Но тут скорей всего дело в другом чём-то.
29.08.2016 в 17:57 #2960MikhailМодераторПорядок байт задаётся в Модбас-шаблоне в Коммуникаторе. Подбирается экспериментальным путем. Кроме того, в интернете есть онлайн сервисы для перевода HEX во float, на них быстрее попробовать. Полученные от устройства HEX данные можно извлечь из лога с помощью modbus.rapidscada.net
11.05.2022 в 11:37 #23421ed_tmbУчастникЗдравствуйте, командой нужно записать значение float.
Какую формулу нужно указать в таблице команд для КП?11.05.2022 в 15:24 #23424manjey73Участник@ed_tmb в последних драйверах Modbus вроде не нужны формулы а просто должно быть указан тип переменной в команде.
12.05.2022 в 08:27 #23427ed_tmbУчастникверсия программы 5.5.2.2. Мне нужно установить более новую версию rapid scada?
https://yadi.sk/i/mlwlRR_2P83tSg- Этот ответ был изменен 1 год, 10 месяцев назад от Mikhail.
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.