Стартовая страница › Форумы › Понять, как работает ПО › Формулы › Отправка набора байт через Модуль упр.
- В этой теме 23 ответа, 2 участника, последнее обновление 2 года, 9 месяцев назад сделано
Mikhail.
-
АвторСообщения
-
13.09.2023 в 22:20 #29760
manjey73УчастникНу собственно формулы Val() и SetVal(n, Cmd) должны уметь корректно работать в зависимости от типа данных канала.
Либо под каждый тип должны быть аналоги формул, типа LVal(), SVal(), HVal() так же и формулы для выходного канала.
14.09.2023 в 14:12 #29763
MikhailМодератор> В канале все равно ведь хранится double
Да> Либо под каждый тип должны быть аналоги формул, типа LVal(), SVal(), HVal()
Наверное. На данный момент нужно их самому написать в таблице скриптов. Берёте значение как double, разбираете на байты и собираете затем в long. Это новая тема, ещё никто не пробовал 🙂Посмотрите BitConverter.ToInt64(buffer, index)
14.09.2023 в 14:16 #29765
manjey73УчастникНу после пары часов непонимания, так и пришлось сделать, разбирать и собирать.
Просто Val() и SetVal интегрированы в систему и переходя с 5-й версии, где все и всегда было double надо было как-то позаботится об этих формулах, так как в 6-й добавились типы данных канала. А учитывая, что чтобы не возвращал в канал, все преобразуется в double. Будь то long или byte или bool
14.09.2023 в 14:21 #29766
manjey73Участникдля типа данных Integer, аналог Val()
public long LVal() { byte[] m = BitConverter.GetBytes(Val(CnlNum)); long ml = BitConverter.ToInt64(m, 0); return ml; }Ну и извращенная формула изменения одного байта с преобразованием из dec в bcd
с контролем вводимого числа и сразу заданием остальных байт.public double SetEngCommXYE(double cmd) { if (cmd < 16 || cmd > 32) throw new Exception("Значение должно быть в пределах 16 - 32"); byte[] m = new byte[] {0x88, 0x01, (byte)DecToBCD((int)cmd) , 0x00, 0x00, 0x00, 0x00, 0x00 }; double ml = BitConverter.ToDouble(m, 0); SetVal(CnlNum, ml); return ml; }Вот из-за того, что SetVal работает так же с double опять же дополнительные преобразования…
Хотелось бы, чтобы подобные формулы работали с учетом типа данных канала из коробки.
14.09.2023 в 14:25 #29767
manjey73УчастникSetData(n, val, stat) double Установить текущее значение и статус входного канала n
Вот пример, почему бы данной формуле логически не называться SetValStat
А SetData логически правильнее работать по аналогии с SetVal только записывать в канал массив байт ????
Уже было бы чуть правильнее и логичней.
15.09.2023 в 12:10 #29770
MikhailМодераторНужно будет добавить функцию получения long в шаблон проекта.
Где можно найти код функции DecToBCD?почему бы данной формуле логически не называться SetValStat
Потому что данные канала состоят из значения и статуса.
Учитывая возможно перегрузки параметров функций, можно использовать одно и то же название функции для разных наборов аргументов, что упрощает запоминание.15.09.2023 в 12:19 #29772
manjey73Участник// Конвертирование числа из десятичного в BCD формат public static int DecToBCD(int dec) { int num = 0; int num1 = 0; while (dec != 0) { num = num | dec % 10 << (num1 & 31); num1 += 4; dec /= 10; } return num; }Когда-то нарыта в интернете и используется в ScadaCommFunc.dll, куда я собираю всякое разное, чтобы не повторять в драйверах.
Ну а так как Сервер не может подключать dll в формулах, пришлось ее перенести в Скрипты.Если нужна обратная, BcdToDec то она так же есть в ScadaCommFunc
15.09.2023 в 12:23 #29773
manjey73УчастникSetData было бы логичнее в рамках сравнения с CmdData, потому что Val аналогичен CmdVal.
Я об этом.
18.09.2023 в 12:26 #29774
MikhailМодераторПожелание по добавлению своих функций через DLL записал.
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.